Perlコーディング初心者質問スレ Part 53
1 :
nobodyさん :
2006/11/26(日) 14:38:23 ID:SlmGsFMB
5 :
nobodyさん :2006/11/26(日) 14:51:35 ID:tkb0DDKs
6 :
1 :2006/11/26(日) 17:42:11 ID:???
貼り順まちがいた...orz
jcode.plでutf-8→eucの変換って行えないのでしょうか? jcode::convert(\$Line,'euc');
UTF8非対応だから
いい加減Jcode.pmなりEncode.pm使おう
2chのように、時間に22:27:00:00まで表示するにはどうすれば良いのでしょうか?
表示されてないお
>>11 VIPでは00:00:00:00まで出るよ
13 :
◆TWARamEjuA :2006/11/27(月) 00:03:22 ID:??? BE:2614346-BRZ(6677)
00:00:00.00ですね♪ Time::HiRes 使ってるです♪
15 :
nobodyさん :2006/11/27(月) 01:47:56 ID:VGuJADoD
あぁ、そんな無駄なことに貴重なCPUサイクルを消費して・・・
関数のエラー時の戻り値って何にしてます? 0や-1を返す場合が多いと思いますが、undefにしない理由って何かあるんでしょうか。 undefなら0と同じくfunc() or dieなんて呼び方もできるし、undefの可能性ありと 常に思っておけばprint func()なんて不用意に書かなくなるかなと思ったんですが。 use warningでundefをprintするなと大量に警告されて、関数の書き方間違ったかなと 思ったりしました。
undefを返せばいいと思いますよ 私は以前から 0 or DATA で返してるので、今からそのクセを治すのに苦労しそう・・・
undef 一択
return (); なんて記述もよく見かけるけど、これは ・リストコンテキストなら空リスト ・スカラコンテキストならundef になるって事でおk?
return (); と return; の違いはなんじゃらほい?
2chの30秒規制みたいなのをつけたいんですが どのようにすればいいでしょうか?
23 :
nobodyさん :2006/11/27(月) 16:26:08 ID:w7/znFw6
cookie
>>21 横だけど、
処理を意識して書くか perl に任せるかの違いじゃね?
呼び出し元にとってみればどっちも同じ挙動でしょ。
配列にundef代入したら要素数==1
crypt (angokashitaimoji,'$1$$'); ↑このようなほうほうで暗号可したのですが アルファベットのほかに、どのような記号が使われるのでしょうか? リストがのってるサイトがあったらお願いします。
お聞きしたいのですが CGIファイルの中身って見ることってできるんでしょうか? HTMLは見れますが CGIの中身って見れませんよね? CGIの中身というのは、.cgiファイルのうp前の状態です。
鯖の設定によっては見れる
>>33 返信ありがとうございます。
どのような設定をすれば見れなくできますかね?
有料鯖なのですが
わたしでもその設定はいじれるのでしょうか?
.htaccessで または全ディレクトリにindex.htmlを
CGIのソースの読める読めないはindex.htmlがどうとかそういう問題とは違わないか?
とりあえず
>>34 の使っている鯖がCGI可なのかどうかが問題だ。
そういえばちょっと前にCGI不可の鯖に.cgiで置いてソース晒してた椰子が居たなあ…。
37 :
16 :2006/11/27(月) 22:21:07 ID:???
みなさん、どうもありがとうございます!
特に
>>25 ,
>>26 ありがとう
今日まさにこんなことやりそうになってました。undef返したら真なんですね。
(@array = &func()) or 〜
return;と書くとリストコンテキストでは空の配列を、スカラコンテキストでは
undefを返す、つまり
return wantarray ? () : undef;
と書くのといっしょってことですね。危うく間違った理解で突き進むところでした。
undefを返すなら、definedでチェックするようにしようぜ
>>35-36 どうもありがとうございます。
.htaccessで設定できるのでしょうか?
やりかたがのってるサイトが見つからないので
よかったら教えてください
>>39 その前にちゃんとCGIが動く鯖なんだろうね?
それなら適切にパーミッションを設定してやれば ブラウザでアクセスしていきなりソース丸見えという事はないと思うよ。
とりあえず実行属性つけちゃえば問題ない
>>42 ブラウザというのは、「IE」や「Sleipnir」のことでしょうか?
>>43 やってみます。
知識が底辺過ぎるし、スレ違いというか板違いなので終了
46 :
16 :2006/11/27(月) 23:35:54 ID:???
昔、CGIのソース丸出ししたことあるなあ。当時は原因不明だったけど、 大方htaccessの設定だったんだろうなあ。下記とかかな。 AddHandler cgi-script .cgi
htaccessを無視するのか おまえ酷すぎ
httpd.confであってるんだけど、レンタルサーバだといじれないので、 httpd.confの設定をhtaccessで上書きするってこと。 全然はずしてるかもしれないけど、CGIは基本的にcgi-bin内で実行、 それ以外はhtaccessいじってね、っていう仕様なのかもね。
ほぉほぉ
ありがとうございます。
52 :
nobodyさん :2006/11/28(火) 00:45:28 ID:5n8a+rNm
文字列の入った変数中に、指定した文字が ある場合true、ない場合falseを返す変数があったら教えてください。
index
どうしてもTRUE|FALSEでほしいなら自前の関数でラッピングしてください
return undef;の話はPerlベストプラクティスに載ってるね。
<FORM action="a.cgi" method="POST"> #いろいろな項目入力 <INPUT type="submit" value="実行a"> </FORM> 実行aボタンを押すと、a.cgiが実行されますが、 実行aボタンを押して同時に下のb.cgiを実行する 方法ありますでしょうか。 <FORM action="b.cgi" method="POST"> #いろいろな項目入力 <INPUT type="submit" value="実行b"> </FORM> a.cgiの処理コードの中に、b.cgiの処理コードを 書くぐらいしか思いつきません。 よろしくお願いします。
57 :
nobodyさん :2006/11/28(火) 05:30:21 ID:PG2nYwJ4
こんな時間にすいません。誰かいたら教えて下さい phpで例えば<?php include("○○.php"); ?>というのがあります。 これは○○.phpを上の記述を書いたphpに表示させることができます。 perl(cgi)も同様なことできますでしょうか? index.cgiにabc.cgiを表示させたいんですけど。 やり方ありましたら教えて下さい m(_ _"m)ペコリ
>>56 一つの体で、別々の場所に行く電車に乗れますか?
自分で思いついた方法で大丈夫です。
>>57 つ require、or module
>>58 レスありがとうございます
軽くしらべてみたんですが難しいですね
それでできればいいんですが・・・
がんばってみます
チャクラが人並以上に必要だってばよ
@grepedarray = grep(/^[A-Z]/,@array); こういう文に置換 - s/ / / -を組み合わせたいのですが出力が上手く表示できません どうしたらよいでしょうか?
ようわからんが map も使えば?
@grepedarray = map { /^o^\ } grep(/^[A-Z]/,@array);
ちょw 誰が フッジサーン 使えと言ったwwwww
map {push(@grepedarray) if(s///);} @array; これでもおk?
67 :
66 :2006/11/28(火) 15:21:19 ID:???
連投すまん push(@grepedarray) じゃなくて push(@grepedarray, $_) じゃないとだめかも
それならforeach使えばいいのに。
ごめん、「ダメ」はいいすぎた。あくまで「おすすめできない」って事でひとつ・・・
素直に block で @grepedarray = grep { s/ / / ; /^[A-Z]/ } @array ; @grepedarray = grep { $flag ++ if /^[A-Z]/ ; s/ / / ; $flag } @array ; じゃ駄目なのか?(適当に書いたが)
取得しない値まで置換とかする必要ないだろ・・・常識的に考えて・・・
73 :
71 :2006/11/28(火) 21:17:03 ID:???
>>72 そうだ罠。(実際書く時には当然もっと丁寧に if 文書くけどさw)
ただ @array に grep でアクセスした後、map or foreach で
アクセスするなら実質 2 回のループなわけで…。
そっちも十分に無駄っぽいよね。
そんな事言ってたらPerlでプログラミングできませんよ(´・ω・) もっと富豪的に
grep 使ってる時点で十分富豪w
76 :
◆TWARamEjuA :2006/11/28(火) 22:00:53 ID:??? BE:1089825-BRZ(6677)
@grepedarray = grep { /^[A-Z]/ ? s/ / / ? 1 : 1 : undef } @array;
ここらへんで誰かが Bench ってくるとエスパー
ふと思ったんだが、処理速度のbenchならBenchmark.pmだけど メモリのbenchってどうやんだ?やる方法ある?
>>76 そう来るならこっちの方がもっとスマート
grep { /^[A-Z]/ ? s/ / / || 1 : undef } @array;
だったら grep { /^[A-Z]/ and s/ / / || 1 } @array; でもいくね?
そうデスorz...
>>82 > Memchmark.pm
ああ!それがあったか。試してみよ。THX!
84 :
nobodyさん :2006/11/29(水) 00:11:52 ID:YenD9j36
25桁*1000万件の重複しない数値データをcsvファイルに格納させるため、 以下のようなプログラムを書きました。 my %no; for (my $cnt = 1; $cnt <= 10000000; $cnt++) { my $s_no = main::create_no(); $no{$s_no} = 1; if(!open(FH, ">>./no.csv")){ print "Error " . __LINE__ . "\n"; exit; } flock(FH, 2); print FH $s_no . "\r\n"; flock(FH, 8); close(FH); } create_no内では if(not exists $no{$c_no}){ return $c_no; } このようにハッシュのexsistsを使用して重複チェックをかけているのですが、 やはりメモリを大量に消費してしまうため、900万あたりからものすごい時間が かかってしまいます。 効率的な方法があればどうかご教示ください。 恐れ入りますが宜しくお願いいたします。
25桁で連番で1000万件書き出す 桁数が決まってるのでバイナリアクセスで filepos1 = rnd * 総レコード数 filepos2 = rnd * 総レコード数 この pos1 と pos2 を入れ替え あとは好きな回数だけswapすればいいかと思います すべての件をメモリに保持しないので仕様メモリは極小で済みますが、 ディスクI/O がかなり発生します。
>>85 ご教示有難うございます。
この方法ですと、1000万回ファイルを読み込む、という
解釈で宜しいでしょうか。
50万回シャッフルする場合は 1000万回ライト 50万回シーク 50万回リード 50万回シーク 50万回ライト って感じです
>>58 お礼すごい遅れました。
ありがとうございました。
>>62 です。
みなさん色々ありがとうございました。
@grepedarray = grep { /win/ and s/win/BIG/ } @array; $cnt = grep(/win/,@array); print "大文字\n@grepedarray\n計$cnt個\n"; この文で$cntの部分が 計0個とでてしまんですが何が問題なんでしょう?
>>91 grep{} 内の $_ は元 array の要素のエイリアスだから、
一行目にて $_ を直接変更してしまっている。それがやなら
@grepedarray = map { $foo = $_ ; $foo =〜 s/win/BIG/ ; $foo } grep { /win/ } @array ;
てなかんじで map 中で $foo にいったん代入してから変更する事
ちなみに上の map 中の $_ も @array の要素のエイリアス( s/// したら変更されちまう)
map っていまいちつかいどころ分からない ブロックで囲っちゃえばいいじゃんとか思うのだが
×一行目にて $_ を直接変更してしまっている。それがやなら ○一行目にて元要素を直接変更してしまっている。それがやなら
>>92 さん
ありがとうございます。理解できました。^^
>>93 例を挙げるとシュワルツ変換には必須。
my @array = ( '1,2', '2,1' ) ;
my @sorted = map { $_->[0] }
sort { $a->[1]<=>$b->[1] }
map { [ $_, (split /,/, $_ )[1]] } @array ;
上を普通の for 文で書くと捨て array を数個書くはめになり、7 行以上になることは確定。
とは言いながらも使うかどうかは完全に趣味の問題
>>93 何を抜かしてるのかと思ったら、ここ WebProg 板なのね…。
>>93 たとえばだけど、ハッシュを引数に取るサブルーチンに
foo( map { $_ => $hash{$_} =~ /^\d+$/ ? $hash{$_} * 2 : "str".$hash{$_} } keys %hash);
などと使えて便利。
99 :
◆TWARamEjuA :2006/11/30(木) 07:00:27 ID:??? BE:436122-BRZ(6677)
my $Now_date = sprintf qq|%04d/%02d/%02d|, # 日付を生成 map { $_->[0] += 1900; $_->[1]++; @$_ } [(localtime)[5,4,3]];
>>99 …さすがにそれは普通に sub に渡すだろ
my $Now_date = sprintf qq|%04d/%02d/%02d|,
sub { $_[5]+1900, $_[4]+1, $_[3]}->(localtime) ;
もしくは
my $Now_date
= sub{ sprintf qq|%04d/%02d/%02d|, $_[5]+1900, $_[4]+1, $_[3]}->(localtime) ;
>>9 Jcode.pm は知らんけど、Encode.pm は重い。
一般的な掲示板CGIで use Encode; しただけで、2〜3割CPU負荷が高くなった。
ファイルを開く時に、 open(FILEHANDLE, ">> filename") ; という書き方をしますよね。 この書き方はファイル名がダブルクォーテーションで囲われないのでいまいち好きになれません。 例えば、ファイル名が " test.txt" (半角スペースが左にある) だった場合にはどうすればいいんでしょうか?
>>102 open(FILEHANDLE, ">>", " test.txt");
殆どの解説サイトでは、フォームの要素を取り出す場合などに、 use CGI; $q = new CGI; print $q->param('name'); と解説していますが、 use CGI":all" print param("name") というコードを見つけました。(両方ともXSS脆弱性がありますがこれはサンプルです。) 後者だと関数名の重複が起こる可能性が高くなるかと思いますが、 速度低下などのデメリットはないでしょうか?
105 :
102 :2006/11/30(木) 11:11:04 ID:???
>>103 カンマで区切って3つめのパラメーラーにすることも可能でしたか
そっちの方が美しいので全部をそっちに統一しようかとおもいます
ありがとです
>>104 速度はどうせ全体からすれば誤差ぐらいしか違わない。
むしろ関数名重複の方の問題でいまどきは普通使わない
書き方だから、既にそういう風に書かれているプログラムを
読まなきゃいけないならしょうがないが、これから書くのなら
前者の書き方にしとけ。
107 :
104 :2006/11/30(木) 11:27:47 ID:???
>>106 なるほど。
見た目は美しくなくなりますが、パッケージ同士で同じ関数名が使われていたら困るのでそうしてみます。
ありがとうございました。
Perlスクリプトの処理時間を計測したいのですが、 (times)[0]を使うやり方で出てくる数値が、実時間と違うような気がします。 これで求められる時間の単位は何なんでしょうか?
CPU秒
Benchmark 使えばいいじゃん
>>93 map はあるリストを元にして別のリストを作るために使います。
もちろん、map を利用しなくてもプログラムは書けますが、map を利用したほうがすっきりと書けることが多いのです。
@odds = (20, 16, 4, 8, 12);
print_odds(map { $_*2 } @odds);
@ids = qw[mami pelsia emi yumi];
@names = map { $userinfo{$_}{name} } @ids;
>>100 むしろ、strftime
>>101 多く起動される環境であれば、mod_perl, SpeedyCGI, FastCGI を検討するべきかと。
たしかに Encode は重いけど…
% /usr/bin/time perl -e ''
0.00 real 0.00 user 0.00 sys
% /usr/bin/time perl -MEncode -e ''
0.07 real 0.01 user 0.01 sys
Perl v5.8.1以降であれば、JcodeはEncodeのwrapperとして動作するので、Encode単体より重くなります。
>>102 open FH, "> ./ filename"; としても良いです。
COOKIEについて質問です。 今まで、COOKIEが有効かどうかって、 x.cgiでCOOKIEセット、y.cgiに飛ばす y.cgiでCOOKIE読んで、書き込みできたかチェック こんなことしてました。 COOKIEが有効か調べる関数ってありますでしょうか。 よろしくお願いします。
>>107 個人的な嗜好の問題だけど俺は前者の方が美しいと思う
ちょいと質問させてください。 my %func = ( '1'=>'\&hoge', ); sub hoge { 処理 } $func{'1'}->(); ぐぐってみたらこれでhogeが実行できる みたいなことが書いてあったんですが ダメみたいなんすよ。 なぜかわかりませんかねぇ?
>>114 '1'=>\&hoge
の間違いでしょう? クォートしちゃダメ。
ありがとうございやす!動きました。 ぐぐって見つけたページもクォートなしでした。 いやはやお恥ずかしい。
明らかに文字列を受け取って文字列を返す関数にundef渡したとき、 戻り値はundefと0文字列のどっちが安全で親切なんだろうか。 ケース倍ケースかな。
お願いします。 sub aaa{ my $select; foreach my $l(sort { $ir{$a} <=> $ir{$b} } keys %ir){ $select .= qq|<option value="$count">$l</option>\n|; } return $select; } 上記をCGIで動かすと 「Can't use "my $a" in sort comparison at ...」 というエラーがでます。どう改善したらよいのでしょうか... 環境は windowsXPsp2 ActivPerl 5.8.7 です。
use strict; my %ir = ( 'kaede' => '大瀬 楓', 'mikitty' => '藤本 美貴', 'maasa' => '須藤 茉麻' ); foreach my $l (sort { $a cmp $b } keys %ir){ print "<option value=\"$l\">$ir{$l}</option>\n"; } うちではエラー出ず。 で、ちょっと突っ込みを key で sort 掛けようとしてるんですよね? なのにデータで sort 書けちゃってますよ?
>>119 はい。
以下のようなハッシュを値でソートしたいと思いまして・・・。
%ir = (
"あああ" => 1,
"いいい" => 2,
"ううう" => 3,
"えええ" => 4,
"おおお" => 5,
"かかか" => 6,
"ききき" => 7
}
.pl単体では上手くテストで動いたんですけど、いざCGI用に
コピーするとエラーがでます(T_T)
>>118 $count はどっからでてきたの? パッケージ変数? $ir{$l} の間違いじゃない?
それに、『sort に渡してる関数の中で「my $a」とは書けません』ってエラーなんだから
実際の CGI ファイルのコードは違うんじゃないの? ちゃんと確認した?
>>111 > むしろ、strftime
POSIX::strftime か。しらなんだ、とんくす。
Shift_JIS 環境です。 CGI.pm の escapeHTML 関数を使うと、「規制」 が 「&#8249;K制」 (実際には、&と#は半角) になっちゃうんですが、 どうにかならないものでしょうか…。 これじゃあ、日本語を処理する上で実用性が無いので困っています。
124 :
123 :2006/12/01(金) 11:01:25 ID:???
というより、何故こんな風になるのかが知りたいです。 HTMLの特殊文字は↓ですよね。 < = 0x3C > = 0x3E & = 0x26 " = 0x22 ' = 0x27 そして、問題となる "規" は、0x8B4B です。 特殊文字にあたるコード(16進レベル)が含まれていないので、 おかしくなる理由がないと思うのですが…。
>>123 CGI.pmを読めばわかるが、charsetがISO-8859-1かWINDOWS-1252のときに
その変換が行われるようになっていて、charsetは特に指定がなければISO-8859-1
だからほっとくとそうなる。CGI.pmのescapeHTML使うんならcharset設定すればよい
と思われる。あるいは別のを自分で書くなりどっかから探してくるなりして使うかだな。
データベース検索のCGIを作っているのですがサーバ負荷(CPU)が高くて困っています。 ファイル数は200個、容量は全部で40MB程のテキストファイルで、ファイル数と容量はだんだん増えていきそうです。 数回実行しただけで Load Average が 1.00 を超えるような状況で、このままじゃサイト閲覧者向けに公開できそうにないです。 データベースの構造はこんなこんな感じです。 要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい) 要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい) 要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい) 要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい) ちなみに、検索処理には index 関数を使っています。 ファイル内容は一回変数にいれるといったことはせずに、openでよみとって 1行ずつ検索して、おわったら閉じる。openでファイル開いて・・・ の繰り返しです。 負荷の原因と考えられるのはどこらへんでしょうか? (1) 200個 のファイルを open 関数で開く処理。 (2) index関数での検索 ちなみに、必要なのは要素1と要素2だけ、しかも、完全一致でいいので、 split関数で要素毎に分割して == を使って等しければー、にしたほうが負荷は少なくなるもんなんでしょうか? ある程度絞り込めれば実験でもいいんですが、 負荷関係に詳しい方がいたらお願いします。
127 :
123 :2006/12/01(金) 11:21:25 ID:???
>>125 回答ありがとうございます。
charset指定というのはどんな感じにやるもんなんでしょうか?
use Encode 風に指定して、
use CGI 'sjis';
use CGI 'shift_jis';
とかやってみましたが、駄目だったようですorz
>>121 sub aaa{
my $count = 1;
my $irselect;
foreach my $l(sort { $ir{$a} <=> $ir{$b} } keys %ir){
next if ($l == 99);#("99"=>"99")というデータを省く
$irselect .= qq|<option value="$count">$l</option>\n|;
$count++;
}
print<<"_EOT";
.
.
<select>
$irselect
</select>
.
.
_EOT
}
こんな感じです。
一応並び順を考えない仕方で解決しました。
もう少し自分で調べてみます。ありがとうございました。
>>127 キーワード教えてもらったんだからマニュアルぐらい読めよ...
Provided that you have specified a character set of ISO-8859-1 (the
default), the standard HTML escaping rules will be used. The "<" char-
acter becomes "<", ">" becomes ">", "&" becomes "&", and the
quote character becomes """. In addition, the hexadecimal 0x8b
and 0x9b characters, which some browsers incorrectly interpret as the
left and right angle-bracket characters, are replaced by their numeric
character entities ("?" and "?"). If you manually change
the charset, either by calling the charset() method explicitly or by
passing a -charset argument to header(), then all characters will be
replaced by their numeric entities, since CGI.pm has no lookup table
for all the possible encodings.
charset()メソッドを使うか、header()に-charset引数を渡せばいいらしい。
130 :
123 :2006/12/01(金) 11:35:16 ID:???
>>129 ご親切にありがとうございます。
次からなるべくマニュアル読むようにします。
131 :
123 :2006/12/01(金) 11:39:27 ID:???
実際に使ってみたら解決しました。 $CGI->charset('Shift_JIS'); ありがとうございました。
132 :
126 :2006/12/01(金) 11:43:37 ID:???
133 :
126 :2006/12/01(金) 11:47:52 ID:???
勘違いでしたorz while (my $line = <IN>) の部分もコメントアウトしてました。 これを外したら、0.6秒ぐらいに…。 膨大なデータを1行ずつ読み込む、ここが負荷のメインだったようです。 こうなると、namazuとか他の言語を使うぐらいしか負荷削減の方法はないですね。
>>126 毎回40MBあってこれからもどんどん増える予定のファイルを全部なめるのがそもそもだめ。
もう少しデータの持ち方を工夫した方がいいよ。バークレーDBぐらいはせめて使え。あるいは
インスコ面倒でなければまともなDB(mysqlとかpostgresとか)つかっちゃったほうが楽な気も
する。
135 :
126 :2006/12/01(金) 11:54:15 ID:???
>>134 なるほど
DB使ったほうがいいわけですか…
それは思いつきませんでした
実はこれフリーで配布されているCGIスクリプトのログファイルでして
過去ログも含めた検索をやりたいのでその検索スクリプトを自作していたとこなんです
ログファイルをHTML化して namazu かなんかで検索させるのとDB化、両方を検討してみます。
read(FH, $buff, (-s FH)); でログを読んだときは負荷減りませんか?
ファイルを全部読む時点で負けだろ
138 :
126 :2006/12/01(金) 12:42:32 ID:???
>>136 サンクスです。
読み込んだ時点の負荷は 1/3 〜 1/2 程度になりました。(でも1行ずつの処理を加えると同じかそれ以上になるかも…)
ただ、変数 $buff には全データが入っていることになるので、これを1行ずつ処理するときにどうすべきかが悩みます。
split 関数 で改行コードでの分割をして、配列にいれてから、while 関数で1行毎に処理したくなりますが、
これだとメモリ山ほど食いそうですし…。
>>126 >>134 に禿同です。
検索対象が決まっているのなら、その元のデータから検索用のデータ(インデックス)を作るプログラムを作り、
定期的に保守をするのが楽です。この処理自体が多少重くても、バックグラウンドで1日数回で済むのなら
いいのではないかと。
インデックスデータは、DBMに持たせる(検索対象文字列をキーにする)のが一番効率がいいと思います。
プレーンテキストでも、元のデータを丸々スキャンするよりはるかにましです。
140 :
126 :2006/12/01(金) 13:43:25 ID:???
>>139 やはりその方法がベストですよね。
データベースの勉強をしてやってみようかと思います。
ありがとうございました。
正規表現で、エスケープをつけて表す文字は + * ? . ( ) [ ] { } | \ らしいのですが、/もですよね? if($aaa =~ /\//) とすれば望みどおりの動作をするのでこう思うのですが、間違ってますか?
/そのものじゃなくて区切り文字 当然要エスケープ
でも区切り文字変えたほうが読みやすいと思う $hoge =~ m{/}
>>145 そんなに大変な事だったんですか。
どこかを書き足すだけで解決できると思ってたのですが、大変そうなので諦めます・・・。
申し訳ありませんでした。
<FORM action="xxx.cgi" method="POST">
<INPUT type="submit" value="送信">
</FORM>
これを送信ボタン押すとPOST形式で送信されると思いますが、
プログラムが自動でPOST送信する方法ありますでしょうか。
GET形式の場合は、"
http://xxx/xxx.cgi?xxx=xxx "
wget すればよいでしょうか。
よろしくお願いします。
>>147 GETの場合そのとおり。「送信」はURL encodeしる。curl なら
curl -d xx=送信(URL ncodeしる) "
http://xxx/xxx.cgi "
でPOSTできる。ってかここperlスレなんだが。
LWPでもできるよ。
>>147 LWPっていうモジュールがあったんですね。
こういうのが知りたかったんです。
ありがとうございました。
WindowsでCGIを作っています。 GDで日本語文字列を出力したいのですがうまくいきません。 現状、stringTTFメソッドでTrueTypeフォントのパスを指定してるのですが(WindowsのFontsフォルダ内) エラーは出ないものの「・・・」といった出力にしかなりません。英数字でも同様です。 Winで画像出力の際にbinmodeを指定するような感じで 何かあるのかも、と思って調べてるのですが・・・ ちょっと漠然としていますが、チェックポイントなど気がついた方いましたら おしえてください。よろしくおねがいします。
自作の関数で、エラーのときにエラーメッセージを返したいときに、 $@とか勝手に上書きしたらまずいですか? #やってみたらできましたが・・ 何か専用の特殊変数ってありますか?
$gErrStr のようなエラー用のグローバル変数を用意するか、 my $err = &testfunc(\$ret, \$val1, \$val2); のように渡して、戻り値は \$ret へ入れて、エラーコードとこエラー文字列は $err に返す といったことも出来る エラー無しの場合は $err は undef であるか "" または 0 です。
どうもです。 関数はモジュール化したいので、自前のグローバル変数は使いたくないんですよねえ。 しかもオブジェクト指向にしたいんですが、returnでエラー返す以外に 定番の方法ってないですか?
エラーメッセージを取得するメソッドを定義するとか、Error.pm使う前提で例外に しちゃうとか。
Perlはそんなに厳密にオブジェクト指向で書ける言語じゃないよ。そういうのが希望なら、RubyとかJavaやった方がいい。
うーん、どうしようかなー
>>153 結果をオブジェクトで返したらどうか
正常ならnew HogeResultして情報をそれに格納し、そのリファレンスを返す
エラーなら文字列を返す
受け取り側は
my $res = getHoge($foo);
if (ref $res) {
# 成功
} elsif {
# 失敗
}
ほほう、ref関数の使い方を初めて知った。 ありがとうございます・
いくら勉強しても次々に知らないことが出てくるんですが、 Perlをすべて把握している人って世の中にいるんでしょうか。 オライリーさん以外に。
そんなの誰もいないだろ。PerlコミュニティはLarryでも把握しきれない規模だろうから。 たとえばEncodeだけに限っても、メインのメンテナーのdankogai以外にも何人もかかわってる。 個人ですべてを把握するのは無理じゃないか? # オライリーさんって誰? Tim O'Reillyのことか?
オライリーオライリー♪ ワタシニ電話シテクダサイ ドーゾヨロシク♪
ごきげんよう。
>>112 ない。Cookieが読み込まれていない場合でも動作するように書くべし。(エラー出して終了でもいいけど。)
>>117 個人的には undef が好み。処理によっては結果的に空文字列を返すこともあるから、undef に統一しておいたほうが分かりやすい。
>>135 HTML化して、Googleに検索させる作戦もあり。自前でやる場合は他の方が書かれている通り。
>>141 迷ったら、記号類はとりあえず \ を前置しておけばOK。記号類 → \ をつけた場合、それがメタ文字であってもそうではなくてもその文字自身を表す。
英数字 → \ をつけた場合、メタ文字になる場合がある。
>>151 問題ない。やりたまえ。
>>151 ,154
多くのモジュールでは error みたいなメソッドを定義していますね。んで、そのメッセージを格納しておくにはグローバル変数を使っているわけですが。
グローバル変数 == 悪 というわけではないので、ホゲホゲ。外部から隠蔽したいなら、
{ my $ERRORMSG; sub _set_error { $ERRORMSG = "@_" } sub error { $ERRORMSG } }
こんな感じ? さらに、_set_error も隠蔽したいなら、
{ my $ERRORMSG; my $_set_error = sub { $ERRORMSG = "@_" }; sub error { $ERRORMSG } sub hoge { $_set_error->("hoge"); return undef; } }
連続投稿10秒規制を付けたいのですが どのようにすれば良いでしょうか? if(現在の時間 - 最終投稿時間 < 10秒)er{エラー} このような感じでしたいのですが 最終投稿時間の取得はどのようにすれば良いでしょうか?
クッキーか、最新投稿100件ぐらいを別ファイルに保存 (クッキーが処理できない場合は投稿そのものを拒否)
>>163 いろいろ調べたんだね。えらいぞ。
これはぼくの想像だけど、恐らくは既存の何がしかの Web アプリケーションに機能追加しようとしているんだね。
そしてその機能は(恐らくは同一端末からの)投稿間隔が短くなりすぎないように制限したい、とそういうわけだ。
で、不明点が「最終投稿時間の取得」方法ということだけれど、「取得」というからには保存しているのだろうね。
「現在の時間」は恐らくアプリケーションが動作する機械のシステム時刻なので、そこから取ってくることができるけれど、あなたのアプリケーションにおける特定端末からの投稿履歴は、あなた以外に面倒を見てくれる人はいないはずなので保存しているはず。
保存の目的がそもそも「最終投稿時間の取得」なのであれば、そこから取り出す事も考えていたはずですよね。
あとはそのようにコードを書くだけだよ。がんばって。
>>163 セッション管理しているかどうかで変わってくる。
セッション管理不可な場合、IPアドレスで判断することになるかな。
単純にIPアドレスに対応するファイルを更新して、そのファイルのタイムスタンプと比較するのは簡単だね。
ただし、プロキシ経由のクライアントは一緒くたに判断されちゃうかな。
セッション管理してれば、セッションに関連づけて何らかの方法で更新時刻を保存するんだろうね。
なんか抽象的な答えだな。
色々やり方があると思うんだが、アプリケーションの要件用途で適切な道具は変わってくるからね。
168 :
151 :2006/12/03(日) 10:08:46 ID:???
$@でエラーを返す件、自己レス。evalで呼ぶときには evalが正常時に$@を初期化してしまうので、呼び側で配慮が必要ですね。 sub hoge {$@ = 'hoge'; return} eval '&hoge(); $gERROR = $@'; $@ and die; print $gERROR if $gERROR;
まあ自分一人でしか使わないんだったら御自由にってとこだが
>>168 呼び出し側に配慮が必要って時点で止めないか?普通。
お前さんが体感した通り $@ を書き換えるのはお行儀が悪いし呼出側に負担を強いる。
「ご自由に」と言って頂いている前提で反論しますが、 数件、代案を教えて頂いた限りで、「エラーは$@を参照してくれ」という 取り決めが一番呼び側の負担が少ない気がするのですが、どうでしょう。 $@はevalとバッティングするのでevalの場合のみ168のように書かなければ ならないことは、もし説明がなかったとしても自明なことのように思います。 ほかに$@を使うデメリットってあるでしょうか。
あ、ref関数を参照させるのは行儀もよく、負担も少ないかも知れないとは思います。 だったらそうしろよ、って話なのですが、本当にそれでいいのか、検討しているところです。
>>171 本当に「エラー」ならば Carp or wanings ( $SIG{__WARN__} ) に任せれば?
もしくは誰かがレスした Error.pm
単なる「制御上のメッセージ 」を返したいならば戻り値を下みたいな
ref にしちまえばいいだけじゃねーの?
return { 'data' => undef, 'msg' => 'お前さんの望んだメッセージ' } ;
$@ に関するルールを変更してまで $@ を参照させるってのは傲岸に
感じる。上の例で云うと前者には用意がされてるわけだし、後者は
エラーですらない。
CPAN でそんなモジュールに当った事がないがそういうモジュール
に当ったら、別モジュールを探すなあ。
そういうモジュールがあったら後学のために教えてください。
eval で catch したいなら素直に die したらいいじゃない。 死にたくないなら生きればいいじゃない。
HTMLで、フレーム表示させたいんですが、 どういうふうにすればよいのでしょうか? index.htm(フレームについて書いたページ) ^^^^^^^^^^|^^^^^^^^^^^^^^^^^^^^| メニュー | メインページ | menu.htm | main.htm | | | | | | | | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 普通一ページだけだったら、 print <<"HTML" <html> ・・・ </html> HTML ですよね。 print <<"HTML" #indexを書く HTML print <<"HTML" #menuを書く HTML print <<"HTML" #mainを書く HTML これだけで、OKでしょうか? よろしくお願いします。
>>175 それぞれのxx.htmに対応するcgiを用意する。
複数用意するか、なんかパラメタ与えて動作を
切り替えるかはお好みで。
クライアントからは別々にリクエストが来るので、
情報をひきつぎたければそれもパラメタで引き継ぐ
とかセッション使うとかいろいろ必要。
たぶん質問の仕方からいってこの辺の仕組みは
すぐには理解できないと思うので地道に勉強して
くれ。
つか、フレームは時代遅れ
>>176 ありがとうございます。
ちょっとずつ勉強してみます。
>>177 なるほどぉ。
フレーム使わない方法もありますね。
フレームはstrictじゃないから使わないほうがいい
>>178 で、いつ Perl の話になるんだ?ならないんだったらスレ違いだから。
こっちで、質問していいのかわかりませんが ActivePerl Build 819 MSWin32 には、HTML埋め込み型のaspl(C:\Perl\eg\PerlEx\examples.aspl)とか あるんですが Apache(Linux系)とかでも、埋め込み型で動かせるのって なかったでしょうか? 昔に、そんなのがあった気がするんですが 名前が思い出せなくて
182 :
181 :2006/12/04(月) 21:29:45 ID:???
すみません 思い出しました。 Embperlとかでした
$str = "AoUDqGrsqcUSgVGsCphafNXhkEtsfCcANeLDsTFq"; $str =~ s/[C-G][pqst]/1-9/g; print $str; 置き換えたところ1から9と順に置きかえたいのですが 置き換えた部分すべて1-9と表示されてしまいます。 どの部分を変えればよいのでしょうか??
>>183 これがお望みのものか?
$str = "AoUDqGrsqcUSgVGsCphafNXhkEtsfCcANeLDsTFq";
$cnt = 1 ;
$str =〜 s/[C-G][pqst]/$cnt ++/eg ;
print $str . "\n" ;
185 :
183 :2006/12/05(火) 00:43:04 ID:???
>>184 すっげぇ簡単ですね・・・できない自分にショックです。
教えてくれてありがとうございます。
正規表現中でインクリメントって出来るのか 知らなかった (;゚Д゚)
まあPerlの正規表現に慣れると、PHPのpreg_なんとかって、てんでウンコだね。
画像を連続で出力する時、以下の場合だと画像名が同一で 後から送られてきた画像が上書きされてしまいます。 binmode(STDIN); read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); print "Content-type: image/jpg\n\n"; open(IMG,">sample.jpg"); binmode(IMG); print IMG $buffer; close(IMG); これを No1.jpg No2.jpg・・・のように連番で保存させたいのですが どこを変えればいいのでしょうか? よろしくお願いします。
初めてのperlの練習問題で、引数で指定したファイルの 最後の行から順番に表示するってのがあって、答えは納得できたのですが ↓でうまくいくのが、foreachをwhileにするとうまくいかない理由がわかりません reverseがなければwhileでもエラー出ないのですが・・・ 何故なんでしょうか?よろしくお願いします foreach (reverse <>) { chomp; print "$_\n"; }
>>189 それ、あなたの期待する $_ もしくは @_ への代入が実行されてない。
以下が機能しないのと同じこと。
reverse 'foo' ;
print $_ . "\n" ;
print @_ . "\n" ;
reverse 関数は単独使用時に「左辺が指定されてなかったら $_ or @_ に代入する」
なんて機能を持ってない(つーか勝手にコンテキストの判断してもらっても困るw)。
foreach VAR ( LIST) BLOCK の場合は () 内のリストを暗黙の内に一個一個 $_ に
入れてくれるけど while ( EXPR ) BLOCK は、そんな器用なことはしてくれない。
() 内に条件式を必要とするだけ。
while ( <> ){ } は、あくまでも while ( defined ( $_ = <> ) ) { } の省略。
foreach と同一結果を得たければ、やはり一旦配列に突っ込むのが正攻法
@foo = reverse <> ;
while ( defined ( $_ = shift @foo ) ){ print $_ ; }
以下は見た目、正解っぽく感じるかも知れないが当然ダメ。
while ( defined ( $_ = reverse <> ) ){ print $_ ; }
別のお話しになってしまうので説明割愛。
>>186 > 正規表現中でインクリメントって出来るのか
> 知らなかった (;゚Д゚)
s/// 式の右部分は正規表現じゃないということも知らなかったんだね。ふぁいと。
…言われて見ればそうだね・・・orz
193 :
189 :2006/12/06(水) 05:32:50 ID:???
>>190 ありがとうございました
同じように使われることはあるけど
そもそも機能がかなり違うのですね
勉強になりました
$a = "1167354687","3546879867321","735246; 1 while $a =~ s/(.*\d)(\d\d\d)/$1,$2/; 配列の最初の部分しか出力されないのですがどうしたらよいでしょう?
配列について勉強し直してはどうかな。
>>191-192 わかってると思うけど、式が評価されるのは /e オプションの効果です。
ただ単に右部分に式書いても評価されないので注意。
>>194 まず書いたスクリプトが動くかどうか確かめましょう。
ブラウザ上で更新したcsvファイルを 即時別のサーバーへftp接続してアップロードしたいと思っています。 サーバーにNet::FTPをインストールすることができない状況で可能ですか? 良い手があれば教えてください。 サーバーのOSはSolaris9、CGIバージョンは5.8.8です
flockについて質問です。 x.cgiを open(OUT,"+<$file") ; flock(OUT, 2); @data = <OUT>; #close(OUT); closeしません。 ブラウザでx.cgiをcloseしないで処理終わりました。 違うブラウザでx.cgiを実行したんですが、flockで止まりませんでした。 x.cgiのプロセスが終わると、flockはcloseしなくても 解除されるんでしょうか? ループとかさせて、プロセスが生きてたりすると x.cgiのflockで止まりますか? よろしくお願いします。
プロセスがexitする時、全てのファイルはcloseされる。
プロセスが死ねばロックも解除されます で、flockはアドバイザリなのでflockを使ってないプログラムなどからは問答無用で読み書きできます
たとえプロセスが死んでなくても再びopenされるときにcloseされます
202 :
nobodyさん :2006/12/07(木) 11:11:15 ID:SekHzZx8
shift JISのページに設置したテキストボックスのボタンを押すと、euc-jpのページ
で使われている検索エンジンにジャンプし検索結果を表示したく思います。
今のままですと、文字化けが起きてしまいます。
(HTMLソース)
<form method="POST" action="
http://www.hogehoge.co.jp/cgi-bin/search/ " target="_blank">
<input type="text" name=textdata size="20">
<input type="submit" name=botan value="Search">
</form>
文字化けがしないようperlプログラムをかませて、shift JISに変換してから変換させたい
のですが、どのようなコードを書いたらよいでしょうか?
Encodeで変換後にURLエンコードしてリダイレクトが簡単かと思う
>>200 そうなのか。
それは知らなかった…。
質問なのですが、
・Perl で flock したファイルを php で読み書き。
・php で flock したファイルを perl で読み書き。
・test1.cgi で flock したファイルを test2.cgi で読み書き。
この場合って、正常にロックはされるのでしょうか。
>>206 flockがちゃんと動作する環境で正しくプログラムかけば。
208 :
206 :2006/12/07(木) 16:53:51 ID:???
>>207 なるほど
私はflockがちゃんと動作する環境で正しくプログラミングしていると思われるので大丈夫ですねb
安心致しました^^
WindowsXP上でコマンドプロンプトを作業ディレクトリの指定なしに起動させて、 プロンプトに最初から C:\DOCUME~1\user\デスク~1> となっているときに perl -MCwd -e "print cwd" とすると、C:/DOCUME~1/user/デスク~1 を返すのですが、 C:\DOCUME~1\user\デスク~1> cd "C:\Documents and Settings\user\デスクトップ" C:\Documents and Settings\user\デスクトップ> perl -MCwd -e "print cwd" とすると、C:/Documents and Settings/user/デスクトップ を返してしまいます。 これを、常に C:/DOCUME~1/user/デスク~1 を返して欲しいのです。 どなたかご存じでしょうか。
>>210 perl -MWin32 -MCwd -e "print Win32::GetShortPathName(cwd)"
でも何に使うの?
212 :
210 :2006/12/07(木) 21:52:30 ID:???
>>211 おお素晴らしい。ありがとうございます。
ファイルメーカーPro内で外部コマンドを呼べる外部関数(Peta-Execute)があるんですが、
この中で短いパスで呼ばないとコマンドが動かないみたいなんです。長いパス付のコマンド
(というかperlの第一引数となるplファイル)にダブルクォーテーション付で呼んでも動作しなかった
ものですから。Winの問題なのか、関数の問題なのか、ファイルメーカーProの問題なのかわからず、
今試行錯誤中です。
213 :
nobodyさん :2006/12/07(木) 23:14:06 ID:SekHzZx8
perlの質問になるか微妙なところですが、 <form method="POST" action="hogehoge.cgi" target="_blank"> <input type="text" name="text_name" size="25"> <input type=submit name="img_botan" value=OK> </form> ↑のボタン(type=submit)を↓のようにして、同じ機能を持たせるには、 formタグ内をどのように変更したらよいでしょうか? <input type="image" name="img_botan" value="OK" src="hogehoge.gif"> 「type="image"」で作成してしまうと、postで上のデータを受け取った時 img_botanのvalue値の「OK」が受け取れない状況です。
ボタン → button まず英単語からな
>>213 微妙どころか全然Perlから離れとるがな(´・ω・)
<input type="hidden" name="img_botan" value="OK">
<input type="image" src="hogehoge.gif">
submitはnameの値を見るといいよ
217 :
nobodyさん :2006/12/08(金) 09:56:10 ID:ewFyIfPg
やりたいことをもっと具体的に書け
219 :
nobodyさん :2006/12/08(金) 10:48:17 ID:joMMTMjE
<form method="POST" action="hogehoge.cgi" target="_blank">
<input type="text" name="text_name" size="25">
<input type=submit name="img_button1" value=action1>
<input type=submit name="img_button2" value=action2>
</form>
↑のボタン(type=submit)を↓のようにして、同じ機能を持たせるには、
formタグ内をどのように変更したらよいでしょうか?
<input type="image" name="img_button1" value="action1" src="hogehoge1.gif">
<input type="image" name="img_button2" value="action2" src="hogehoge2.gif">
「type="image"」で作成してしまうと、postで上のデータを受け取った時、
「img_botan1」のvalue値の「action1」と
「img_botan2」のvalue値の「action2」が受け取れない状況です。
>>215 すみません、質問が悪かったです。
1つのform内でしたらhiddenを使えば解決するのは分かってました。
ごめんなさい。
>>219 もともとイメージマップの機能だから値はボタンを押したときの画像内でのマウス
カーソルの座標が送られてくるんじゃなかったっけ。どのボタンかを識別する
用途ならnameを一意につけて値のありなしだけ判定すれば分だと思われる。
223 :
1/2 :2006/12/08(金) 15:14:42 ID:EPvPWdgJ
すみません、質問させてください。
ttp://www.nishishi.com/cgi/tinyurl/ ここのcgiを設置したのですが、設定ファイルをfileopenする所でエラーになるようです。
(配布されている状態のままアップすれば動くはずなのですがエラーになりました)
原因としては何が考えられるでしょうか?
環境:Windows IIS 6.0
Activeperl 5.6.1
224 :
2/2 :2006/12/08(金) 15:15:52 ID:???
多分ここでエラーになっていると思うのですが↓ # -------------------------- # # データの読み込みと一致確認 # # -------------------------- # sub checkdatas { my $checkstring = shift @_; # データファイルを呼んで一致項目を探す my $redurl = ""; if( open(IN,"$datafile") ) { foreach my $oneline ( <IN> ) { if( $oneline =~ m/^$checkstring,(.*)/ ) { # 見つかったらループを抜ける $redurl = $1; last; } } close(IN); # ファイルを閉じる } else { # 読めなかったらエラー &errorexit("設定ファイルが読み込めませんでした。"); } return $redurl; } ----- よろしくお願いします。
226 :
223 :2006/12/08(金) 16:13:02 ID:???
すみません。質問書いた直後に自己解決しましたorz サーバの設定により、設定ファイルのパスをフルパスで設定する必要があったようです。 お騒がせ&スレ汚しすみませんでした。。。
228 :
nobodyさん :2006/12/09(土) 03:02:11 ID:MKj32g5X
質問です。 perlのセッション管理について教えてください。 CGI::Sessionモジュールでセッション管理を行おうと思っているのですが、このソースでセッションがブラウザに表示されるのですが、 セッションが/cgi-bin/sessionフォルダに保存されません。 コマンドラインで perl session.cgiと実行すると正常にセッションが保存されます。 どなたか解決法教えて頂けませんか。 session.cgi #!/usr/bin/perl use strict; use CGI; use CGI::Session; my $cgi=new CGI; my $session=CGI::Session->new(undef,$cgi,{Directory=>'./session'}); $session->expire('+10m'); my $cookie=$cgi->cookie(-name=>"CGISID", -value=>$session->id(), -expires=>"+30m"); print $cgi->header(-charset=>'euc-jp', -cookie=>$cookie), $cgi->start_html('セッションテスト'), $cgi->h1($session->id); print $cgi->end_html; コマンドラインで perl session.cgiと実行するとセッションIDが作成されますが、ブラウザで実行するとなぜか生成されません。 どなたか教えて頂けませんか。
229 :
nobodyさん :2006/12/09(土) 03:05:44 ID:MKj32g5X
すいません最後の2行間違いです 読み飛ばしてください;; ブラウザだとセッションが保存されなくて困っています。
セッションディレクトリをフルPATHで書いてみて
セッションフォルダに書き込み権が無いんでしょ。
233 :
nobodyさん :2006/12/10(日) 11:50:46 ID:Mfd0yjZD
Perlのオブジェクト指向について、インスタンスの変数名は何にしてる?例えば、日付取得モジュールで言うと、 例1:my $date = new Date; 例2:my $date_ins = new Date; 例3:my $date_obj = new Date; 例1だと、日付を格納する変数名と被るから、別の名前にしようと思うんだけど・・・ みなさんのご意見をお聞かせ下さい(´・ω・`)
コーディングの質問をどうぞ スタイルはご自由に
1か3が好み。間接オブジェクトはやめれ。 $date = Date->new; $data_obj = Date->new;
my($nam, $date, $name, $email, $d_may, $comment, $url, $font, $ico, $type, $del, $ip) = split(/<>/, $line); 上のようなコードで、$date を受け取れますが、$date のみを受け取りたい場合にはどうすれば良いのでしょうか? 他を $hoge とかにすればいいという考えもできますが、それだと一度変数にいれるという処理が無駄であり 高速で処理をしたいので処理速度低下に繋がると思います。 シンプルな方法があれば教えて下さい。 たしか、変数部分に何かの定義済み定数をいれたら、その部分を受け取らないということになったようなきがしたんですが、 忘れてしまいましたorz
my $date = ( split /<>/, $line )[1]; my( undef, $date ) = split /<>/, $line; my( undef, $date, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef) = split /<>/, $line;
238 :
236 :2006/12/10(日) 14:34:16 ID:???
>>237 なるほど
undef でしたか…。
こんなに早く回答をいただけるとは幸いです。
ありがとうございました。
perlのcryptが異常に遅いのですが、なんとかならないでしょうか? 今時貧民的プログラミングをする必要はない、ログやロジックはシンプルにした方が良い、と思って掲示板作ったんですが、 速度が異常に遅いんです。 原因調べたら、掲示板のID生産のために crypt を使っているのですが、そこがとっても遅いんですね。 それを外したら100倍近いスピードに。 ようするにIPからIDを生成のために crypt を使っているんですが、表示のたびに全員分の生成をするので時間がかかるんです。 高速で実行できる crypt モジュールみたいのはないでしょうか?
> 表示のたびに全員分の生成をするので 書き込み時にcryptも作ってログに書けばおk。 time→書き込み日時も同様。 もしくは、ある程度ユニークな文字列が得られればそれで良いというのなら cryptなんて使わなくても自分で適当なサブルーチン組めばいい。
241 :
239 :2006/12/10(日) 15:53:23 ID:???
>>240 > 書き込み時にcryptも作ってログに書けばおk。
やっぱそうですよね(´・ω・`)
もう完成しちゃったし使用を開始しているので既にログがある状態なんです
・ファイルを読み取ってIDをファイルに書き込むプログラムを作る
・それを使って既にあるログにIDを追加する
・掲示板CGIへの投稿時にログにIDを追加するようにする
面倒ですが上の手順でやってみます
ログが永遠に保存されるような構造でないなら ・新規の書き込みにはcryptでID情報を追加 ・既存のID無しログはいちいちcryptするか適当な嘘IDを表示 というようにしておけばそのうち古いログが流されて問題なくなるよ。 なお、ログの修正をするのなら一度落としてきてローカルでやるように。
243 :
239 :2006/12/10(日) 16:15:27 ID:???
>>242 なるほど…
ログは永久保存な仕様なんです
なので諦めてログ修正することにします
ローカルにはPerlとかインスコされてなくて面倒なので鯖でやることにします
専鯖なので負荷は余裕です>A<
> ローカルにはPerlとかインスコされてなくて面倒なので鯖でやることにします > 専鯖なので負荷は余裕です>A< (゚Д゚)ハァ? 俺の中に僅かに芽生えていたこいつに協力しようという感情が消滅した。 後はもう勝手にやってくれ。
2chの特定の板の全datファイルを定期的に取得したいのですが、参考になるサイトはありませんか? 2chに負荷がかからないように、差分のみを取得するようにしたいのですが。
>>244 別にどっちでやったって関係なくね?
一度DLする意味が何処にあるんだろうか
ファイルを開いて、中身を全部一旦取り込むっていうのは open(EN,"hoge.txt"); @old = <EN>; close(EN); これで@oldにファイルの中身(複数行)全て入ってますよね・・・? リファレンス見ていたら益々分からなくなってきた(´△`;) hoge.txtの中身をhoge2.txtに移すっていうのをやりたいのだけど ・・・動かねぇorz
my $buff; open(EN,"hoge.txt"); read(EN, $buff, (-s EN)); close(EN); でもおk
qx|cp hoge.txt hoge2.txt|;♪ File::Copyとかとか♪
>>250 レスありです。
読み込んだ@oldを新たなファイルに書こうとすると
1行しか書かれず。。。
もう訳が分からないのでシンプルにファイルリネームで対応しました・・・。
そんなヴァカな… 読み込み&書き込みらへんのソース晒してみて
某Osの某ブラウザで掲示板投稿すると「~」が全角に変わってしまいます 問題はurlのリンク記載なので修正すればいいと思うのですが、これがうまくいきません 以下の自動リンクの正規表現の置換部分で、リンクの記載内に「〜」がある場合、 強制的に「~」にする方法をご指導ください $tmp_data =~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/<A HREF="$1.$2$3$4" TARGET="_blank">$1.$2$3$4<\/A>/ig;
そんなマジカルなブラウザがあるのか
はい、林檎さんの正妻です
マジカルっつーか、Safariを始めとするOS Xの一部ブラウザでは Shift_JISのHTMLで書かれたフォームから送信すると そういう不具合が起こることがある。 Shift_JISとユニコードの変換を厳密にやりすぎるからとか どこかで読んだような気もするがどこだったかは忘れた。 まあ「safari チルダ」あたりでググると対処法とか色々出てくるよ。
んじゃ妾ってとこか?@FireFox(lzyc)
くぐりました、今のところ良い方法が見あたりません また探してはみます 利用者にあれこれさせるのは難しいので、置換部分の アドバイスがありましたら宜しくお願いします
ググれば置換に関する情報も出てくるはずだけどな。 ていうかShift_JISでフォームを書かなきゃいいんじゃね?
検索文字列で 〜 にマッチするようにして、 置換文字列を make_link みたいな関数にして /e で評価する。 その関数の中で 〜 → ~ の変換を行う。とか。 sub make_link { my $url = shift; $url =~ s/〜/~/; return qq{<A HREF="$url" TARGET="_blank">$url</A>}; } $tmp_data =~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~〜\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/ make_link("$1.$2$3$4") /ieg;
>>260 だめでした
>>261 いろいろ考えましたが、私とは次元が違いますね
凄い
有り難うございます
multipleの受け取り方教えてください。 $name=$FORM{'name'}; のように、nameを受け取ったとして、 複数選択されてるときhogeは、 どんな風に受け取ればよいでしょうか。 $hoge=$FORM{'hoge'}; ってすると、$hogeの値はhoge2になっているみたいなんです。 hoge1も受け取りたいのですが。 <INPUT type="text" size="20" name="name" value=""> <select size="〜" name="hoge" multiple> <option value="hoge1" selected>hoge1</option> <option value="hoge2" selected>hoge2</option> </select> よろしくお願いします。
CGI.pm使えば配列で取得できる
>>264 ありがとうございます。
先ほど、CGI.pmで取得の仕方を解説してる
ページ見つけました。
動きが全然想像できないです。
CGI.pm使ってない方法検索しております。
よろしくお願いします。
$forms{$name} = $val; って感じで入れてると思うけど、簡単に書いちゃうと if(deinfed($forms{$name}){ $forms{$name} .= "\0" . $val; }else{ $forms{$name} = $val; } のようにして、取り出すときは my @tmpdata = split(/\0/, $forms{'hoge'}); とすれば複数選択したデータが @tmpdata に入ります。 ただしバイナリデータに対しては有効な技じゃないし、入力されたデータに対して \0 の存在をチェックし エスケープしてやるなどの対策も考慮してください。 バイナリデータとか不正なデータをとりあえず無視して動作を確認したいなら上記可能。 なはずです
複数値を受け取るのは $FORM{'hoge'} だけと決まってるんだったら
配列に叩き込むほうが手っ取り早いしわかりやすいのかも。
if ($name eq 'hoge') {
push @hoge, $value;
} else {
$FORM{$name} = $value;
}
>>266 =~ s/deinfed/defined/ のcgi-lib.pl方式でもいいし、あとは質問者さんの好みで。
なかなか面白い間違いをしてたなorz 訂正thx
肝心なことが書き込まれてないが hoge=hoge1とhoge=hoge2が順番に送られてくる 受け取ったものがhoge=hoge2になってるのは順番に同じ変数に入れてるから。 $hoge='hoge1'; $hoge='hoge2'; print $hoge; こうなってるので後はどうするかは受け取り側で変えればいい。
関数の引数に配列を使った場合、配列のn番目ってどう指定すればいいんですか? 例えば &func(@list1,@list2); としたら、funcの中で$list1[4]とか$list2[6]とかを参照したいんです。
すればいいじゃない
ヒント: &func(\@list1, \@list2);
>>270 &func( \@list1, \@list2 );
sub func {
my( $list1, $list2 ) = @_;
$$list1[4];
$$list2[6];
}
考えることをさせるためにヒントだけにしたのに…
mkdir "foo/bar/baz" ってやったときに、foo/barが存在しないとエラーで死ぬんだけど、再帰的に掘ってくれるような モジュールってない?ないんなら自前で組んでもいいけど、あるんなら再発明したくないし。
sub mkdir2{ my @subdirs = split(/\/, shift); my $curdir = curdir(); foreach my $subd (@subdirs){ mkdir $subd if !-e $subd; chdir $subd; } chdir($curdir); }
>>269 嘘こけ、順序は保証されてねーぞ。ブラウザの実装依存。
>>275 `mkdir -p foo/bar/baz`とかじゃ嫌?
>>275 File::Pathはデフォで入ってないっけ?
>>277 順序が保証されてるなんて書いてないだろ
順序は知らんがひとつずつ順番に入ってくるってのは合ってるんじゃね?
283 :
275 :2006/12/13(水) 15:21:34 ID:???
>276,278 ありがと。 >279 それやるとシステム依存するかなと思ってさ。 >280,282 ごめん、探し方が足りなかったみたい。吊ってくるorz
数値を3バイト長でデータ化したいんですけど、packだけではできないんですか? $n= 1000000; if (($c1=chr(int($n / 256**2)))){ $n= $n % 256**2; } else { $c1= "\0"; } if (($c2=chr(int($n / 256)))){ $n= $n % 256; } else { $c2= "\0"; } $c= $c1 . $c2 . chr($n);
4バイトにpackして1バイト削るとかは?
24ビットにして以下(ry
POSTでログインしてセッションが必要なサイトで LWP::UserAgentなどを使用してCGIからアクセスするのは無理でしょうか? 一定時間経過するとセッションが切れて再ログインしないとダメだったり サイト内での検索結果などをコピペするのがマンドクサイのです
逆に8バイト長のデータ化はどうやったらいいのやら やっぱ256**4で割るっきゃないか
64bit整数が使えるのならpackのqやQも使えるのではないか?
rand関数って、ポケットリファレンスでは指定値"まで"の ランダム数値を返すとなっていたので、7年間ずっと rand(3)は0〜3までを返すと思っていたのですが、実際は 3未満(つまりは2.99999...)だったんですね。 上記の場合だと、3が出る確率は限りなく少ないことになる ので今まで面倒なことをしてましたが、これから今まで 書いたプログラムの見直しをするようになるっぽいです。 一応同じように思い込んでた人のためになればと書き込 んでおきました。
>>290 ま、割と常識というかrand(3)で3は出ない
substrで文字数をカットした場合に発生する文字化けを回避する方法を教えて $sex = substr(キーワード, カット開始位置, 文字数); print "$sex<br>\n"; とするとたまに改行タグがおかしくなってしまう print "$sex.<br>\n" とすると改行タグはちゃんとされるけど・が$sexの後に表示されてしまう
文字コードがわからないとやりようがないし
2byte文字に対応してるわけないだろ・・・常識的に考えて・・・ 「perl substr 日本語」でぐぐるといい
文字コードはシフトJIS
296 :
293 :2006/12/15(金) 12:49:12 ID:???
$from= 3; $count= 5; $s=~/(?:[\201-\237\340-\374]?.){$from}((?:[\201-\237\340-\374]?.){$count})/; print $1,"\n";
297 :
293 :2006/12/15(金) 12:56:47 ID:???
あ、sオプションも要るか・・
urlデコードしたフォーム情報と、openしたテキストファイル(shift-jis)で 文字のマッチングしたいのですが、何をやってもうまくいきません。 どうか助けてください。 <例> use CGI; use Encode; my $query = CGI->new; foreach ($query->param() ){ $form{$_}=$query->param($_); } open (FILE,"<:encoding(shiftjis)","text.txt"); @aaa = split(//,<AAA>); if ($form{bbb} eq $aaa[0]) { print "一致"; } close(FILE);
split(//,<AAA>)はsplit(//,<FILE>)の間違いです。 <訂正> open (FILE,"<:encoding(shiftjis)","text.txt"); @aaa = split(//,<FILE>); if ($form{bbb} eq $aaa[0]) { print "一致"; }
>>299 なんか勘違いしてるっぽいので、
文章でどうしたいか説明して。
302 :
299 :2006/12/16(土) 16:25:29 ID:???
>>301 htmlのフォームに入力された文字と、txt(本当はcsv)のデータとが合致するときに、
なにかを表示するという簡易なデータベースを作っているところなんです。
open (FILE,"<:encoding(shiftjis)","text.txt");
とかでtxtを開いて、クエリと合致するかどうかをみたいのですが、
cgi.pmでデコードした文字(クエリ)と、openで開いた文字の
デコード(?)が違うようで、他のコーディングとやらの
何をやっても一致しないという状態に陥ってます。
ものすごく初歩的・根本的な間違いをおかしているとは思います。
>>302 text.txtのカンマ区切りのデータとフォームが一致するかを見たいということかな?
text.txtは1行のみ?
改行は入っている?
split /,/, <FILE>; じゃだめ?
文字コード気にする前に、単純な英数字で確認してみて。
304 :
299 :2006/12/16(土) 18:07:20 ID:???
>>303 さん、ありがとうございます。
>>299 のようにクエリを受け取ってから、
自分のやりたいことをカンタンにしたのが下記のプログラムです。
open (FILE,"<:encoding(shiftjis)","aaa.csv");
while(<FILE>) {
@aaa = split(/,/,$_);
foreach(@aaa) {
if ($form{namae} eq $aaa[$i]) {
print encode("shiftjis","$aaa[$i]:match<br>");
} else {
print encode("shiftjis","$aaa[$i]:---<br>");
}
$i++;
}
$i =0;
}
close(FILE);
カンマ区切りのデータとフォームの一致をみるのが目的で、
csvは複数行に渡っています(改行入り)。
半角英数の場合はマッチングできるのですが、
平仮名・漢字は一致しません。
また、半角英数・仮名漢字に共通して、
open FILEで引っ張ってきた@aaa{$1}を表示しようとすると
文字化けが起こってしまいます。
>>304 ひとまず、エンコードの処理を忘れて、全てのファイルの文字コードを統一して保存して下さい。
次にコードをシンプルにして、試してみましょう。
open FILE, 'aaa.csv' or die;
while( <FILE> ){
chomp;
my @aaa = split /,/;
for( my $i = 0; $i < @aaa; $i ){
print $form{namae} eq $aaa[$i] ? 'true' : 'false';
}
}
close FILE;
余計なお世話だけど、そんなforeachの使い方教えてるところは参考にしないほうがいいと思われ。
○ for( my $i = 0; $i < @aaa; $i ++ ){
for my $i ( 0..$#aaa ) こっちのが書くの楽だろ常識的に考えて
>>307 楽と云うよりも効率が良くなったからこちらの方が良さそうな。
という思想で。
それはそうともう $i とはもう書かなくなったよなぁ。。。
ついでに回数を指定したループも書かなくなったよなぁ。。。
このスレでfor、foreach論争はやめてくれ
↑ どこが論争だよ
311 :
299 :2006/12/16(土) 22:32:58 ID:???
>>305-307 アドバイスの通りにしたら無事解決しました。
結局エンコード云々はいじらないでよかったようです。
ありがとうございました。
312 :
nobodyさん :2006/12/16(土) 22:42:14 ID:lMy9T+vR
(プログラム技術版で質問したところ、ここで質問した方がよいと言われたため、マルチポストしました) perlに触れて2日目です。。かない痛いミスしてるかもしれませんが、何方か教えてください。 Flashからcgiへ変数$nameを渡す実験をしているのですが、$nameを日本語にすると すべて文字化けしてしまいます。手元にある入門書を参照したところ、jcode.plを使えばよいとあったので、 require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*name); &jcode::convert(*name,'sjis'); print "$name"; としたのですが、まだ文字化けします。sjisにしてもeucにしても同じ結果です。 どうすればよいでしょうか。jcode.plが存在するディレクトリは確認しました。
for (keys %name){ &jcode::convert(\$name{$_},'sjis'); }
314 :
nobodyさん :2006/12/16(土) 23:05:09 ID:lMy9T+vR
それでも文字化けします…。どうしてだろう。。
316 :
287 :2006/12/17(日) 12:12:23 ID:???
あーダメだ。Yahoo!JapanとかならOKだがログイン画面すら取ってこれない
java.lang.NullPointerException のみが出力されてくるのですが、御教示お願いします。
use LWP::UserAgent;
$url = "
https://example.com/test.jsp "; #実際にはログイン画面のURLが入ってる
$ua = LWP::UserAgent->new;
$req = new
HTTP::Request GET => $url;
$res = $ua->request($req);
print "Content-type: text/html\n\n";
print $res->content;
>>316 とりあえず普通にアクセスしたときの通信をトレースして
それを忠実に再現するしかないんじゃまいか
318 :
287 :2006/12/17(日) 13:35:07 ID:???
>>317 さん
やっぱ皆さんこういう高度なのもサクっと作ってcron自動化とかしてたりするんでしょうか
ID・PASSなどをフォームに入れるログイン作業程度なら、
ローカルHTMLのformにhiddenで入れてしまって、jsで一発ログインとかしてるのですが、
一定時間ごとに自動ログイン→一連の作業→処理保存までするのは難しいですね。
もっと色々頑張ってみます
>>318 その点、LWPモジュールも然りサンプルが必ずと言っていいほど掲載されているので、熟読すると良いかもしれませんです♪@CPAN
あっと、そのときには、解説の英文を1から10まで読むよりも、サンプルを1から10まできっちりと読むと判りやすいかと♪
320 :
nobodyさん :2006/12/17(日) 15:56:53 ID:8qXdAMYD
教えてください! www.xxx.com/aaa.php?id=1&next=1 nextの1で処理を行っているのですが リロードでも有効になってしまいます。 これを回避する方法などありますでしょうか。 submitからなら対策できるのですが、埋め込んだURLからは どうしたら回避できるかわからず詰まっています。
321 :
nobodyさん :2006/12/17(日) 15:58:27 ID:8qXdAMYD
かくとこ間違えました。すいません。。
323 :
nobodyさん :2006/12/18(月) 16:04:35 ID:otF+VpE2
質問させてください。 POSTで$nameを送信($nameは日本語) ↓ cgi側が$nameを受け取って、namelist.datをオープンして、$nameを書き込んでクローズ。 ↓ namelist.datを開くと、日本語が%83g%83%7D%83gといった感じで書き込まれている。 これを直したいのですが、namelist.datに書き込む前にjcodeで変換しても駄目でした。 文字コードはsjisで統一してあります。どのようにすれば文字化けせずに書き込めるのでしょうか。
受け取りと変換部分kwsk
325 :
nobodyさん :2006/12/18(月) 16:27:36 ID:otF+VpE2
323です。解決しました。。URLデコード&エンコードが原因でした。
>>324 お手数かけました。
sub disp_HTML { print "Content-type: text/html\n\n"; print <<EOS; <HTML lang="ja"> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <TITLE>$_[0]</TITLE> </HEAD><BODY> $_[1] </BODY></HTML> EOS exit; } POSTされた文字列が不正だった場合等に、ちょっとしたエラー出力をするのに、 こんな感じで単純な出力をするサブルーチンを作って実行するのと、 print "Content-type: text/html\n\n"; print <<EOS; <HTML lang="ja"> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <TITLE>エラー</TITLE> </HEAD><BODY> えらーです </BODY></HTML> EOS exit; } そのままサブルーチンを作らずにHTMLを出力するのとではどれくらい速度に違いが出たりするのでしょうか。
エラー画面ということは、いろんな場所から呼び出される可能性があるので、サブルーチンにする。 またはテンプレート化する。 しかし、速度を気にするほど頻繁にエラー画面が出てしまう設計はどうかと。
content-type が出力されたかどうかのフラグは保持しておいた方がいいよ
>>327 どうもです。
エラーは極力でないように、悪意に対応できるようには作っているつもりなんですが
なんせ自分で一から作るのは初めてなもので、単純に速度が気になったのです。
それほどアクセスが掛かるようなものでもないですし、自分で使う分にはエラーなんて出さないように使うので
そんなに問題でもないんですが一応。
>>328 具体的にはどうすればよいのでしょうか。
print "Content-type: text/html\n\n";
はサブルーチンにせずに都度出力すると言うことでしょうか。
フラグなんて不要 いちいちフラグ確認しないとダメな書き方はよほどおかしい
>>329 処女作おめでとう。
速度なんか後回しで、まずは思うように作ってご覧。
そして、
>>330 が正解。
エラーチェックを全て終わらせてから出力をはじめよう。
>>331 そうですね。そうすることにします。
ありがとうございました。
サブルーチンが定義されているかどうかを調べるにはどうすればいいでしょうか。 条件として、サブルーチン自体にエラーがない保証というのがあり、 evalだと単純に$@の有無だけでサブルーチンの有無とすることができません。 シンボルテーブルを覗いたり、いろいろ調べてはいるのですが、よく分かりません。 シンボルのハッシュを参照したら、サブルーチンがないのに、参照したことによって シンボルが追加されてしまうようです。 ↑よく理解してないためか、そのように見えます。 ご助言いただければと思います。
エラーがない保証がない、でした
単純に defined(&subname) じゃダメ?
>サブルーチン自体にエラーがない保証がない どんな設計だ
そういえばRailsスレはあるのにCatalystスレはないんだな。 やっぱ使ってる奴いないのか?
> 単純に defined(&subname) じゃダメ? できちゃいました。すみません。そんな簡単だったんですね。 シンボルテーブル参照は、単純にパッケージ修飾の仕方で間違ってたようです。 ありがとうございました。
今北産業&流れを見ずにレス
>>316 LWPでhttpsはCrypt::SSLeayが要るんだけど、入ってないからダメって落ちじゃないよね?
すごく初歩的な質問ですが、行き詰っていますorz $OLDには 0-6の数字または文字列が入ります。 数字の時には10〜60代を、文字列の場合はそのまま代入したいのですが、 if ( $OLD == 0 ){ $OLD = "10代"; } elsif ( $OLD == 1 ){ $OLD = "20代"; } . . . elsif ( $OLD == 6 ){ $OLD = "60代"; } else { $OLD = "$OLD"; } このようにかいているんですが、最後のelseが反応せず、文字列はすべて10代と表示されてしまいます。 なにか書き方が間違っていると思うんですが、わかりませんorz 指摘してください。
数値以外が入るなら==じゃだめ。 つ eq、正規表現
342 :
340 :2006/12/19(火) 10:34:36 ID:???
Σ(゚Д゚|||) 試したら・・・できました。ありがとうございました! 勉強になりましたorz
プログラミング初心者です。 mod_perlは、 はじめの一回コンパイル→メモリ上に常駐 とネットで解説されていたんですが、 perlでもコンパイルしたものを配ったりってできるんでしょうか? ソースを公開しないで、スクリプトが配布できたら いいなと思いまして。
どこから突っ込んでほしい?
Perlで言うコンパイルはその場合意味が違うよ あと、コンパイルは同じ環境でやらないといかんから配布向きじゃない
mod_perlがコンパイルしてmod_perlが常駐させるものでperlスクリプトが常駐できるものではない (出来るには出来るがkillされるのがオチw)
>>345 >>346 なるほどです。ソースは公開しないといけないんですね。
>Perlで言うコンパイルはその場合意味が違うよ
・コンパイルって、コンピュータ用のオブジェクトコードに
することでよかったですよね?
・Perlでおいコンパイルは、機械語に直したオブジェクトコードを
メモリに保存しておいて2回目の起動以降は、ソースにアクセスしないで
メモリのオブジェクトコード読んで実行するということでよかったでしょうか。
・機械語は機械語でもC、Perl、JAVAでできたものは、全く別物なんでしょうか。
こういうのはどうやって勉強すれば。コンパイラの本読むとわかるでしょうか。
なんかネットに書いていることをそのまま質問していて、
ほんとアレなんですが、よろしくお願いします。
347です。 いろんなページさまよっているところなんですが。 JAVAは中間コードっていうのみたいですね。 C言語はexeファイルができます。 ちょっと手がかり見つかってきました。 JAVAマシーンが中間コードを読んで実行するみたいに、 mod_perlマシーンが、中間コードみたいなの動かすんでしょうか。
つ チラシの裏
mixiにでも書いとけ
配列とrand関数を組み合わせたいのですが表示できません。 どうしたらよいでしょう? @nakami = (0, 8, 4, 12, 23, 55); foreach $aaa(@nakami){ if(rand $aaa){
>347 ラストね コンパイルの解釈はまぁ OK Perl でのその解釈は mod_perl の解釈 CGI で動く perl はその都度コンパイルされます
つ rand( @nakami );
教えていただけないでしょうか。 log.txtを開いてハッシュとしてセットの上、ペアごとにズラズラ並べたいのですが、 open(f,"log.txt"); %file = <f>; while ( ($key, $val) = each (%file) ) {print "キー $key 値 $val\n";} close(f); これだと何も反応してくれません。 間違ってるでしょうか? log.txtの中身は、 "●●","A組","◎◎","B組","■■","C組", といった感じです。
>>355 ファイルから読み込んだ文字列は、そのままではリストとして扱われません。
文字列をハッシュ変数に代入しても意味がありません。
例えば、以下のような方法で、文字列をリストに変換する必要があります。
・split でカンマ区切りのリストに分解する(ただし二重引用符の除去が必要)
・Text::CSV_XS などのモジュールを利用する(二重引用符も考慮してくれるが少し大げさ)
・正規表現(
http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values )を利用する
・eval で評価する(読み込むファイルが外部からの入力を記録している場合は危険)
この場合、正規表現が一番現実的でしょうか。
357 :
355 :2006/12/20(水) 00:01:50 ID:???
>>356 ありがとうございます。
%file = <f>; ←こんな式はないんですね。お恥ずかしい限りです。
まだcgiを作っている途中で二重引用符を外す事はわけないですので、
最初の方法か、正規表現かで検討してみます。
わざわざすいません。
区切りを改行にすれば%file = <f>;でいけるよ もちろんキーにも値にも最後に改行がつくからchompとかしなきゃだめだけど こんな感じで ●● A組 ◎◎ B組 ■■ C組
my %virtues = map { chomp; $_ } <DATA>; print "$virtues{ONE}\n"; print "$virtues{TWO}\n"; print "$virtues{THREE}\n"; __DATA__ ONE Laziness TWO Impatience THREE Hubris なるほど。
汎用性考えたらこっちだろ?(区切り文字はその時々だけど) my %virtues = map { chomp; split /,/, } <DATA>; print "$virtues{ONE}\n"; print "$virtues{TWO}\n"; print "$virtues{THREE}\n"; __DATA__ ONE,Laziness,TWO,Impatience THREE Hubris
「汎用性」じゃねえな。 「そこまでするなら」に代えてくれ
362 :
nobodyさん :2006/12/20(水) 11:11:45 ID:S+pohGEQ
コーディングのときに検索エンジンにかかりやすくするにはどうしたら良いんですか?
SEOでぐぐれ びっくりするほどスレ違い
>>362 とりあえず、ストリクトなHTMLを吐くように書けばいいと思う。
>>364 少なくとも、ロボ物は適当で簡素なHTMLの方が拾ってくれたりするよ
<html>
<head>
<title></title>
</head>
<body>
</body>
</html>
こんな感じの
それどこのクソエンジンだよw
DOCTYPE が無いのに strict とか、もう一度勉強し直した方がいいと思うよ
HTMLスレでやれ。
ストラトスには憧れたな
371 :
355 :2006/12/20(水) 17:16:24 ID:???
ストラトス・フォー
掲示板で禁止ワードが多くなってきたので、禁止ワードだけを別ファイルに して読み込もうと思ったのですが、 if (!open(WORD,"bad.txt")) { &error('データベース読取エラー'); } foreach(<WORD>){ if ($name eq $_){ $name = "禁止";} } close(WORD); この記述では反応してくれません。(errorはでません) 外部ファイルにする前はできていたのですがなにか書き方が違うのでしょうか・・・? bad.txtの中身はすべて改行区切りです。 また名前欄に特化した禁止ワードなので、eqで問題ありません。 よろしくお願いします。
chompしないと改行がついたまま
改行
またお世話になります 掲示板の本文中にurlがあったとき自動リンクさせますが、 jpg、png、gifのときは画像を小さく表示させたいです 正規表現で末尾を(jpg|png|gif) として区別しますが、 そうでない場合の表現はどうしたらいいですか?
!
普通の画像ならまだしも何か仕込まれてたりしたら見るだけで被害者が続出だな。 まさに阿鼻叫喚の地獄絵図ってやつだ。
末尾を!(jpg|png|gif) と (jpg|png|gif) にしてみましたが、 画像でない方のリンクがなされません ええと、自分のところのアップローダです 既に過去の掲示板投稿がたまっているので、アップローダ において、リンクしてもらうようにするためです これなら1発言中に何個画像があっても自由ですし、 組み込みより楽ですので
例。 ・regex1はかくかくしかじかです。 \.(jpg|png|gif)$なURL。小さく表示させたいらしい。 ・regex2を条件式として、これこれこういうif文を経由して自動リンクになるようにしています。 regex1でないURL。<a href="$&">$&</a>、<a href="$1$2">$1$2</a>などにしたいんだと思う。 regex[12]をどう書いてるのかの記載があると、「画像でない方のリンクがなされません」ではわからんよ、 という印象を受ける人もぐんと減るんだと思う。
>>381 正直余計わからんわw
リンクがされるかどうかは、正規表現にマッチするかどうかの判断でしょ?
まずURLは抜き出せるの?
>>365 > 少なくとも、ロボ物は適当で簡素なHTMLの方が拾ってくれたりするよ
「の方が」 はありえない。
384 :
nobodyさん :2006/12/21(木) 22:10:23 ID:v7yMEHCt
お世話になっております。 今perlを用いてCGIで 画像をUPできるようなものを作ろうとしています。 画像をうpする方は <form method="POST" ENCTYPE="multipart/form-data" action="edit_completion.cgi"> <input type="file" name="TENSOU"> : とやっていて受け取る方は my $cgi = new CGI; my $image = $cgi->param('TENSOU'); my $file_name="./test.jpg"; my $buffer; open(OUT, ">$file_name") or die(qq(Can't open "$file_name".)); binmode OUT; while (read($champ1_image, $buffer, 1024)) { print OUT $buffer; } close OUT; とやっています。 やってみると 白いページで止まってしまうのですが お手数だと思いますが 正しいやり方を教えていただきますとありがたいです。 スレ違いでしたら誘導をお願いします。
die(qq(Can't open "$file_name".));
× while (read($champ1_image, $buffer, 1024)) { ○ while (read($image, $buffer, 1024)) {
>>384 use CGI::Carp qw(fatalsToBrowser);
と書いておくと、エラーがブラウザに表示されるようになるよ。参考までに。
>>381 >>382 $comment=~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~〜\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)(jpg|gif|png)/<a href=$1.$2$3$4$5><img src=$1.$2$3$4$5 hight=50 absbottom border=1><\/a>/ig;
これは末尾が画像の場合、画像でない場合はリンクだけにしたいんです
if使うと一旦配列に入れて展開しないとだめじゃないですか?
そんなことないですか?
それで、URL末尾(拡張子)が画像とそうでないものを置換演算で並べて
やろうと思ったんです
@list = ('test1', 'test2', 'test3',); %hash = ('aaa' => @list); $num = $hash{aaa}; これで、$numに3が入ってほしいんですが、test1が入ってしまいます。 %hash = ('aaa' => @list+0); とすると3が入ります。 +0を付けなくても3を返してほしいんです。 助言をお願いします。
scalar(@
391 :
388 :2006/12/22(金) 01:29:59 ID:???
一旦、urlを自動リンクした後、 さらに自動リンクした<a href>のタグと(jpg|gif|png)含むものをマッチさせ その部分だけimg srcで画像表示させることにしました お騒がせしました
392 :
nobodyさん :2006/12/22(金) 11:06:11 ID:DIJoWwwO
助言お願いします。 grepで@namelistという配列に何個$nameがあるかどうか調べています。 $number=grep(/$name/, @namelist); @namelistに様々な名前を入れてみたのですが、たまたま$name=キムタクと入れた 時だけ、@namelistにもキムタクがあるのにカウントしてくれません。(ネタじゃありません…) まだ沢山カウントされない文字列があるのかもしれませんが、なぜ「キムタク」はカウントされなかったのでしょうか? 文字自体に問題があるのでしょうか?さっぱりです。。
393 :
nobodyさん :2006/12/22(金) 11:09:46 ID:DIJoWwwO
あれれ…。「キタムラ」も駄目でした。カタカナはNGかと思ったら、「クサナギ」は 大丈夫でした。どういうことだ…
395 :
nobodyさん :2006/12/22(金) 11:26:02 ID:DIJoWwwO
>>394 「文字コード」ですか?
「キムタク」も「クサナギ」も文字コードは同じですよ。
ですから文字コードの問題ではないのではないでしょうか。
つ ダメ文字 でもキムタクってダメ文字じゃないような。
キムタクは「ちょ待てよ!」でマッチするんじゃ?
正規表現にもダメ文字みたいなのあるのか。 覚えておこうっと。
まずEUCに変換しないとな
\Q \E とか。
それもshift-jisだと何かがダメだったような。
素直にgrep(index($_,'name')>=0, @array)でいいじゃん
404 :
nobodyさん :2006/12/22(金) 14:48:59 ID:6wQis76n
便乗で文字コード変換について質問させてください 「U」という文字をS-JISからEUCに変換しようと思っています。 Encode::from_to( $tmp, "CP932", "EUC-JP"); #Encode.pm $tmp = jcode($tmp)->euc; #Jcode.pm jcode::convert(\$tmp, 'euc'); #jcode.pl 正しく変換できるのはjcode.plのみでした。 Encode.pmあるいはJcode.pmで変換する方法はありますか?
406 :
nobodyさん :2006/12/22(金) 18:10:36 ID:6wQis76n
>>405 ありがとうございます
やケもダメですね
Perlで全ての日本語の文字コード変換を行うことはできないのでしょうか?
入力される可能性のある文字についてみなさんどのように処理されていますか?
日本語コードといっても機種依存文字の部分がバリエーション けっこうあるし、unicode以前は統一されていた部分ですら どうunicodeに対応させるかでさらに分裂してしまってる現状 なので個人的にはあきらめているな。 どうしても満足できなければ、自前で好きな変換表を定義してe nc2xsでperlから使えるようにするのがいいんじゃないか。 いいのができたら公開すると世の中のためにもなる。
Cモジュールの作り方がさっぱり分からん
perlxstut, perlxs 辺り読めば分かると思うけど。
410 :
nobodyさん :2006/12/23(土) 01:35:39 ID:rkaYYOb9
411 :
nobodyさん :2006/12/23(土) 01:42:38 ID:rkaYYOb9
すみません。「いますが、」はゴミです。 coookie⇒cookieでした。失礼しました。
> 具体的にどうすればよいのかわかりません。 わかってるじゃん。あとは、クッキーを読み書きする方法を調べるだけだろう。 「Perl クッキー」とかで検索すれば、すぐにわかるよね。
(´-`).。oO(投稿しないと見れない掲示板にどうやって投稿するのやら…)
>>413 ようするに、既にいる常連達とだけ馴れ合いたいってことだろ
パスワード制にすりゃいいのにね
415 :
nobodyさん :2006/12/23(土) 07:57:13 ID:vvP1Ez0I
改造スレいけ
416 :
nobodyさん :2006/12/23(土) 10:26:34 ID:9XJJytw/
LWP::UserAgentを用いてのPOST処理なのですが、multipleタイプのプルダウンメニューの内容全てを送るにはどうすればいいのでしょうか? おなじnameで複数のvalueをPOSTする方法に悩んでいます。
PHPのmktimeやdate関数のように Y/m/d H:i:s を変換するスマートな方法はありますか? Date::Simpleは何か違うような感じだったので 例 1900/01/01 12:00:00 ↓ 01/01 12:00
Date::Manipあたりは試した?
区切り子が分かってるんだから自前で用意すれば?
Date::Simpleは使いやすいけど、日にちまでなんだよな。 たくさんモジュール使っても混乱するだけだし。 いまだとDateTimeモジュールがベストプラクティスなんじゃないの。
422 :
nobodyさん :2006/12/23(土) 16:14:47 ID:MDS/ay7M
Catalystにて Apache2 + mod_perl2 --httpd.conf------ PerlSwitches -I/var/www/Hello/lib PerlLoadModule Hello PerlTransHandler Hello <Location /Hello> PerlSetEnv Hello_DEBUG 0 SetHandler modperl PerlResponseHandler Hello </Location> の設定をして、アパッチ再起動すると WWWサーバー内のデータ全てがmod_perl2化しているようになり、 speedyCGIなどのスクリプトの動きがおかしくなるのですが、 どのように解決したらよいでしょうか
424 :
nobodyさん :2006/12/23(土) 23:10:40 ID:HvJ8lenr
あるログHTMLファイルの一番最初の<b>名前<\b>にマッチングして $1に放りこんであるものを そのファイルの最後の<b>名前<\b>にマッチングさせてたいのだが、、、。
425 :
nobodyさん :2006/12/23(土) 23:17:38 ID:HvJ8lenr
for ($i = 0; $i <= $#dir; $i++) { ($ts, $file) = split(/,/, $dir[$i]); last if $ts eq ' '; open(R, "$bbspath/$dir/$file"); @resthred = <R>; close(R); $resthred[0]=~ /<b>([^\<]*)<\/b>/; $restitle = $1; $restitle =~ s/\s+$//; $resthred[$#resthred-1] =~ /<dt>(\d+)/; $k = $1; # 投稿記事数 $j = $i + 1; # スレッド表示番号 if ($k ne "1") {$k = "($k)";} else { undef $k; } $file =~ s/\.html$//; if ($threadnum > $i) { print W qq(<br>$j.<a href="$cgiurl$logbbscgi/$dir/${file}/" target="contents"><font size=3>$restitle$k</font></a> ); } print W2 qq($j.<a href="${file}/">$restitle$k</a> \n); } #ソースはこんな感じ。
426 :
nobodyさん :2006/12/23(土) 23:21:27 ID:HvJ8lenr
$resthred[0]=~ /<b>([^\<]*)<\/b>/; ここらへんのメタキャラクタを^から$に変えるということでもないし。 そもそもこのインデックスナンバーの意味もわからないのだが、、、。
427 :
410-411 :2006/12/23(土) 23:40:58 ID:rkaYYOb9
>>412 レスありがとうございます。
考え方としては間違ってないということですね。
>>413 >(´-`).。oO(投稿しないと見れない掲示板にどうやって投稿するのやら…)
投稿していない段階では、新規書込画面しか出ないようにしたいのです。
>>414 >パスワード制にすりゃいいのにね
すでに導入しているのですが、カキコしてくれる人とそうでない人とに
不公平さが出てしまっていて悩んでいるんです。
428 :
nobodyさん :2006/12/23(土) 23:46:08 ID:MDS/ay7M
ここ間違ってない? $resthred[0]=~ /<b>([^\<]*)<\/b>/; <b>名前<\b> なら こうじゃないかな? /<b>(.+)<\/b>/
もう少しデータの持ち方を工夫すると楽になると思うよ。
430 :
nobodyさん :2006/12/24(日) 00:25:34 ID:AWC9vzHT
<html><head><title>fdsfdfd </title></head> <b>改編fdsfdfd </b></font>投稿者:<font color="forestgreen"><b>太郎 </b> <br><hr><a name="bottom"></a><a href="index.html">掲示板に戻る</a> <a href=" まあ要するに最初の<b>改編fdsfdfd</b>になってるものを 最後の<b>太郎 </b>がひっかかるようなマッチングをしたいだけなんですが 現状はこのメタキャラクタで最初の<b>~</b>で きちんとひっかかる。
日本語でおk
そんな簡単なマッチも書けないやつが スクリプトで2chに負荷かけそうで心配
>>430 それちょっと前にも話題にでたけど、否定先読み使って
$regex(?!.*$regex)
で $regex にマッチする一番最後の部分が得られる。
$_ = <<EOT;
<html><head><title>fdsfdfd </title></head>
<b>改編fdsfdfd </b></font>投稿者:<font color="forestgreen"><b>太郎 </b>
<br><hr><a name="bottom"></a><a href="index.html">掲示板に戻る</a> <a href="
EOT
my $regex = qr{<b>([^<>]*)</b>};
print "$1\n" if m{$regex(?!.*$regex)};
って書いてから思ったけど、今回のケースなら別に否定先読み使わなくても m{<font color="forestgreen"><b>([^<>]*)</b>} でマッチできるね(´・ω・)
質問です 2項分布の計算をperlでやりたいんですが、一定の数値以上になると、階乗のところで変数の容量オーバー(? #INFとの表示)でおかしくなってしまいます ・変数の扱える桁数を大幅に増やす方法はありませんか? ・ExcelのBINOMDIST関数的なライブラリ(?)は無いのでしょうか スレ違いだったらごめんなさい。よろしくお願いします
>>435 bigintプラグマ(整数)
bignumプラグマ(実数)
実体はMath::BigIntやMath::BigFloat
他に分数で扱うMath::BigRatもある。
438 :
nobodyさん :2006/12/24(日) 12:01:21 ID:AWC9vzHT
>>433-434 お答えくださってありがとうございます。
しかしなかなかうまくいかないので
プロにおまかせすることも検討してます。
やはり正当な知識には正当な料金というものが発生するものという
考えが正しいのかと。
それでは。
>>438 料金云々の話は確かに間違いではないけど、何より
>>424 >>430 の説明(≒仕様)がわかりにくいんです。
プロに頼むにしても仕様があやふやだったり後出しが続いたりすると「なかなか」なのは同じですよ。
「また仕変ですか」と呆れられたり値上がりしたりするだけですけど。
行末にある<b>太郎 </b>の「太郎 」が$1として使えるだけでいいんだったら
$ を書き足すだけでもいいのかもしれない。
>>434 が書いたものでうまくいかない理由は不明。
(実はcolor="forestgreen"じゃない場合があるとか、そんな問題のような気がする)
$resthred[0]=~ m|<b>([^<>]*)</b>$|; # スラッシュをエスケープするのが面倒です版
$resthred[0]=~ /<b>([^\<]*)<\/b>$/; # 元ソース使い回しました版
>>430 の「最後の」が行末でも何でもない場合は、プロにお金を積む方向で。
440 :
nobodyさん :2006/12/24(日) 14:06:39 ID:AWC9vzHT
度々お答えくださりありがとうございます。 やはりなかなかうまくいきません。 「最後の」というのは行末ということではなく 加工前のログにたくさんある<b>名前</b>のなかで最後の<b>名前</b> =最新レスポンス者の名前をひっかけたいということです。 まあ、最初からそのログを改行して区分けするというやりかたも ありだとは思いますが。 いろいろと模索中であります。 金云々にしてはすでに三十万近くかけて作らせてるものです。 私は多少のPerl/CGI知識を持っているのですが 運用に力をいれたいほうなので外注に頼ってるわけであります。
>>440 こんなこと言うのもなんだが、
「運用に力を入れたいから知識はあるけど外注」ってレベルじゃないだろ。
その程度なら素直に信頼できる実績があるとこに外注がいい。
442 :
nobodyさん :2006/12/24(日) 14:55:58 ID:AWC9vzHT
確かにその$resthred[0]=~ /<b>([^\<]*)<\/b>$/; で おかしくはないと思うんですが まあ、すべてのソースをみてのことじゃないからわかりませんよね。 よく元ソースを解読してから出直します。 結果としてそのファイルのあるフォルダ名が$restitleにはいってしまうので 別の問題にも思われます。 ここまで考えて改造費出すのも個人的に馬鹿馬鹿しいので 自分なりに実験してみますわ。 御意見ありがとうございました。
443 :
nobodyさん :2006/12/24(日) 14:58:03 ID:AWC9vzHT
>>441 うるせえよ。
てめえに聞いてねえんだよ。
ガタガタ口はさむなクソが。
じゃあな。
頭が悪いのにプライドが高いと大変だな。 哀れだがなにもしてやれん…
441が回答してくれた人達かもしれないのにな
30万って、二週分にも満たないハシタガネで何イキがっているんだろう...
447 :
nobodyさん :2006/12/24(日) 17:10:57 ID:AWC9vzHT
結局、外注にしましたわ。 ただより高いものはない、なんて言うしな。 プログラミングは誰にこだわる理由はないし、 結果のでない親切より結果のでるお金だわな。 まあ、それはそれで駆け引きの技術だが。 てめえらもこんな腐れ掲示板で悪態奉仕活動してねえで 技術で金むしりとることに専念したほうがよくねえか? 俺が最初に頼んだ職人もそうだった。 あんまり調子こくんで他の外注にするつもりだが。 競争にさらされねえとそこらへんはわかんねえんだよな。
態度の豹変ぶりに笑った
449 :
nobodyさん :2006/12/24(日) 17:14:29 ID:AWC9vzHT
でもあれだね。 その職人もこういう掲示板とかで聞いたり他のソースを拾ったりして やっつけ仕事とかしてやがんの。 おまえらそういう連中にも利用されてるんだよ。
450 :
nobodyさん :2006/12/24(日) 17:21:57 ID:AWC9vzHT
だいたいここで張りついて親切に答えてる連中はプロじゃねえだろ。 そんで聞いてる連中が要領のいい継ぎはぎ職人のプロだったら皮肉で笑えるけどな(w
>>449 その解釈は正確にはそれはちょっと違います。他ならぬ貴方からの依頼だからこそ
出来合いのソースを拾ってきてやっつけ仕事で片付けているんです。
つまり貴方はその程度の顧客です^^
そんなエサに俺様がクマー
453 :
nobodyさん :2006/12/24(日) 17:29:35 ID:AWC9vzHT
いやそれは俺がわざわざここから参考にしろってリンク張ってあげたんだよ。 フリーソフトの作者さんのサイトでねえ。 安い仕事だと思ったから。そこらへんまで譲歩したのだ。 無償のオープンソースを利用してるのはそういった要領のいいやつだ。 俺もそこらへんは共通の金銭の価値観なのでな。
454 :
nobodyさん :2006/12/24(日) 17:35:09 ID:AWC9vzHT
フリーで作ってる連中に著作権とかぐだぐだ言われるとうるせえから 変数の名前だけ変えてフルスクラッチすればとか言ってやってな。 親切だろ。 まあ、というのも俺も金儲け目的のサイトをつくろうと思ってるから 投資は必要だしな。
> 変数の名前だけ変えてフルスクラッチすれば > 変数の名前だけ変えてフルスクラッチすれば > 変数の名前だけ変えてフルスクラッチすれば (゚Д゚)…!?
KE○Tでも紹介したんですか?
457 :
nobodyさん :2006/12/24(日) 17:45:50 ID:AWC9vzHT
聞いてる連中がどんな人間かわからん。 答えてる人間がどういう人間だかわからん。 ただよく無料で答えるなあとは思うわなあ。
> いやそれは俺がわざわざここから参考にしろってリンク張ってあげたんだよ。 > フリーソフトの作者さんのサイトでねえ。 > 安い仕事だと思ったから。そこらへんまで譲歩したのだ。 ↓ > その職人もこういう掲示板とかで聞いたり他のソースを拾ったりして > やっつけ仕事とかしてやがんの。 ↓ > 俺が最初に頼んだ職人もそうだった。 > あんまり調子こくんで他の外注にするつもりだが。 凄い釣りだぜ…。
459 :
nobodyさん :2006/12/24(日) 17:51:40 ID:AWC9vzHT
>>456 いろいろ。
俺はねえ金を儲けたいのね。
ほんと正直な気持ち。
だから金使うのも筋だと思うわけ。
たとえ少額でも1円と無料には大きな開きがある。
君等もこんな腐れ掲示板はさっさと放棄して
私がこんどつくる掲示板を利用したほうがいいだろう。
461 :
nobodyさん :2006/12/24(日) 17:55:54 ID:AWC9vzHT
つまりなんかしら利益の還元があるCGIだねえ。 スロットマシーンのプログラ厶のようなものだ。
主張が右往左往していて何が言いたいのか良く分からんな。 誰か3行くらいでまとめてくれない?
463 :
nobodyさん :2006/12/24(日) 18:00:29 ID:AWC9vzHT
>>460 どうも俺はナマケモノでねえ。
先伸ばし、先伸ばしで五年はたつ。
しかしシステムは確立したよ。
>>464 うはwwおk把握www
何か1ch.tvを思い出すなあ。
466 :
nobodyさん :2006/12/24(日) 18:08:53 ID:AWC9vzHT
以前、このスレッドであるメタキャラクタを 聞いたときはたまたまいい回答が帰ってきて もうけものだったのだが やはり無料には限界があるようだな。 無料の限界=2chの限界=匿名の君等の限界だのう。
467 :
nobodyさん :2006/12/24(日) 18:10:52 ID:AWC9vzHT
1chってあれでしょ。 利用者から金とるってやつだろ。 あんなものダメに決まってるじゃあないか。
正確には『お前の俺らから情報を引き出す力の限界』だけどな。
469 :
nobodyさん :2006/12/24(日) 18:14:43 ID:AWC9vzHT
なんだか Perlコーディングスレなのに私の妄想のはけぐちスレにして なにか申し訳なくってきたねえ。 まあそれも2chだからしょうがないのう。 すっきりするまでつきあってほしい。
471 :
nobodyさん :2006/12/24(日) 18:17:28 ID:AWC9vzHT
情報って、、、。 なんかいい金になる情報なんかあるの?。 2chで金になる情報なんかあったためしがない。
472 :
nobodyさん :2006/12/24(日) 18:29:11 ID:AWC9vzHT
>>470 つうか今それは問い合わせ中なのでまた今度な。
まあ、そのときは自己解決しましただろうけど。
求めるととこはプラスの結果だけ。
そういうプラスの結果を出すシステムを作りたかったのだ。
なにか答える。なにか結果を出す。なにか教えてくれる。
俺は金を請求するし金は払う。
それでおしまいだな。
473 :
nobodyさん :2006/12/24(日) 18:30:56 ID:AWC9vzHT
まあ、質問には金が伴うほうを選ぶよ。 失礼しました。
>>471 それは感性の違い。
感性の無い奴には泥まみれの宝石の原石は見つけられない。
と、釣られてみるテスツ
(´-`).。oO(バブル脳の戯れ言か(嬉嬉嬉))
みんな暇なんだなと安心するクリスマスイブであった
じゃあ質問させてくれ 文字列fooのあとに、bar以外の文字列が来て、しかも最後までにbazが現れないという 条件にマッチする正規表現が書きたくて、下のようなのを書いてみたんだけど。 /foo(?:(?:(?!bar)).(?<!baz))+$/ さすがにアレなんで、ちょっとどうにかならないものかなと。複数のパターンに分割するのはなしで。
m{foo(?!bar)(?!.*baz.*$)}
俺は面白い質問があれば答える。ただそれだけ。面白いなら宿題でも金儲けでもなんでもいい。ぐだぐだ言ってないでさっさと次の質問しろよ
>>478 >>479 で正解が出ているけれど、実際問題、可能であれば分割した方が効率と可読性の両面から好ましい場合が多い気がするよ。
s{(https?://[A-Za-z0-9./_?=-]+)}{
my $x = $1;
$x =~ /\.(?:gif|png|jpg)$/? qq{<img src="$x" alt="">}: qq{<a href="$x">$x</a>}
}eg;'
正規表現部分は適当に置き換えて。
>>422 Location の中に全部入れれば?
ちなみに、mod_perlは必要な部分だけ分離 (別サーバにするかApache2個立ち上げるか) するのがお勧め。
乗り遅れたが後悔はしない
俺も乗り遅れたが後悔はしていない ただ1つ書くなら・・・俺はこの板でスキルアップさせてもらってる
485 :
373 :2006/12/24(日) 23:22:02 ID:???
>>374 遅くレスすいません以下のようにしたんですが
if (!open(WORD,"bad.txt")) { &error('データベース読取エラー'); }
foreach(<WORD>){
chomp;
if ($name eq $_){ $name = "禁止";}
}
close(WORD);
これであってますか・・? と、いうか禁止ワードに反応なしなので
未だにできてません(´Д⊂)
486 :
nobodyさん :2006/12/24(日) 23:40:55 ID:5VuL7TZS
>>485 $name に何が入ってるのかわからんけどさ
$name =~ /$_/ig;
にしたら?
iオプションは必要だけどgオプションが必要かどうかは自分で決めてね
487 :
nobodyさん :2006/12/24(日) 23:44:25 ID:5VuL7TZS
それでも引っかからなければ文字コード 両方コード揃えてひっかければいい これでダメなら他が悪い use Jcode; $name = jcode->($name)->euc; if (!open(WORD,"bad.txt")) { &error('データベース読取エラー'); } foreach(<WORD>){ chomp; $temp = jcode->($_)->euc; if ($name eq $temp){ $name = "禁止";} } close(WORD);
488 :
nobodyさん :2006/12/25(月) 02:20:59 ID:WCngGP1U
$fooにfooという文字列、$hogeにhogeという文字列が入っているとして、 $barにはfooを含む文字列が入っているとすると、 $bar =~ s/$foo/$hoge/; としても置き換えはされないのですが、 $bar =~ s/foo/$hoge/; としたら置き換えがされるのは何故でしょうか? $fooが評価されていないということは分かったのですが、何故かが分かりません。
>>488 ん?
my $bar = 'foo!foo!foo!'; my $baz = $bar;
my $foo = 'foo'; my $hoge = 'hoge';
$bar =~ s/$foo/$hoge/g;
$baz =~ s/foo/$hoge/g;
print $bar, "\n", $baz;
--
hoge!hoge!hoge!
hoge!hoge!hoge!
490 :
nobodyさん :2006/12/25(月) 02:35:21 ID:WCngGP1U
>>489 なに・・・!
なぜでしょう・・・(´・ω・`)
実際のプログラム中ではオブジェクトとして扱っているのは関係あるのでしょうか?
($fooは実際は$self->{foo}->{bar}としている)
$bar =~ s/$self->{foo}->{bar}/$self->{foo}->{hoge}/;
>>486 g は全く要らない。
i は必要とは言えない。
>>488 実際には foo は日本語で、しかも Shift_JIS 使っているなら、
$bar =~ s/\Q$foo/$hoge/;
としてみては?
492 :
nobodyさん :2006/12/25(月) 03:09:41 ID:WCngGP1U
>>491 日本語じゃなく、文字コードを指定していなかったんですけど、\Qを挿入したら出来ました・・・
\Q : \E までのパターン指定メタ文字の意味を打ち消す
(´・ω・`)ナゼ?
493 :
nobodyさん :2006/12/25(月) 03:16:49 ID:WCngGP1U
$bar =~ s/$self->{foo}->{bar}/$self->{foo}->{hoge}/;において、$self->{foo}->{bar}にパターン指定メタ文字が含まれていたのでしょうか・・・ あ、ご解答下さったみなさん、ありがとうございました!
s///e;
495 :
nobodyさん :2006/12/25(月) 06:46:37 ID:85L6NXNb
>>491 >g は全く要らない。
>i は必要とは言えない。
gは全くいらなかったね置換するわけじゃないしね
iは日本語と決まってるならいらないだろうけどsexとかだったらいるんじゃねえ?
sex!sex!sex!
バカは回答すんなよ
498 :
nobodyさん :2006/12/25(月) 13:28:03 ID:bvP5u9Gv
何故か「ー」の置換が出来ません。 他の日本語や、逆(〜をーにする)は出来ます。何故なんでしょうか? print "content-type: text/html\n\n"; $str = "ボール"; $out = "ー"; $in = "〜"; $str =~ s/$out/$in/; print $str;
499 :
nobodyさん :2006/12/25(月) 13:52:39 ID:ClYkzmks
use Foo; use ...; use ...; と、複数のpmファイルをuseしたのですが、先頭行のuseだけにエラーが出ます。 Can't locate Foo.pm in @INC (@INC ... ちゃんとFoo.pmは存在するし、他の行のuseにはエラーが出ないのですが・・・ このエラー文は、モジュールがインストールされていないという意味のほかに、なにか意味はあるのですか?
500 :
499 :2006/12/25(月) 13:58:43 ID:ClYkzmks
何度もすみません。 use Foo; use Hoge; use ...; use ...; だとFoo.pmに関して、 use Hoge; use Foo; use ...; use ...; だとHoge.pmに関してしてエラーが出ていたようです。 @INCの検索パスにそれらのファイルが含まれていないということでしょうが、ちゃんとそのディレクトリに置いてあるんです\(^o^)/オワタ
use lib しなけりゃエラーが出て当然だと思いますが・・・
503 :
499 :2006/12/25(月) 14:29:36 ID:ClYkzmks
504 :
499 :2006/12/25(月) 14:36:15 ID:ClYkzmks
/lib/Common/Cookie.pm にしてますか?
506 :
499 :2006/12/25(月) 14:51:36 ID:ClYkzmks
>>505 はい、呼び出し側との相対パスは./lib/Common/Cookie.pmです。
508 :
nobodyさん :2006/12/25(月) 19:38:47 ID:ClYkzmks
\r\n、\r、\nは<BR>に変換するけど、<BR>はどの改行コードに戻せばいいの? 対象のOSによって変わると思うんだけど・・・
\x0d\x0a|\x0d|\x0a お好きなのをどうぞ
その「お好きなの」をどれにするかで迷ってんじゃね?
511 :
nobodyさん :2006/12/25(月) 19:57:38 ID:ClYkzmks
はい。 プラットフォームによって改行コードを勝手に決めてくれたりは出来ないんですか?
>>492 記号類はメタ文字 (特殊文字) になるものがあるので、よく分からなければ \Q$var\E しておくのが良いです。Shift_JISの場合、漢字の一部にメタ文字が含まれる可能性があるので、思わぬところでエラーとなります。
>>495 要件に「大文字小文字を区別するかどうか」が含まれていないため、必要に応じて i 修飾子を付けてください、という意味です。
>>498 文字コードはShift_JISを使っていますね。「ー」の2文字目は「[」であるため、バイト単位で処理する場合にはそれがメタ文字として見なされます。
ですから、以下のような方法で回避する必要があります。
1.
>>501 EUC-JPを利用する。
2.
>>507 \Q$out\E とする。
3. Jperlを利用する。(今となってはお勧めできない)
4. 入出力をきちんとハンドリングして、内部では常にutf-8フラグつきの文字列として扱う。(多少面倒だが漢字も1文字単位で処理できるのでお勧め。「Perl utf8」でググれば参考サイトは沢山出てきます。)
5. 先頭で use encoding "Shift_JIS"; する。(あまりお勧めできない)
他にあったっけ?
# Shift_JISでは /セーラープルート/ がエラーになるので悲しい。
>>506 ライブラリの位置を指定する (-Iオプションや use lib) 際、相対パスの基準位置はカレントディレクトリです。また、use でエラーになった場合にはそれ以降の use は実行されずモジュールが存在しない場合でもエラーが出ません。
スクリプトの位置を基準点とした相対ディレクトリで指定したい場合には以下のように FindBin を利用します。
use FindBin;
use lib "$FindBin::Bin/lib";
>>508 Unix: LF (\r\n)
DOS/Windows: CRLF (\r\n)
Mac: 昔はCR (\r) だったけど今どうなの?
意識して変換するのであれば、CRLFにしておくのが無難だとは思う。Perl v5.8では、以下のようにしてPerlIO階層で変換してくれるので便利。(ファイルに出力するのであれば open 時に指定することも可能。)
binmode STDOUT, ":crlf"
514 :
nobodyさん :2006/12/25(月) 22:37:26 ID:ClYkzmks
OOPにおいて、メソッドの呼び出しには引数の括弧は省略しない方が良いのですか?
516 :
498 :2006/12/26(火) 08:40:27 ID:???
なるほど、ご丁寧に教えてくださってありがとうございます。
設定:自動登録型リンク集スクリプト 管理パスを確認 ↓ パスがあってたら登録サイト一覧を表示 ↓ 削除したいサイト選択後に削除←この時の質問なんだけど 削除したいサイト選択後のスクリプトの呼び出し方がわからない 削除したいサイトをチェックボックスで選択後、インプットタグでスクリプトを呼び出して、 サイト削除のサブルーチンを呼び出すって流れなんだけど、 引数やhiddenで呼び出す書き方だと外部からも直接呼び出せてしまうわけで、 管理画面からのみ呼び出せるようにするにはどうしたらいいの?
519 :
nobodyさん :2006/12/26(火) 18:46:11 ID:PubWBr4/
cookieに管理権限渡しておいてcookie checkでOKなら削除、NGならエラーってすれば良いと思うよ。 あとスレ違い
>>518 質問が変に具体的すぎてよくわからんが
Session管理するか、それに近いものを実装する
>>515 古代のMacPerlではohzakiの記載も正しいですが、最近のPerlでは\n = NL(LF), \r = CR のはずですが…
今時そこまで古いバージョンに気を使う必要は無いでしょう。
そもそも、\n と \r の意味が逆転しているのも独自仕様ですし。
>>518 セッション管理が面倒なら、削除する際にも再度パスワードを入力させてチェック。
この手法だと、CSRFを回避することができるおまけ付き。
>>521 ん?よく分からないんだが、最新のActivePerlとかMacPerlでは挙動が変わったってこと?
よその環境用には書かないからマジでわからん。
WinのActivePerlは\n = CRLF
524 :
518 :2006/12/26(火) 20:43:26 ID:ISbRNGDd
Perlでは特に指定しない場合はbinmodeではありません。このため、入出力時にはそのOSに応じた改行コードと \n が相互に変換されます。したがって、何もしない場合にはPerl内部で扱う改行コードは常に \n であるわけです。 binmode はこの改行コード変換を抑制する関数です。(最近ではそれに加えてPerlIO層の変換ルールを指定する機能も持たされました。) この変換があるため、Windows環境ではbinmodeを指定せずバイナリ (画像データなど) を出力する際に正しいデータが出力できないという罠に陥ります # MacPerl の場合、\r と \n の役割を入れ替えることで、Unix 用に書かれたスクリプトが (binmodeせず) そのまま動作することを期待していたのでしょう。(多分) ActivePerl でも、\n 自体は LF となります。以下が実行例です。 C:\>perl -e "$x = qq[\n]; print unpack q[H*], $x" 0a また、binmodeの有無によって改行コードの変換がされる・されないことは以下の通り実行したら分かります。 C:\tmp>perl -e "open FH, q[> sakura.txt] or die; print FH qq[\n]" C:\tmp>perl -e "open FH, q[> tomoyo.txt] or die; binmode FH; print FH qq[\n]" MacPerl は今でもあるかは知りません。 「古代のMacPerlでは」→「少なくともある時点でのMacPerlでは」に訂正します。
( ^ω^)……
改行コードは Perl の I/O ルーチンが実行環境に合わせて勝手に変換する そうさせない方法があったはず
OS別の動作考えるぐらいなら
s/chomp/
>>509 /
にしとけ
binmodeってwindowsでしか使われてないと思っていた俺ザンギ
最近binmodeつかってないなぁ。open my $fh, '<:raw', $fileとかやるから。
532 :
nobodyさん :2006/12/27(水) 16:52:37 ID:Dit2F/dP
$foo{hoge}と$foo->{hoge}ってどう違うんですか?
@fooに\%hoge、\%barなどのリファレンスが格納されている場合、個々の値にアクセスする方法はどうすれば良いですか?
534 :
533 :2006/12/27(水) 17:57:11 ID:???
テストスクリプトとして、以下のようなものを作ってみたんですが・・・個々の値にアクセスできません><; my $aaa = { a => 'あ', b => 'い', c => 'う' }; my $bbb = { a => 'え', b => 'お', c => 'か' }; my $ccc = { a => 'き', b => 'く', c => 'け' }; my @aaa = (\%aaa, \%bbb, \%ccc); foreach my $a (@aaa) { foreach my $b (keys(%$a)) { print %$a->{$b}; } }
>>532 $foo{hoge}:
%fooというハッシュのキーhogeに対応する値
$foo->{hoge}:
$fooに格納されたハッシュリファレンスで示されるハッシュの
キーhogeに対応する値
>>532 $foo{hoge} ハッシュの値
$foo->{hoge} ハッシュリファレンスの値(デリファレンス)
>>533 $foo[0]->[0]とか$foo[1]->{hoge}とか
>>534 my %aaa = (
a => 'あ',
b => 'い',
b => 'う',
);
>>535-536 ご回答ありがとうございますm(_ _)m
ようやく両者の違いがわかりました!
>>537 おお〜出来ました!ありがとうございます!
$aaa = {
};
と
%aaa = (
);
の違いについて分かるサイトはございますか?
前者が名前の無いハッシュなんとかかんとかというのは分かったのですが・・・
さっきから質問ばかりで申し訳ないです。。。
ハッシュをforeachやwhileでまわすと、例えば
>>534 の例で言えばc→a→bのように、返される値の順序がバラバラになるんです。
この理由は分かった(というか元々バラバラになるようになっている)のですが、これは番号を振ってsortしなくてはいけないのですか?
できた〜 いちいち番号を振らなくてもsortで出来るんですねヽ(・∀・)ノ
解決したみたいだけど、ハッシュでは順番は保存されません。実装上の都合です。 理由は「ハッシュ」という名前に関係してるんだけど、 詳しく知りたければ「ハッシュテーブル」を検索してみてね。
うおー途中というかわけわかんないところで送信してもうた %aaa = (); なら $aaa{hoge} $aaa={}; なら $aaa->{hoge}
ハッシュの順番を保持したい場合、Tie::IxHash とか使うと幸せになれるかもしれません。
リファレンスがわからんのにモジュールは酷だろw
スクリプトで定義した文字列を配列に入れる処理をサブルーチンの呼び出しの度にやっていたんだけど、 グローバル変数 (中括弧で囲われていない部分で my 宣言) にして 1回書き込むだけにしたら、 スクリプト全体の実行速度が 10倍以上になった。 my @dasabase = ( ['aa', 'ab', 'ac', 'ad'); ['ba', 'bb', 'bc', 'bd'); ['ca', 'cb', 'cc', 'dd'); ['da', 'db', 'dc', 'dd'); ); みたいな 5KB 程度のデータを多次元配列にいれてるだけなんだけど、(サブルーチンの呼び出し回数は 500回ぐらい) Perl の配列処理が遅いのか、5KBのデータが重いのかは知らないけど、今時のハイスペックなマシンでも、ただ短いデータを代入するだけの処理で リソース食いつぶしたりするもんなんだね。
掲示板を作成しているのですが、とある事情で、ログファイルを完全に公開したいと考えています。 記事修正用のパスワードはユーザ任せにするわけですが、crypt 関数でハッシュ化したものを記録すると ログに記載されたパスワードのハッシュからパスワードクラックされる危険はどの程度あるのでしょうか? (パスワードは6文字の英数字の場合) また、crypt よりも安全な一方向関数はありますでしょうか? よろしくお願いします。
>>547 今時のPCだとcryptで6文字とかそらもうあっさり解析される。
とりあえずお手軽なところではMD5あたりだと思うが、
そもそもパスワードのログだけ別ファイルにすれば良くね?
ログファイルを第三者に完全公開する「とある事情」って何だ それによってアウローチが変わると思われ
saltを $1$........$ みたいな形で与えると、別の形式でcryptしてくれたりするみたいだね。
ハッシュ化したものを生でログに置くからすぐばれる。 XORなどのビット演算で数回かき回したものを置けば、元のパスワードは判別不能になる。 もちろん、かき回しロジックを公開しては意味がない。
アルゴリズムを隠すことによる秘密はよくないよ。
553 :
547 :2006/12/28(木) 09:53:44 ID:???
>>548-549 回答ありがとうございます。
操作性とスクリプトの簡略化のために、トリップキーと削除・編集パスワードを同じものにしたいので、
必然的にパスワードを一方向関数で変換した値は公開されちゃうんです。(トリップとして)
tripper のようなトリップ解析ツールでも6文字なら1日以内に解読できちゃうので、やはり危険ですよね。
>>550 なるほど
http://www.tohoho-web.com/wwwperl2.htm#crypt そうすればMD5が使えるみたいですね
>>551-552 自分のサイトだけで使ってるならかき混ぜでもばれなさげですね。。。
まぁ基本的に隠蔽によるセキュリティはよくないですが。
よく考えてみると、トリップとして公開するデータをパスワードの一方向関数変換結果の一部にしちゃえば
解読が困難になりそうですね。
ありがとうございました。
554 :
nobodyさん :2006/12/28(木) 13:58:02 ID:hVZzWyfv
いろいろなソースを見て勉強しているんだけど、コンストラクタで my $self = {}; my $self = []; この2通りの記述を見ました。 {}と[]の違いってなにかあるんですか? あと、それらに空要素を入れる場合、=0や=''ではなく={}や=[]とする理由も加えてご教示願います。。。m(_ _)m
$aaa={}; # ハッシュリファレンス $aaa=[]; # 配列リファレンス @aaa=(); # 配列 $aaa=''; # スカラー
557 :
nobodyさん :2006/12/28(木) 14:16:08 ID:hVZzWyfv
>>555-556 ありがとうございます!
参考サイトは10回ブックマークに登録しました。
現在、Shift-JIS(CP932)しか読み込めない windows上で動作するアプリケーションで使用するテキストを出力するCGIを作っています。 (スクリプトのエンコードはEUCJP)。 現時点では次のような処理をしています。 投稿ページをEUCのHTMLで出力 ↓ 投稿ページからPOSTされた文字列を加工して Shift-JIS(CP932)に変換してテキストファイルに保存 (変換にはJcode::CP932モジュールを使用) ↓ テキストファイル(CP932)を読み込んでEUCに変換して整形してHTMLに出力 (変換にはJcode::CP932モジュールを使用) 自宅鯖で使う分には良いのですが、Jcode::CP932モジュールは殆どの鯖に入ってないので、 レンタルサーバで使うにはモジュールの追加を依頼する必要があります。 そこで質問です。 1、バージョン5.8のperlの標準的なモジュールのみでEUC-JPとCP932の相互変換は出来ますか。 もし出来るなら方法を教えてください。 2、Encode.pmでCP932とEUCJPの相互変換は出来るのか、出来るなら方法を教えてください。 3、スクリプトをUTF-8で記述して、use utf8を使用してCP932とUTF-8を 相互変換したほうが良いのでしょうか。 その際、CP932とUTF-8を相互変換は標準的なモジュールのみで可能でしょうか。
Jcodeはパス通せば置くだけでしょ
>>559 Jcode-CP932っての探して見てみたが
>>560 の言うとおりインストールしてもらう必要は無い。
libディレクトリ以下適当にコピーしてuse libなりなんなりすれば動く。
1.
極端な話自分で変換テーブルを用意すれば変換できるわけだけれど、
CP932との変換機能が用意されているかと言えばNO。
2.
可能。非標準モジュールEncode-EUCJPMS。但し要コンパイル。
3.
私はそっちのほうが好きではあるが別にその必要は無い。
変換については1,2のとおり。
Windows Vistaのお陰でUnicode関係の変換がさらに面倒になるね
563 :
nobodyさん :2006/12/28(木) 22:47:30 ID:/nHSB5ow
かなり初歩的なことかもしれませんが・・ CGIでパラメータを受け取る時に、ハッシュテーブルに入る変数の数が 不定の場合に、ループ処理を使って、うまく値を取り出すにはどうしたら 良いでしょうか。 パラメータ↓ aaa=テキストa&bb1=テキストb1&bb2=テキストb2&..bbx=テキストbx&ccc=テキストc bb1〜bbxまでの値を取得したい・・。 良い方法がありましたら、ご教授よろしくお願い致します。
564 :
563 :2006/12/28(木) 22:54:40 ID:???
え、っと自己レスです
>>563 わざわざハッシュにしなくても、bb1〜bbxだけ普通の配列に入れたらイイ?
良案お待ちしておりますー。
>>563 <form name="bb[]" value="テキストb1" />
<form name="bb[]" value="テキストb2" />
<form name="bb[]" value="テキストbx" />
みたいにしておいて、パラメータ解釈時に/(.*)\Q[]\E$/な要素を
push @{$params{$1}}, $value;
するのが常套手段ではないかと。
うわぁ、HTMLミスってるorz s/form/input type="text or hidden"/g
for my $bb_keys (grep /^bb./, keys %hash) { : : } とか?
>>561 おれ、
use Encode qw(from_to);
from_to($hoge, 'cp932', 'euc-jp');
from_to($hoge, 'euc-jp', 'cp932');
で変換して使ってるけど、非標準モジュール入れた記憶ないなあ。
569 :
561 :2006/12/29(金) 01:31:54 ID:???
>>568 あーごめんなさい。
>>561 は撤回…完全に記憶違いです…
CP932との変換テーブルはデフォルトで入ってるのか。
無いのはMicrosoft仕様のEUCJP-msね。
丸囲み文字とかローマ数字とかそういうやつがEUCJPに変換できないのか…
1. EUC-JPとの変換はできるが一部CP932が拡張している一部の文字について変換できない。
2. 可能。完全に変換するためには非標準モジュールEncode-EUCJPMS。但し要コンパイル。
3. 標準モジュールのみで可能。
で合ってるかな…まあなんにしろ一度派手に記憶違いしてた人の回答なんて
信用できませんので誰か詳しい人お願いしますillorz
>>560 ,561
パスを通せば動くんですか。。。
use libの使い方が良くわからなかったので、検索しました。
結構使えそうですね。ただ、コンパイルの必要なモジュールには使えないかも。
use utf8にも挑戦してみます。
use utf8を知る前に投稿を受け取る部分を作ったので
文中で正規表現で2バイト文字を使うために\nxx\nxxで文字を記しているので
面倒になるかもしれませんが。
>>568 Encodeでも可能なんですかね。ちょっとやってみます。
>>569 Jcode::CP932では上のほう(
>>404 )で話が出ていたAケもOUも上手に変換できていたので
もしかしたらいけるかもしれません。ちょっとやってみます。
#文字コード変換は鬼門ですね。
結果です。 まず、use Encode qw(from_to);での結果。 from_to($huga, 'cp932', 'eucjpms'); ダメでした。 AケOUと続けて記入したデータが??????に化けました。 次にEncode::EUCJPMSを読み込ませた上で ↓のように記述してみました。 from_to($huga, 'cp932', 'eucjpms'); これもダメでした。Aケが全角空白に変換され OUと出力されてしまいました。 3、のuse utf8は時間が掛かるので明日にでも全改修してやってみます。
失礼。全角空白ではなく FD FF FD FF FD FF という良くわからない文字列でした
>>572 from_to($ds, 'cp932', 'cp51932');
OKでした。でも、このcp51932ってエンコードって5系perlには標準で入ってましたっけ。
EUCJPMSはロードしなくても出来たので、最新版のEncodeでは標準のようですが。
>>574 私の使ったEncode::EUCJPMSをロードしないと言うのは
use Encode::EUCJPMS
と、記述しないと言うことですが。。。
って、use Jcode::CP932を書いたままでした。
Jcode::CP932内でEncode::EUCJPMSを呼んでるので動いたのでしょう。
となると、標準モジュールのみでやるにはやはりuse utf8プラグマをつけないとダメってことですかね。
それでも動くかどうかは判らないですが。
超低レベルな質問かもしれませんが、お願いします。 現時点でhtmlで簡単なサイトぐらいなら作れる、人並みの脳みそを持った人が、 仕事の合間を縫ってそれなりに勉強して、Perlを使ったCGI(初歩的な掲示板など) をゼロから作れるようになるには何ヶ月ぐらいかかりますか? 個人的な感覚で構いませんので、どう思うか教えて下さい。
578 :
577 :2006/12/29(金) 05:58:43 ID:???
あ、プログラミングの経験が普通の高校で習った程度しかないなら、1ヶ月間ぐらいで。
条件が曖昧過ぎるからなんとも言えないけど やっぱ1ヶ月ぐらいかなー
最初のプログラミング言語としてperlを選択するのは止めなさい。 一生perlしか使わないつもりなら止めないけど。
581 :
563 :2006/12/29(金) 10:51:17 ID:???
>>565 ,
>>567 ありがとうございます。実はPerlは今週はじめたばかりで、
そんな風に出来るんだ〜・・などと感心してました。
で、この結局こんな感じで進めました。
if($key =~ /^bb\d$/){ push @bb_vals, $val; } #キーが"bb[0-9]"の処理
elsif($key =~ /^dd\d$/){ push @dd_vals, $val; } #キーが"dd[0-9]"の処理
else{ ハッシュテーブル作成 }
@入力フォームに、ラジオボタンが数種類 × 数グループあったので、
nameを同じにすると ややこしい感じに
Aフォームの順番も重要だったので、順不同なkeysは今回は使いにくそう
な感じでした。
これからまた、お世話になるかもしれません。よろしくお願いします。
>>576 プログラムかUNIX系の知識があれば、一週間もあれば。
それ以外であれば、やっぱりひと月でしょうねー。
何を習得するにも、
>>580 みたいな意見には惑わされないように。
俺も580と同意見だな。 やるならCから入った方がいい・・・と、Cから入った俺がry
580=583 スレ違いカエレ
>576 1ヶ月あれば形になると思う。あとHaskellやろう。
>>576 週末全部充てれば一ヶ月もあれば習得できるかもしれないが、
BBS一個作るとなると+2ヶ月はかかると思われ
というかググる力というか、検索力があればけっこう短期間で形にはなる
588 :
576 :2006/12/29(金) 19:38:01 ID:???
>>577-579 ,580-583,585
回答ありがとうございます。
現状私は、htmltとcssとJavascriptが
本当に「できる」と言っていいのかすらわからない程度にできます。
それ以外は一切できません。Perlを使ったフリーCGIのソースをいじくり回す程度です。
仕事でWebデザインぽいことをやってますが、デザインだけではどうにもこうにもアレなので、
CGIを習得しようと思い、CGIと言えばPerlだろという考えで書き込みました。
純粋にプログラミングというより、あくまでもCGIを作るための言語を学びたいので、
WebProg板に来た次第です。
仕事が忙しいので、自習は週4日、1時間程度で考えています。
みなさんを信じてまずは1ヶ月がんばります。
そこで、
>>1-10 あたりにあるサイト以外で、オススメのサイト、
書籍、「その前にまずこれをやれ」的なことなどありましたら教えて下さい。
>>584 図星を突かれた使えないperlerがなんかほざいてるな。
>>588 とりあえず、KENTは参考にしてはいけない。それだけは言える。
>>590 追加で、結城浩も宗教色を強めてきてきもいので参考にしないほうがいい。
>>588 >「その前にまずこれをやれ」的なことなどありましたら教えて下さい。
こんなとこで回答期待してないでさっさと着手しろ。
そういうやつに限って始めるまでが長くて結局何も出来ない。
594 :
576 :2006/12/29(金) 22:08:25 ID:???
>592 じゃあ逆にお勧めのPerlishって誰?
>>595 お勧めの人を作らないことがお勧め。
特にPerlの場合は、いろんな書き方があるから、いろんなコードを読んでおいたほうがいい。
このスレを見るのがためになると思う。
答える側になっても、ここではまだまだ新しい発見があるし。
lヽ ノ l l l l ヽ ヽ )'ーーノ( | | | 、 / l| l ハヽ |ー‐''"l / P | | |/| ハ / / ,/ /|ノ /l / l l l| l P ヽ l ・ i´ | ヽ、| |r|| | //--‐'" `'メ、_lノ| / ・ / | B l トー-トヽ| |ノ ''"´` rー-/// | B | | ・ |/ | l ||、 ''""" j ""''/ | |ヽl ・ | | P | | l | ヽ, ― / | | l P | | !! | / | | | ` ー-‐ ' ´|| ,ノ| | | !! | ノー‐---、,| / │l、l |レ' ,ノノ ノハ、_ノヽ / / ノ⌒ヾ、 ヽ ノハ, | ,/ ,イーf'´ /´ \ | ,/´ |ヽl | /-ト、| ┼―- 、_ヽメr' , -=l''"ハ | l ,/ | ヽ \ _,ノーf' ´ ノノ ヽ | | 、_ _ ‐''l `ー‐―''" ⌒'ー--‐'´`ヽ、_ _,ノ ノ  ̄ ̄ | /
PBPはDamian Conwayか。参考になるきれいなコードだった。
599 :
nobodyさん :2006/12/30(土) 10:22:00 ID:2X8njGUn
>特にPerlの場合は、いろんな書き方があるから、いろんなコードを読んでおいたほうがいい kent(と、その属性のクローン)だけは外す事を明記するのを忘れている 俺は、それで散々な目にあったから いゃ、俺だけではないが
Perlでコンソール上で動作するプログラムを構築したとき、 画面などのデザインを変更するプロパティみたいなのってありますか? 教えてください。 スレ違いなのは承知の上です。
rawモード用のモジュールみたいなのはCPANにあったと思う。
標準モジュールにTerm::Capがあるな
605 :
nobodyさん :2006/12/31(日) 02:44:28 ID:oF4MMStz
あるハッシュ%hashが、 %hash = ( a => 変数, b => 配列のリファレンス, c => 変数, d => 配列のリファレンス, e => 配列のリファレンス, ... ); であるとき、ループで%hashのvalueだけを評価して、もし配列のリファレンスであればその配列を展開する・・・という処理はどうすれば良いでしょうか。
606 :
nobodyさん :2006/12/31(日) 02:48:12 ID:oF4MMStz
事故解決しました。。。 while (ref(values(%hash)) eq 'ARRAY') { ... } という処理を使うことにします。 ・・・間違ってるのかな?
607 :
nobodyさん :2006/12/31(日) 04:17:23 ID:oF4MMStz
やはり上手く行きませんでしたonz %hash = ( a => 'あああ', b => [ { c => 'いいい' }, { d => [ { e => 'ううう' } ] } ); このようにハッシュのvalueに幾度(無限に)も配列のリファレンスがネストしてあるとき、どのようにすれば下層部のハッシュ(上記の場合e => 'ううう')が取り出せるのでしょうか?
609 :
nobodyさん :2006/12/31(日) 10:33:33 ID:oF4MMStz
>>608 試してはみたんですが、出来ませんでした。。。
端折ると↓のようにしてみたんですが
sub aaa {
foreach () {
if (ref()) {
&aaa();
} else {
普通のしょり
}
}
}
引数
くだらない質問で申し訳ありません。 【書き方1】 function check() { if ($x == 2) { print "Xは2です。"; } elsif ($x == 5) { print "Xは5です。"; } else { print "Xは2でも5でもありません。"; } } 【書き方2】 function check() { if ($x == 2) { print "Xは2です。"; } elsif ($x == 5) { print "Xは5です。"; } else { print "Xは2でも5でもありません。"; } }
612 :
611 :2006/12/31(日) 17:05:01 ID:???
みなさんは上記の 【書き方1】 と 【書き方2】 のどちらが好きですか? 自分は 【書き方2】 で理由は、 ・開始括弧と終了括弧が揃っている。 ・開始括弧の行が空く (括弧だけの行ができる) ので見やすい。【書き方1】 だと空行入れるべきか入れないべきかで毎回迷ってやりにくい。 ・elsif の行がスマートになる。 です。 皆さんのお好み、または標準のコーディングルールがあれば教えて下さい。 あと、自分はインデントはタブで、タブは半角スペース4つ分にしていて、文のあとにコメントを入れる場合にはタブ1つあけることにしていますが、 こちらについても教えていただけたら幸いです。
>>611 ベストプラクティスでは、「重要なのは、首尾一貫したスタイルを1つ採用することである。」としたうえで
レイアウトガイドラインの「提案」として、K&Rスタイルを採用しているね。つまり
if ($x == 2) {
print "Xは2です。";
}
elsif ($x == 5) {
print "Xは5です。";
}
else {
print "Xは2でも5でもありません。";
}
こう。んで、タブを使わず半角スペース4つを1インデントとしている。
個人的にも、特にこだわりはないので、このベストプラクティスを標準としてるなぁ。
ただ、チーム開発の時はチームのコーディングルールに合わせるけど。
でも、Perl は TMTOWTDI がモットーなんだし、好きな書き方で良いと思う。
614 :
611 :2006/12/31(日) 17:55:49 ID:???
>>613 なるほど
回答していただきありがとうございました
標準的なコーディングルールを使ったほうが他の人と共有する場合や配布する場合には便利ですね。
> タブを使わず半角スペース4つを1インデントとしている。
これに関しては、自分が使っている 「phpエディタ」 も 「TeraPad」 も Tabキーで半角スペースを4つ入れる機能がないので
不便でしょうがないです(´・ω・`)
半角4つにすると、インデント消す時バックスペース4回も押すのマンドクセ
最近のエディタならたいがいバックスペースでアンインデントできるようになるでしょう
こん↓な時タブを使われると、環境によってずれるから嫌な気分になる。 abcd = 1 + 2 + 3 + 4 + 5;
こんな感じかな。 use strict; use Data::Dumper; my %hash = ( a => 'あああ', b => [ { c => 'いいい' }, { d => [ { e => 'ううう' } ]} ] ); parse(\%hash); sub parse { my $tmp = shift; #print Dumper $tmp; if (ref $tmp eq 'ARRAY') { foreach (@$tmp) { parse($_); } } elsif (ref $tmp eq 'HASH') { foreach (keys %$tmp) { parse($tmp->{$_}); } } else { print "$tmp\n"; } }
@a = qw{ a b c d e }; @b = qw{ 1 2 3 4 5 6 }; @array = \(@a, @b); こんな風になっている場合、@arrayから@aの要素数にアクセスするにはどう書けばよいでしょうか。
scalar @{$array[0]}
621 :
619 :2006/12/31(日) 22:45:49 ID:???
>>620 ありがとうございます。
今年終わる前におしえてもらえてよかった・・・(T_T)ノ
よいお年を。
622 :
nobodyさん :2007/01/01(月) 20:57:03 ID:QvA3S+in
あけましておめでとうございます。新年初の質問です。どうぞよろしくお願いします。 #####書き換え前##### # メッセージ内で使用を禁止する言葉の処理 if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password) {@ngword = split(/\s+/,$ngw); foreach $ngw (@ngword){ if ($FORM{'value'} =~ /\Q$ngw\E/i){ &error('メッセージ内に使用禁止ワードが含まれています。');}}} #####ここまで##### ☆備考☆ $ngw = 'テスト test TEST'; これをファイルを読み込み形式にしたいと思い↓のようにしました。 #####書き換え後##### if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password) {if ( !open(NGW, "$spamdata") ){ &error('0');} @xx = <NGW>; foreach $ngw (@xx){ @ngword = split(/,+/,$ngw); foreach $ngw (@ngword){ if ($FORM{'value'} =~ /\Q$ngw\E/i){ &error('メッセージ内に使用禁止ワードが含まれています。');}}}close(NGW);} #####ここまで##### ☆備考☆ $spamdata = 'spamdata.cgi'; ※質問 そこで、foreach $ngw (@xx){}とforeach $ngw (@ngword){}が重複しているようで、 表記としておかしくないか疑問に思いました。 なにぶんPerlの知識も経験も乏しいもので、チェックをお願いします。 より適切な表記の仕方があったらご指摘も戴けるとうれしいです。 備考 spam対策のために禁止語句をCGIファイルから読み込みたいと思い書き換えました。
では新年初のスルーで
>>622 >そこで、foreach $ngw (@xx){}とforeach $ngw (@ngword){}が重複しているようで、
>表記としておかしくないか疑問に思いました。
そりゃどう考えてもおかしい。perlに限らずプログラミング一般論として。
>spam対策のために禁止語句をCGIファイルから読み込みたいと思い書き換えました。
CGIの意味知ってる?
そこは単にテキストファイルでしょ。なんで、そんなファイルの拡張子に".cgi"付けるの。
新年早々猪突突進か
ファイルの拡張子なんか何だって良い。
http server が拡張子に影響されないなら良いが、".cgi" だと影響受けるだろ。
拡張子cgiは、htaccessを使わず(使えない場合も)、ファイルの中身を見せない簡単な方法だね。 目くじら立てることでもない。
>>627 にも一理あるが、
>>622 がそこらへん理解してれば良いが。
こぢんまりしたサイトでは目くじら立てなくてもいいかも知れないが、
職業プログラマが製品レベルではやらないことだな。
俺は他人のデータを扱うときはHTTPから見えないところに置くけど、 自分だけのデータならランダムで32文字でつけたディレクトリにデータファイル入れたりしてる
>>622 とりあえず、2つのforeach文をそれぞれ同じ変数$ngwに入れてるみたいだから、それを別々にしてみよう。
一つ目を$ngw1、二つ目を$ngw2とか。
で、
if ($FORM{'value'} =~ /\Q$ngw\E/i){
を
if ($FORM{'value'} =~ /\Q$ngw2\E/i){
にしてみると大丈夫だと思うよ。
ライブラリファイルを読み込もうとしたのですが 『次のファイルを開こうとしています。』となって表示されません。 ライブラリファイルの拡張子は.plなのですが、保存したファイルは普通にダブルクリックで開けてしまいます。 .pl拡張子は何か特別な設定が必要なのでしょうか?
> ライブラリファイルを読み込もうとしたのですが どう読み込もうとしたのか。requireとかopenとか…ダブルクリックとか。 > 『次のファイルを開こうとしています。』となって表示されません。 これは自作メッセージ?STDOUTかSTDERRに出てるのか、UAの画面に表示されるのか。 CLIのお手軽アプリを作ったときに、こういうメッセージをprintしてファイルの中身をSTDOUTに吐く前に 無限ループにはめて先に進まなくなったことは何度もある。 # open(FH, '<', "hoge.dat"); flock(FH, 2); @buffer = <FH>; close(FH); # while (@buffer) { print 'while でなく foreach と書いたつもりの酔っ払い', "\n"; } 質問がWebProg関係なのかどうかも含めて、ちょっとよくわかんない。 .plだからとくにどうこう、ってのはないです。
633 :
631 :2007/01/02(火) 02:43:47 ID:???
634 :
622@解決済み :2007/01/02(火) 09:03:38 ID:5ekfui+1
>>624 >>630 ありがとうござます。↓昨日また少し考えてこんな感じになりました。
if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{if ( !open(NGW, "<$spamdata") )
{
&error('0');
}
flock(NGW, 1);
@xx = <NGW>;
close(NGW);
foreach $ngw (@xx){
@ngword = split(/,+/,$ngw);
foreach $ngwbb (@ngword)
{
if ($FORM{'value'} =~ /\Q$ngwbb\E/i)
{
&error('メッセージ内に使用禁止ワードが含まれています。');
}
}
}
}
ご協力ありがとうございました。
WINDOWSの鯖でファイルが書き込み可能かどうかを判断するにはどうしたらいいんですか? WINDOWS鯖の場合だと if (-w $write_file_path) { print "書き込み可能\n"; }というプログラムがが使えないんです
おいコラはやく答えろや 人間電卓どもが!!!
電卓すらも使えない人間がここに一人ry
パソコンよりレジや電卓のほうが難しいと思う
いや、計算尺の方が…
ふと疑問に思ったのですが、perlの最大計算桁数って何桁 なのでしょうか? そういえば1年前に5000兆まで計算させるシステムを作った のを思い出したのですが、その頃は最大計算桁数のことを 考えていなかったような気がするので質問させていただいた 次第です。 ご教示いただけますと幸いです。
use bigint すれば(PCのリソース内で)無限桁ですよ。
>>642 ご教示有難うございます。
ちょっと昔のソースを改変するのにもある程度理由を
つけなければいけないので、デフォルトで何桁まで
問題ないかもしご存知でしたら教えていただけますと
幸いです。
質問続きですみません。
C言語のlong相当、たぶん
Perlが組み込み型で扱う数値にはIV、UV、NVの3つがある。 IVはポインタが格納できることが保証される符号あり整数型、 UVはIVと同様の符号なし整数型。 そしてNVは倍精度浮動小数点型となっている。 えーとだからその処理系における不動小数点型の表現がIEEE 754だと仮定すれば、 倍精度浮動小数点型の仮数部は52bitで、 32bitマシンの場合は(恐らく)UVのほうが表現できる範囲が大きい(52bit - 15~16桁)。 64bitマシンの場合はIV/NVのほうが表現できる範囲が大きい(64bit - 18~20桁)。 かな。前に齧り読んだことと、ドキュメントの関連してそうな部分を 掻い摘んで読んだのを組み合わせただけなのであってるかどうかはわからん。 See also: perlguts
>>645 訂正
> 32bitマシンの場合は(恐らく)UVのほうが表現できる範囲が大きい(52bit - 15~16桁)。
> 64bitマシンの場合はIV/NVのほうが表現できる範囲が大きい(64bit - 18~20桁)。
ここ思いっきりUVとNVが逆になってる( ´д`;) 読み替え宜しく
1ずつ足して確かめるのオススメ
648 :
nobodyさん :2007/01/05(金) 04:06:51 ID:CAClPvdI
XML::Parserモジュールがどうしてもインストールできません。 最新のexpatもいれたのですが。。
that's too bad.
まったくの初心者ですみません。 ブラウザーからの入力に応じてcgiファイルを書き換えるcgiを作ってみたいのですが。 書き換える側のCGIのソースと書きこまれる側のソースが混ざってしまって バグがおきてしまいました。 書き込まれる側のソースにシングルクオーテーション、ダブルクオーテーション が含まれていて書き換える側のダブルクオーテーションで囲まれた間の部分に、 書き込まれる側のダブルクオーテーションが存在してしまうようです。 他にも変数を文字列として書き出せず変数の中身、つまり何も無いスカが書き出されます。 どうすれば良いでしょうか?
>>650 煽りではなく今の君には無理ってことかと。
そんなことする意味もないし。
>648 それだけじゃ何もわからん。OSは?Perlのバージョンは?Cコンパイラは持ってる?
653 :
650 :2007/01/05(金) 13:24:38 ID:???
perlを入門サイトなどで勉強中でして、ファイルを制御するのを今習っています。 とりあえずCGIからいろんなファイルに書き込むプログラムを色々と書いてみているのですが。 テキストやHTMLは上手く書き込めたのですがCGIのファイルは上手くいきませんでした。 CGIファイルへの書き込みは習っても意味が無いのでしょうか?
>>653 勉強するだけならいいけど実際に共有鯖等では実行しないで欲しいね。
リスクが高いです。他のユーザーに迷惑かける可能性大。
ヒント:パーミッション
他のユーザに迷惑かけないようにする仕組みはサーバー提供者が負うべき。 ユーザは許可されている事はなんでもやってよい。
他人に迷惑をかける行為は許可なんてされてませんよ? 実行可能=やってよいとか考えているわけではありませんよね^^;
人を殺してはいけないなんていう法律は無いから、人を殺してもよい
659 :
nobodyさん :2007/01/05(金) 20:31:05 ID:5w1bms+v
>> >648 >> それだけじゃ何もわからん。OSは?Perlのバージョンは?Cコンパイラは持ってる? OSはFedoraCore6 PerlVersionは v5.8.8 built for i386-linux-thread-multi Cコンパイラはあります。gcc -v で確認しました。 どうもexpat関係でエラーになっています。最新のexpatはいれたのですが。
>>653 の問題はパーミッションではなくて、クォートの問題じゃないのか?
'$' の前に¥でescapeしたり、ということで解決するんじゃないか。
それ以前にcgiがcgi を書き換えるという発想はどうなのよ。
動的にプログラムを生成する必要性はそうないんじゃないか。
>書き込まれる側のソースにシングルクオーテーション、ダブルクオーテーション >が含まれていて書き換える側のダブルクオーテーションで囲まれた間の部分に、 >書き込まれる側のダブルクオーテーションが存在してしまうようです。 >他にも変数を文字列として書き出せず・・・ 自分でわかってんじゃん
コンパイルの必要なモジュールをuse libで使うにはどうすればよいのでしょうか。
自己解決しました。 そのままで良いんですね。。。
CGI動的生成プログラムを"作る必要がある"プロジェクトに関わる者なら質問しないレベルだろう
つまり
>>650 は何か間違った設計をしてるんだろうと思う。
てか掲示板のログファイルの拡張子を .cgi にしたいだけとかでは
超低レベルな質問お許し下さい。 PerlによるCGIの参考書を買ってゼロから勉強中ですが、 下記のプログラム(参考書を丸写し)が動作しません。エラーコードは500です。 原因は何でしょうか? ・Perlのパスはレンタルサバのサイトで確認 ・ファイル名はindex.cgi ・OSはWinで、メモ帳で編集しFFFTPでUL ・パーミッションは755 #!/usr/bin/perl print <<_EOF; Content-type: text/html <html> <head><title>test</titel></head> <body> test </body> </html> _EOF
>>665 500エラーじゃ何も判らんし、そもそもレン鯖使って勉強するなといいたいが。
・FTPの時にASCIIモードで送って無い
・パーミッションがレン鯖指定のものと違う
・そもそもindex.cgiが使えないようになっている(別名でテストしてみ)
とかそんなあたりか。ソースそのものは問題ない。
タグでtitleの打ち間違いがあるくらいか。
メモ帳だと最終行末改行がないとか
もう出てるけど、 ・バイナリモードで転送した ・ヒアドキュメント終端文字列でファイルが終わってる(改行がない) 辺りが有力っぽい。
669 :
nobodyさん :2007/01/06(土) 20:23:33 ID:lBOtCkKI
掲示板の改造で、半角カタカナが本文に含まれる場合 エラーメッセージを出すようにしたいと思っています。 投稿されたメッセージ$messageに 半角カタカナが含まれているかどうかを判定する、というのは どう書けばよいでしょうか? 全角文字があるかどうかを判定ならググって出てきましたが・・・。
>>666 回答ありがとうございます。
>・FTPの時にASCIIモードで送って無い
FFFTPの環境設定に転送設定という箇所があったので、
「常にアスキー」に設定し、ULしなおしました。
>・パーミッションがレン鯖指定のものと違う
確認したところ、実行ファイルは700が推奨されていたのでそうしました。
705も試しました。
>・そもそもindex.cgiが使えないようになっている(別名でテストしてみ)
確認したところindexで問題ないようですが、test.cgiに変更しました。
ですが、動作しませんでした。
671 :
665 :2007/01/06(土) 20:31:56 ID:???
>>666-668 最後に一回改行を入れてからULしたら動作確認できました!
回答ありがとうございました!
672 :
669 :2007/01/06(土) 21:04:52 ID:???
もっと探したらみつかりました。ごめんでした。 ・・・が、さらに質問です。 名前とタイトルに含まれる半角カタカナは全角に変換でいい。 そこでログに書き込むサブルーチンregistに、 &jcode'h2z_sjis(*name);#$nameの半角を全角に &jcode'h2z_sjis(*subject);#$subjectの半角を全角に と書いたのですが、名前のほうが変換されません。
それだけで全てをわかってくれるエスパーさんが来るといいね
30字くらいのパスワードを暗号化したいのですが、
モジュールのインストールなしに出来る方法はどんな方法があるのでしょう。
今はuse libとuse Crypt::CBCとBlowfish_PPでやっているのですが、どうしても遅いので
もう少し早くできると良いのですが。
>>662 でlinux上で単純にコンパイルしてそのままautoディレクトリをコピーしてやれば良いのかと思って
コピーしてみましたが
Blowfish.so: undefined symbol: Perl_Gthr_key_ptr
こんな感じのエラーが出てしまいました。
Blowfish_PPとBlowfishでは速度が違いすぎるので、出来ればBlowfishの方を使いたいのですが、
どうすれば使えるのでしょうか。
ちょ、パスワードをなんのために暗号化するのさ
xor暗号最強
>>672 同じ文字列入れてnameの方だけ変換ないってんなら
おまいが間違ってるとしか言えん。
>>674 モジュール無しで、ということだけならopensslに投げるという手もある。
モジュールのほうが速いと思うけど。
>>674 手順はそれで間違ってないと思うのだけれど
・make testは通ったのか
・perlのバージョン
を
>>675 拡張子をcgiにすればファイルの中身を見られることもないのですが、まあ気休め程度に。
>>677 すみません。解決しました。
サーバーとローカルのperlのバージョンが違ったためにモジュールのバイナリを使用できていなかったようです。
サーバーとローカルのperlのバージョンをそろえてコンパイルしなおしたらそのままコピーでuse libしたら
出来ました。
>>645 レス遅れましたが、本当に有難うございました。
検証もしてみましたので検証報告も兼ねさせていただきます。
結論から申し上げますと、16桁目の4以上、つまりは4000兆
くらいから計算が狂ってきました。
これは645さんのおっしゃる32ビットマシンの性能ということ
に当てはまったのではないかと思いました。
ご丁寧に有難うございました。
>>679 どうもです。
まさにバージョンでした。
毎度お世話になっております。 Mac OS X PantherのTerminal上にて運用する予定のPerlスクリプトをMac OS X Tigerにて作っています。 指定されたディレクトリの中にある1万個程度のテキストを片っ端からチェックして、 ある特定の文字列があったら別の文字列に置き換えて保存するという処理なのですが、 一部ファイル名の最後の文字がスペースのものがあった場合に それらの展開に失敗する(最後のスペースが無いものとしてファイルを開こうとする)ようです。 ファイル名の最後のスペースを認識させるにはどのような方法があるのかご教示頂けますと幸いです。 よろしくお願いいたします。
3引数openで開けばいいんでないの
何となく板違いの伊予柑♪ panther も tiger も5.8.xなのでバージョンの違いとか、OSの違いによるもんじゃないと思うそ。
Tiger(perl v5.8.6)で試してみたけど、3引数openなら大丈夫だった。
2引数openはファイル名の前後にあるスペースを削っちゃうのよね 案外知られてないのかな
>>684 とりあえずやってみたのがファイルのパスを' 'でくくるとか
" "でくくって\を付けるとかくらいなもので…
>>685 デキタ━━━━━━(゚∀゚)━━━━━━!!!!
何でなのか理屈がよく分かりませんができたっぽいです。
迅速なお答え、本当にありがとうございました!
690 :
683 :2007/01/07(日) 20:52:01 ID:???
>>686 ご察しの通りPerlの仕様だったようです。
これでPantherのPerlが5.6だったりしたら路頭に迷うところでした。
>>687 検証して頂きありがとうございます。
おかげさまで何とかなりそうです(*´∀`)
>>688 Perlは一応それなりに馴染んでいたつもりだったのですが
今回の件には完全にやられました。もっと精進します。
マック欲しい…
jcodeg.pl使うと半角カナを化けずに使えるけど、これって問題ある?
unicodeなりeucで書いておけばとりあえず半角だのなんだの気にしなくてもかまわんでしょ
697 :
693 :2007/01/09(火) 02:24:52 ID:???
ん〜サイト全体(CGI以外)がS_JIS。 EUCはブラウザのミスによる文字化けがあるから嫌なんです(タブブラウザにしなくていいからこっちを先に治せM$)。 CHARSET設定していながら何かの拍子に化ける→エンコードし直しうざい それに半角カタカナを使えるようにしたいのではないので。 ・・・大体、半角カタカナを使って書く言葉って、あまりいい意味の言葉じゃないですよね。
698 :
697 :2007/01/09(火) 02:37:18 ID:???
しかし問題ありなんですね・・・
>>694 tr使ってもダメだと書いてあるページを見つけました・・・
もともとのスクリプトではフォームデコードに
&jcode'h2z(\$value);
があって、投稿した半角カタカナは全て全角に変換されるんですが
これだと「・・・」まで変換されて(個人的に)変な感じがする。
しかもこれはカタカナではない記号ですしね。
で、他に方法はないかと思ったのですが。
半角→全角は諦めるしかないみたいですね。
レスありがとうございました。
サイト全体がSJISだからCGIもそれにあわせるとか、まったく意味の無い統一の仕方なのだが・・・ どうしてもあわせたいならHTMLをunicodeにしちゃえよ
use utf8をやればtrでも行ける。 後は濁点付きを適当に置き換えれば。
>>699 SJISだから合わせるとかなんとかってのは無視してくださいな。
そんなことどうでもいい。
とにかく半角カタカナを使ってもらいたくないというのと
半角カタカナを2ちゃん以外の場所で見たくないってだけ。
半角カタカナがあればエラーってのもやってみたし
半角カタカナを全角変換もやってみたけど
カタカナじゃないやつまで処理してしまうというのが・・・ってだけの問題。
そんなに半角カナを嫌わんでもw ナンテイウカ タンナル アレルギー ニ シカ ミエナイ カンシ ゙ダナ
正しいパスワードを入力したはずなのにエラー(´・ω・`) 何処か一文字間違ってるんだろうけど何処が間違ってるか分からない、といったユーザの不満を解消すべく ショッピングカートの改良しようと思っています パスワードのMD5ハッシュをDBに保存するロジックを平文での保存にすることは簡単にできたので、 あとは何処がが間違っているかをユーザに教えるロジックを作ればいいんですが、どうするのがユーザビリティ的に好ましいでしょうか? 正しいパスワードとユーザ入力のパスワードが同じ文字数の場合には、 正しいパスワード "hoge2CH" の時、ユーザが "hoge2ch" と入力したら、 「パスワードの6文字目・7文字目が間違っています。」 と返す、のように簡単にいくんですが、 正しいパスワードが "hoge2CH" の時、ユーザが "hoge2C" と入力した場合に、 貴方がユーザだとしたらどういうエラーが返って来て欲しいかを教えて下さい。
>>703 はそんなことをしたら恐ろしく少ない回数の試行で
パスワードが特定できるということを解っているのだろうか…
>>704 間違いが一定文字数以下の時だけヒントを出すようにすりゃ大丈夫じゃね?
>>703 > 貴方がユーザだとしたらどういうエラーが返って来て欲しいか
正しいパスワードそのものを表示して欲しいな。
パスワードがわからない時は該当IDのメールアドレスに パスワード送信できるようにすれば
>>702 >>697 >・・・大体、半角カタカナを使って書く言葉って、あまりいい意味の言葉じゃないですよね。
はい、いい意味じゃない言葉。
m9(^Д^)プギャー ( ´_ゝ`)フーン ( ゚д゚)、ペッ( ゚Д゚)ヴォケ!!
('A`)マンドクセ ( ´,_ゝ`)プッ
顔文字だけでこれだけありますね。
顔文字だけならДゝあたりをNGにすればいいですが、顔文字なしで
使う場合もある。
NGワードに半角カタカナを指定すると誤爆しまくるのでダメ。
#ギあたりでひっかかる
ところでjcode.plのマニュアルってなんで英語なんだ。 日本人だよね?作ったのって。 ;#$jcode'h2zf{'xxx'} ;#These are pointer to the corresponding function just ;#as $jcode'convf. これなんかどういう意味?どういう使い方するわけ? 訳はできても使い道がわからないんだが。
見たまんまだし、日本語マニュアルあるし、今時jcode.plを使うのもどうかと
>>711 まだまだJcodeが使えなかったり、Perlのバージョンが古いままの鯖はたくさんある。
>>713 -i相当のことをやるのはめんどくさいので、system使えばいいんじゃない?
>>713 単に「perlスクリプト内でしたいの」であれば1行毎に
$var =~ s/¥r¥n/¥n/;
をすれば良いのだが、
>>714 が読み取ったように、
「ファイルの読み書きやらデータのIOをどう処理したら良いか」
ということを聞きたいのか?
>>713 要はWindowsの改行コードをUNIXのものに変えたいということじゃないの?
$textに問題の文字列が入っているとしよう。
$text =~ s/\r\n/\n/g; # Perl
これで$text内の全ての\r\nが\nに変換される。
これはPHPでいう以下のいずれかの構文と同じ処理になる。
$text = preg_replace("/\r\n/", "\n", $text); // PHP: 意味合いとしてはこっちがより正確だが
$text = str_replace("\r\n", "\n", $text); // PHP: PHPではこっちがより推奨される
問題がWindowsとUNIXだけなのであれば、単純に\rを排除するだけでも良い。
$text =~ s/\r//g; # Perl
これはPHPでいう以下のいずれかと同じ処理。
$text = preg_replace("/\r/", "", $text); // PHP: 意味合いとしてはこっちがより正確だが
$text = str_replace("\r", "", $text); // PHP: PHPではこっちがより推奨される
が、これにMacが絡むと改行コードは\rだけだったりすることもありうるわけで、
単純に\rを排除していてはMacでは改行が全て消えて無くなってしまう。
より汎用性を求めるなら以下のようにすべきだろうね。
$text =~ s/\r\n/\n/g; # Perl1: Win -> UNIX
$text =~ s/\r/\n/g; # Perl2: Mac -> UNIX
これはPHPでいう(以下略
$text = preg_replace(array("/\r\n/", "/\r/"), "\n", $text); // PHP: 意味合いとしてはこっちがより正確だが
$text = str_replace(array("\r\n", "\r"), "\n", $text); // PHP: PHPではこっちがより推奨される
もしくは
$text =~ s/\r\n|\r/\n/g; # Perl: 上の1と2をまとめたもの
これはP(ry
$text = preg_replace("/\r\n|\r/", "\n", $text); // PHP: 配列を使わない場合
>>713 以下を hoge.pl で保存
=======
#!/usr/bin/env perl -i.old -p
s/\r\n/\n/ ;
=======
$ perl hoge.pl hoge
じゃダメか?w
しかしソース元の -npe ってなんだかなあ
=====
#!/usr/bin/env perl
for my $name ( @ARGV ){
open IN, $name or die ;
my $data = do { local $/ ; <IN> } ;
close IN ;
rename $name , $name . '.old' ;
$data =〜 s/\r\n/\n/g ;
open OUT, '>' . $name ;
print OUT $data ;
close OUT ;
}
=====
しまった、サファリでカキコしてしもうた。全角バックスラッシュは 単なるバックスラッシュに脳内置換よろ
>>714-715 レスありがとうございます。
perlのスクリプトをちょっと改造したい
(ある変数内のデータから^Mを削除したい)のですが、
systemとかを使うと、ほかの部分も弄る必要性が出てきそうで、
現時点の自分のperl能力からはできれば避けたいと考えてます。
PHPなら下みたいな感じでよい気がするのですが、
同じことをperlではどうすればいいでしょうか。
perlは変数宣言とかが厳しいと聞いたことがありますが、
ほかはphpと似たようなものでしょうか?
$file_array = file( $file_path );
for($i=0; $i<count($file_array); $i++){
$file_array[$i] =~ s/\r\n/\n/;
}
$file_data = implode("\n", $file_array);
そのプログラム、ある変数から\rを削除してるだけには見えないのだが。 $file_pathに格納されたパスにあるファイルを開いて読み出し、 各行の\rを削り、さらに各行をさらにもうひとつの\nをはさんで つなげているような。 そもそもPHPとかperl以前に、自分が何をやりたいのか、何をやろうと しているのかを的確に理解して説明する能力を身につけるべきな気が するぞ。
>>718 rep2マジお勧め。
>>719 その構文だと各行の間が"2つの"\nで連結されてしまうけどそれでいいのかな?
open(FILE, $file_path);
@file_array = <FILE>;
close(FILE);
for (my $i = 0; $i < @file_array; $i ++) {
$file_array[$i] =~ s/\r\n/\n/;
}
$file_data = join("\n", @file_array);
>>721 おまいも
>>719 見てからレスれw
ただいまより、語尾にレスれとつけるスレとなりました。 ネスレじゃありませんよレスれ
半角カナはマルチなんだな。 スルーで。
くっそー移転してるの気づかなかった
>>712 軽く確認してみただけけれども、ファイルコピーだけで5.005でもJcode動いてるような。
5.005よりも古い鯖って見たこと無いのだけれどそんなにあるんですか?
直リンしてもた、吊ってくる
729 :
650 :2007/01/09(火) 20:30:53 ID:???
>>654 アドバイスありがとうございます。
>>660 やはりそれが原因でしたエスケープで解消しました。
>>664 CGIでCGIファイルを書き出す必要性が頭悪すぎてよくわかりませんorz...
ですがいずれそういう必要性が無いとも限らないので作ってみようと・・・
たとえばホームページを春には桜吹雪の演出、夏は魚が泳ぎ、秋には紅葉が降り、
冬には雪が降るような演出をするとします。
このページそのものがHTMLでは作れそうに無いのでHTMLではなくCGIの
ファイルだとします。
そのページを季節に合わせるためFTPを使わずに更新するには更新用のCGIの
ページからCGIのファイルを更新すれば出来るみたいなー感じでいいのかなと。
でも、もっと簡単な方法がありそうですね。
>>729 もしかしてJavaScriptとCGIの違い分かってないのでは?
むかし、覚えた手の頃だったか。 処理速度あっぷのためにif分などの分岐をなくそうとcgiからcgiを書き出してたなぁ・・・。 今ならテンプレートを読み替えるだけで済むなぁ。
>>650 の人は難しく考えすぎというか、なんというか。
当然、各季節用の js なり背景なりを用意しておいて、CGIの中に書かれた
CSS部分を書き換えて背景変えたり、script type="text/javascript" src="ここ" を書き換えて
呼び出す js を変えたり…という動作をするCGIは作れる。
CGIからHTMLを書き換えたり、別のCGIを書き換えたり、いろいろできることはできる。
やることは「テキストファイルを読んで内容を変更して書き出す」だけですから。
適当に「設定ファイル」を作ってそれを差し替えるだけで済むようにすればCGIを組むより楽ですよ。
「季節が変わる毎」程度だったら、もっとも簡単かもしれないのがローカルで書き換えてFTP(ry
でも、勉強のためにローカル環境でこういうのを作って遊んでみたくなったんだったら、
是非遊んでみるべきだと思う。
てか季節によってわけたいだけなら、JavaScriptだけでいいじゃん
>>729 >CGIでCGIファイルを書き出す必要性が頭悪すぎてよくわかりません
それはこちらのセリフなのだがw
第三者にやれと言われてやってるなら仕方ないが、自分で思い付いてやってるとしたら、
他にもっと勉強した方が良いと思うぞ。
リファレンスとかオブジェクト指向とかな。
>>729 cgiも所詮はただのファイルなのでパーミッションだけ注意すれば普通に作れる。
>>726 tuf8に変換する、utf8から変換するのが必要な場合は
ソースをちょっと書き換えないとだめよん。
>>735 物理的にファイルを生成するという意味ではそのとおり。
論理的なプログラグを生成する難易度はまた別だけどな。
HTML表示プログラムで分岐すればいいだけでは? あるいは設定ファイルのようなものを外部で持っておいて その設定ファイルを書き換えるとか。
>>727 モジュールがまったくない鯖があったはず
ぷららだったっけ?nifty?忘れた
便利なものは上手く使うとして、 仕組みを学び知ることは大事だよね
>>739 Niftyは確かに strict.pm も入れてないほどきれいさっぱりモジュールがない。
最近Perl/CGIを始めた者ですが、お聞きたいことがあります。 ifを使って、特定の条件を満たさないと隠しページへ行けない様にしたい のですが、どういう関数を使えば良いかさっぱりわかりません。例えば、 あるページ上でテキストボックスに1と入力したら隠しページへ移動する といった感じにしたいのですが、Basic認証のプログラムなどを参考にし てみましたが、意味がわからず挫折しました。 隠しページはcgiファイルにして、直接URLを打ち込んでも閲覧できないよ うにし、特定の条件をクリアした場合のみ閲覧できるようにしたいのです。 もちろんパーミッションは644にします。url_jump_toで最初試したのです が、案の定駄目でした。 どなたか、条件をクリアしたらcgiファイル(パーミッション644)を閲覧 できる方法をよろしければ教えてください。房ですみません。
拡張子が.plのスプリクトの動かし方を教えてください!!! ActivePerlをインストールしたのですが、そこからどすればいいのか分かりません・・ .plファイルをダブルクリックしてもコマンドラインが一瞬でて消えるだけです・・ どなたか教えてください!!!
プログラムが終了すればプロセスも終了する DOS窓を開いて > perl /path/to/hoge.pl みたいに実行させたり hoge.pl が終了する部分に `pause` を書くとか。。
コマンドプロンプトの設定で閉じないようにできなかったっけ?
>>742 644は実行権限が無いから、プログラムとしては動かない
とはいえ拡張子がcgiだとhttp経由ではプログラムとしてしか見れないようになってるはず
つまり644で閲覧は現実的じゃない(できないことは無いだろうけど)
それよりもif文で分岐して2つのファイルのどちらかを読み込んで表示すればいいんじゃね?
PPM3 なんですが、Time::HiRes が search で見つからない orz 以前は PPM 経由でインストールできてたのにこんなことってあるんですね・・・
VC Express Edition じゃコンパイルでエラー … windows.h がパッケージに含まれてないとか .net つかえねぇ orz
>>747 あったとしても最新バージョンでないことも多いからね
>>747 ppm3はモジュール名じゃなくてディストリ名で検索しないといけなかったような
つまりTime-HiResで
いつからかは知らんが少なくともperl-5.8.8ではTime::HiResは本体と一緒に 配布されてるので、いちいち別にとってきてインスコする必要はなくなった。
>750 ありあと・・・でも >751 さんの方法で見つかった m(_ _)m
>>746 ありがとうございます。
ファイルを読み込ますのですか...
requireを使用するんですかね?
>>755 いや、openとprintとcloseを使う。
必用であればforeachも使う。
まぁrequireでもいいけどね
foreachよりもwhileだね。
759です。 少し疑問があるのですが、これってURLを直接打ち込まれたら 第三者に覗かれる恐れがありますよね?
なんのURL?
データファイルの URL じゃない? データファイルは HTTP で見れる範囲より外に置くか、ランダムな文字列で生成された16文字ほどのディレクトリに置けばいい でなきゃ DB にぶち込むとか・・・
それこそ拡張子cgiで644にして置いておけば?
>>761 説明不足でした。条件を満たしたら隠しページのファイルを読み取るよう
にしたかったのですが、隠したいページのURLを直接入力されたら終わり
だなあと思いまして。
>>762 HTTPで見れる範囲外ですか...なるほど。ちょっと調べてみます。
ランダムなディレクトリはrand関数でなんとかなりそうですが、
僕の知識ではまだまだできそうにありませんorz
>>763 cgiを644にするとファイルが読み取れなくなってしまうので
どうしたもんかと途方にくれています。
みなさんありがとうございます。
>>764 644のcgiファイルをopenで読み込んでみ
まぁまず本の一冊でも読み込んでみ
>>764 >隠したいページのURLを直接入力
よくわからんけど・・・
つ basic認証
http鯖とかcgiのしくみをてんで理解してなさそうだから ここでちょこちょこやりとりするだけじゃ面倒みきれない ような気がする
764です。 openで読み込みましたが、やはりうまくいきませんでした。 急遽、CGIとPerlでシステムを作るよう頼まれたのですが おっしゃる通り、まだまだ無知なことも多いので1週間くらい 死ぬ気で勉強してみます。 色々聞けてよかったです。ありがとうございました。
なので、一旦出直しますノシ
>CGIとPerlでシステムを作る はぁ・・・
>>770 まあ初心者はPerl/CGIをよくわかってないからな,
偉そうに言ってる俺もいまいちよくわかってないけど.
ここは初心者スレだけど,やっぱりできる人間が多いの?
772 :
nobodyさん :2007/01/11(木) 20:31:25 ID:apL14Vu+
なんか噛み合ってなさそw 742がふぁびょりすぎて噛みあってないんだと思うぞw Basic認証は、利用できるように設定がなっているなら .htaccess .passwd の2ファイル作って .htaccessを認証させたいディレクトリに置き、.passwdのある場所を指定する。 .passwdを適切な場所におく。レンサバだと.passwdを置く領域確保されてないっしょ? /home/[account]/ とか用意してくれている鯖ならいいんだけどね
.htaccessへのアクセスが拒否されるサーバ(Apacheのデフォルト)は、 たいてい.ht*のファイルすべてがアクセスを拒否されるから、.passwdも .htpasswdにしておいた方が安心だな。
すまん, 770は何がおかしいのかわからんのだが. CGIとPerlって部分か?
それ俺も気になった
>774 770は言葉の意味と用途が違うと言いたいんだろうけど、 ここは初心者質問スレだからな。 「断熱とベニヤ板で家を作る」と言ってる感じか? そんなの、「ベニヤ板で断熱しつつ家を作る」と 置換・理解できない770がDQNなだけ。ほっとけ。
問題は特にないけど CGIの中身をPerlで書きますよって意味なら問題ない。 >CGIとPerlでシステムを作る って書き方だと CGIからシステムコールでplなファイルを叩くイメージっぽい気もするかも でも770の突っ込み自体おかしい。そこは素通りしとけw
プログラム板から誘導されて来ました。
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz
CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。
具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=
http://www.xxx.com/index.php?%A5%AC%A5 と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。
渡されてきたURLを「
http://www.xxx.com/index.php?%A5%AC%A5 」のように、
そのまま表示するにはどうしたらいいでしょうか?
一応書いておくと、スクリプトはUTF-8Nで書いています。
上と下との違いがわからんのだが。
じゃなきゃ表示時にもう一回urlエンコードすりゃいいだけの話
みなさんレスありがとうございます。
なるほど…最初のリンクを生成する時点で%を%25にエンコードしておく必要があるんですね。
>じゃなきゃ表示時にもう一回urlエンコードすりゃいいだけの話
>
http://www.example.com/hoge.cgi?a=xxx&b=yyy >みたいなものもありうるとするならば、渡す前の方で適切にエンコードしておかないとだめですな。
urlパラメータに入るURLは、一般的なURLか前述したような文字コードを含んだURLが大半を占めるのですが、
ユーザー投稿式なので、何が来るかわからないという点を考えると、
最初のリンク生成の時点で適切なURLエンコードをしておいた方がいいようですね。
教えていただいた事を踏まえて、最初のリンク生成時に%を%25にエンコードする様スクリプトを組んだ所上手く動きました。
皆さんありがとうございます。
しかし、この方法だとhoge.cgi?a=xxx&b=yyyのようなものが来た時にダメとの事なので、
もう少し適切に処理させたいと思うのですが、またまた上手くいきません。
というか、どういう風に処理したらいいか分からないという感じです。
$elem =~ s/(https?:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\$]*)/<a href=\"$script?url=$1\">LINKはこちら<\/a>/go;
$elem =~ s/\%/\%25/go;
1行目は日本語混じりの文章($elem)の中にURLが張られた場合、それを「LINKはこちら」というリンクに置換させています。
そして、2行目で%→%25にしているわけですが、これだと当然問題が。
・本文中の文章の中にURL以外の%があっても置換してしまう。
・&などが来るとダメ?
「%だけじゃなくてちゃんと全部エンコードすればいいじゃないか」 とは思うのですが、
本文中から(https?:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\$]*)にマッチする文字列だけをエンコードさせる方法がわかりません。
どのようにしたらいいでしょうか?
本文中にはURLが複数箇所張られる可能性も考慮したいです。
度々の質問失礼しますが、ご教授の程よろしくお願いします。
784 :
nobodyさん :2007/01/12(金) 13:56:34 ID:aFkw6ayO
ヒアドキュメントの書き方で質問です。 ヒアドキュメントを使わない時に以下のように書けるコードは どのように書けばいいでしょうか。 print NEW "mydoc = \"@document\";\n"; これでは出力されるファイルの方には@documentという文字が出る。"をエスケープでも同様 print <<"EOM"; mydoc = "@document"; EOM これではmydoc = "@documentの中身";という形にならない。 print <<"EOM"; mydoc = @document; EOM
>>783 use URI::Escape;
$本文 =~ s/(その正規表現)/uri_escape($1)/ge;
てな感じでいいはず
>>784 前者の書き方でいいはずだが。試すときになんか勘違いしてない?
% cat a.pl
@document = qw(unko chinko);
print "mydoc = \"@document\";\n";
print <<"EOM";
mydoc = "@document";
EOM
% perl a.pl
mydoc = "unko chinko";
mydoc = "unko chinko";
分からなければ連結すりゃいいんじゃ 'mydoc = "' .@document. '";' ."\n";
788 :
784 :2007/01/12(金) 14:26:05 ID:???
>>786 まさに勘違いしていたようです(滝汗)
前者であってました。すみません。ありがとうございます。
>>787 さんくすです。
>>785 おぉおおお! できました!
ありがとうございます!
こんな一行で出来る事だったんですね。
これで目的のスクリプトが組みあがりそうです。
2度の長文質問に答えてくださった方々、本当にありがとうございました。
744さんの書いている事がよく分かりません・・ 拡張子が.plのスプリクトの動かし方を教えてください!!! ActivePerlをインストールしたのですが、そこからどすればいいのか分かりません・・ .plファイルをダブルクリックしてもコマンドラインが一瞬でて消えるだけです・・ 通常のアプリのように直感的に扱いたいです。コマンドライン?から起動とかじゃなくて あと一つ質問です。 拡張子が.plのファイルの拡張子を無理やり.cgiに変更した場合、cgiとして正しく動作しますか? サーバーレンタルしたらそこで使えますか? perlに詳しい方、厨房にも分かるように教えてください!!! どうかお願いいたします。
791 :
790 :2007/01/13(土) 00:13:42 ID:???
ちょっと間違って書いた所がありました。 ActivePerl-5.8.8.819をインストールしてから.plをクリックしたら、 D:Perl\bin\perl.exeとなってコマンドラインがでてきました。 コマンドラインは消えませんが、ここからどうすればいいのか・・・・ 助けてください
それで正常に動いています。プログラムの使い方は作者に聞くなり、説明書を読むなりしましょう。 ここは「プログラムを作る人」の為の板でありスレッドです。使う側の質問は板違いです。
UNIXでperl動かすのとwinで動かすのはどんな違いがあるんですかね? UNIX鯖レンタルしてそこで動かそうと思うですが、何をインストールすればよいのでしょうか?
>>791 本屋さんで立ち読みでもいいから、入門書のアタマをちょっと読んだ方がいいよ。
795 :
nobodyさん :2007/01/13(土) 21:51:44 ID:wEKIwJY9
キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、 C言語でいうところの、getch() に相当する関数はないでしょうか?
>>795 WebProg板って事なので、CGI経由になるのかしら?
それならJavaScriptを使った方がよさげの悪寒♪
797 :
795 :2007/01/13(土) 22:06:58 ID:???
>>796 いえ、シェル上でのperlスクリプトです。
798 :
795 :2007/01/13(土) 22:08:17 ID:???
すいません、プログラム板の方がふさわしそうなので、 そっちへ移動します。
799 :
nobodyさん :2007/01/14(日) 22:03:27 ID:7dLarnkv
OUTER: foreach my $tmp (@tmp_data){ foreach my $key (keys %target){ my $value= $target{$key}; if($key == 1){ next OUTER } else{ next OUTER; } } } 上記と下記は同じ流れ方をすると思っていたのですが、下記のwhileの場合、 どうも%targetを最上層のforeachから再度読み出すとハッシュのはじめから よんでいないような挙動を見せます。 こちら何かアドバイス等ございます際にはいただけますと幸いです。 OUTER: foreach my $tmp (@tmp_data){ # my %target = %common::target; を入れて初期化すると上記同様の流れになる while(my ($key, $value) = each(%target)){ if($key == 1){ next OUTER } else{ next OUTER; } } }
each の場合は、イテレータのポインタがリセットされないって事では
perldoc -f each したら書いてあったけど。ググるだけじゃなくて、マニュアルも読もう There is a single iterator for each hash, shared by all "each", "keys", and "values" func tion calls in the program; it can be reset by reading all the elements from the hash, or by evaluating "keys HASH" or "values HASH".
既存のコードを改造しようとコードを見たら、 $::FLAG{'cache'} というのがあったんですけど、 この時の「$」はいったいなんでしょうか?
スカラー
最近なんか初心者質問スレっぽくない感じがする 俺的には高度な話題が多くなったなぁ、みんな凄いわ
>>809 :: はパッケージを指定する為の演算子です。
$Pkg::var のように書くと Pkg パッケージのパッケージ変数 $var を参照できるのですが
パッケージ名を省略すると、デフォルトのパッケージである「main」を指定した事になります。
our $hoge = "In main"; # ← main パッケージの $hoge
package Sandbox;
our $hoge = "In sandbox"; # ← Sandbox パッケージの $hoge
print $hoge, "\n";
print $::hoge, "\n";
print $Sandbox::hoge, "\n";
print $main::hoge, "\n";
807 :
nobodyさん :2007/01/16(火) 10:45:24 ID:Vliwd/jI
モジュールを探しています。 秒数を日付にするのはありますが、 秒数が何時間とか、何日分に当たるのかとかいった変換を行うものはありますか? 3600S→1Hのようなかんじで。
/ という演算子が用意されています。
809 :
nobodyさん :2007/01/16(火) 10:58:59 ID:Vliwd/jI
>>808 そういうことでなく。
あと、時間や分、秒ごちゃ混ぜで計算できるものあれば。
77H - 4M = 76H56M みたいなの。
秒に戻さず、直感的に計算できればいいです。日付の計算はDate:Simpleにあるんですよね・・・。
use DateTime::Duration; $t1 = DateTime::Duration->new(hours=>77); $t2 = DateTime::Duration->new(minutes=>4); $t3 = $t1 - $t2; printf "%dH%dM\n", $t3->in_units(qw(hours minutes));
なんでもあるんだな・・・
>>811 なるほど。
でも、あらかじめ分解しておかないとダメなんですね。
モジュール探すときって、英語が出来ない自分が恨めしい・・・orz
中では全部、秒で計算しているのかな?
DateTime-Format-Durationってのもありますね。
ファイルハンドルって局地的に使う事は出来ないのでしょうか。 全体で一意な文字列になるの?
「局地的」という言い方がなんだかわからないが、 a) 無名ファイルハンドルを使う a-1) IO::Handle->newで作る a-2) my $fh; open $fh, 〜 で作る b) 型グロブをlocalで局所化する local *FH; open FH, 〜
open my $fh, ">$file"; 楽でいい。
>>817 open my $fh, ">", $file or die $!で済ませられる程度の簡単なプログラムなら
いいんだけど、
unless (open my $fh, ">", $file) {
エラー処理
}
通常の処理
みたいに書こうとすると$fhのスコープがif文の中だけなのでだめなんだよな。
>>818 エラー処理がそんなに長くなければだが、こんなんでどうよ。
ただしインデントには気をつけないと読みづらくなること請け合い。
open my $fh, ">", $file
or do {
エラー処理
};
通常の処理
>>816-819 dクス。
ラクダ本見たらこんな感じの記述があったから、
変数に何らかの文字列を設定しなきゃいけないのかと思ってた。
foreach $file (@ARGV){
process( $file, 'fh00' );
}
※process内
open( $input, $filename );
open my $fh, ">", $file or do { エラー処理 }; 通常の処理 open my $fh, ">", $file or do { エラー処理 }; 通常の処理 連続で使うと二重宣言の警告出るがな
>>821 そもそもそれは役目が終わったはずの$fhのスコープを閉じてないところに問題があると思う。
(ただの変数ならともかく、中身がファイルポインタと言う最初と最後がはっきりしているものだから。)
状況にもよるが俺は、ファイルの処理部分をラベル付きブロックに押し込むと
ファイルへのアクセスのスコープが一目で明白になるからしばしばこうやってる。
WRITE_HOGE: {
open my $fh, ">", $file;
通常の処理
}
WRITE_FUGA: {
open my $fh, ">", $file;
通常の処理
}
これ↓何の役割をしているんですか? WRITE_HOGE:
>ファイルの処理部分をラベル付きブロックに押し込むと
>>823 >>822 のコードでは何もして無い。こんな効果が
WRITE_HOGE: {
open my $fh, ">", $file
or do {
last WRITE_HOGE; # とかやると
};
通常の処理
} # エラー時にここまでジャンプする
あるけれど、822ではブロック自体に名前をつけて解りやすくするという意味でつけた。
わざわざ > ファイルの処理部分をラベル付きブロックに押し込むと と書いてあるのに何故ググりもせずに聞くのだ?
初心者スレだからいいんでねぃか
ググるのも難しいしなw perl ラベル でググるといい
結局、上達するにはまず検索術を身につけろって事になるんだよな・・・
>>825 なるほどブロックの最初に戻るんじゃなくて、最後に飛ぶのか。
サンクス。
(´-`).。oO(そもそもの構造がへんなのかも。do なんて使うこと無いよなぁ。。。)
このケースだと do やラベルを使わずサブルーチン呼ぶ方が より自然な気がすっけどね。 my $code = sub { die : } # エラーしょり { # 空ブロック宣言 open my $fh, "hoge" or $code->() ; close $fh ; }
二つの文字列で共通箇所だけ抜き出すスクリプトあったら教えてください。 たとえば、aiueoとkaiukekoならaiの部分、abcdeとadeabなら「de」と「ab」です。 でも、連続した文字でない場合は抜き出さなくていいです。二文字以上。 上の例だとa,i,u,e,oの文字、a,b,c,d,eの文字が使われているからといって抜き出さない、といった感じです。
835 :
834 :2007/01/17(水) 03:09:07 ID:???
間違いました。 >たとえば、aiueoとkaiukekoならaiの部分、 重なってる部分は「aiu」です。
>>835 一箇所しか重ならないの?
たとえば hogefugahoge v.s. fugahogefuga みたく複数の場合とか考慮せんでえーの?
837 :
834 :2007/01/17(水) 07:21:58 ID:???
>>836 hogeが二回とか同じものが複数は別扱いでいいです。
まとめたいときは配列にでもして重複削除処理を加えると思うので。
838 :
837 :2007/01/17(水) 07:26:27 ID:???
いってること自分でもよくわからないので言い直します。 hogefugahoge v.s. fugahogefugaなら fugahogeというデータが抜き出せたらいいです。 fuge、hogeでもいいです。fugahoge,fuge,hogeでも。 そのあたりは作り手にお任せします。 一番理想的なのは、コノ例なら最初のfugahogeだけですね。後は同じことですから。
839 :
837 :2007/01/17(水) 07:30:03 ID:???
訂正 [hogefuga]hoge v.s. fuga[hogefuga]なら []の部分が重なっているのでhogefugaです。 他、fugeと書いている部分はfugaです。
840 :
837 :2007/01/17(水) 07:40:16 ID:???
すみません。まだちゃんと理解してなかった・・・ hogefugahoge v.s. fugahogefugaの例の場合、 hoge[fugahoge] v.s. [fugahoge]fugaもあるんですね・・・。 重なってる箇所がある場合は長いほう優先にしてください。 同じ長さの場合はどちらか一方で構いません。 説明足りなかったですが、これらの条件と合わせて 二つの文字列で何文字共通箇所があるか?データも欲しいです。
841 :
806 :2007/01/17(水) 07:48:33 ID:???
>>837 最長だけでよければCPANに
String::LCSS - Find The Longest Common Substring of Two Strings.
というのがある。
1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。
4: だから教えろカスども
5: カスだから無理
my $one = 'hogefugahoge' ; my $two = 'fugahogefuga' ; my %ones = map { $_, 1 } map { unpack +( join '', map "\@${_}A*", 0.. ( length $_ ) - 1 ), $_ ; } unpack +( join '', map "A${_}X${_}", 1.. length $one ), $one ; これで全組合せが出るのであとはお好きなように。。。 例えば以下みたく。絞り込むのは自分でやっとくれ。 my @ans ; for my $str ( sort { length $b <=> length $a } keys %ones ){ my @two_ind ; my @one_ind ; push @two_ind, pos $two while $two =~ /($str)/g ; push @one_ind, pos $one while $one =~ /($str)/g ; push @ans, { str => $str, one => \@one_ind, two =>\@two_ind } if @two_ind ; }
空気嫁
ネタレス三つで空気よめって何よ?w
>>842 これのソースは一応参考にはなるな
ほんと空気読めないんだな
すまん。質問スレで質問に答えるのは厳禁なんだな。
ああ、テンプレ通りじゃねえってことか orz... 吊ってくるわ
答えられない低脳君が答えてる奴に文句言うって素敵な空間ですね
答えられる奴が答えたらいいので、答えて文句いってるのは一番のカス。 どこにでもいるのでスルーするのがよろしい。ゴキブリホイホイより
>>854 そんなこと言うなよ。
お前がゴキブリホイホイなら俺はホウ酸ダンゴだ。
ここは定期的に荒しが沸くのでスルーお勧め でもテンプレすら読まないのは問題あるな どっちにしてもスルーでおk
857 :
みろん :2007/01/18(木) 14:03:23 ID:2GOHrU8+
どなたか教えてください。 今、perlで掲示板を作っています。そこでリロードによる二重投稿を 防ぎたいのですが、私はlocationをつかってみようと思ってます。 しかし、うまくいきません。どこに記述すれば、送信後自分のページを 再読み込みしてくれるのでしょうか。
1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。
現在、CGIにてファイルをダウンロードさせています。 ファイルをOpenし、ContentType等を設定して、 バイナリを出力させダウンロードさせる仕組みです。 しかし、ファイルが存在しなかったり、Openに失敗した場合の処理が、 ファイル名にエラー情報を書いてファイルサイズ0のものをダウンロード させるくらいしか出来ていません。 ファイルのダウンロードに失敗しましたというダイアログを出すためには、 404 not foundを返せばいいのでしょうか?
CGIなら「失敗しました」ってブラウザに表示すりゃいいんじゃね?
404がえし、やってみたら出来ました。
>>857 location というのがヘッダーの Location フィールドのことなら、書き込んだ後に表示するページで
Location: ジャンプ先URL
をレスポンスヘッダーに追加して、適切なステータスコード(302、303など)を返します。
URLの最後に ? を付けると、ほとんどのブラウザで二重投稿を防止できるみたいです。
詳しいやり方は、使ってるライブラリによって異なるので、自分で調べてみてください。
location が JavaScript の window.location の事でも、基本的に同じですが、板違いです。
863 :
nobodyさん :2007/01/20(土) 14:34:54 ID:67i3ErOc
配列の中に重複しないようにURLをいれる処理なんですけど 重複してしまいます。 @http_url = $text =~ /($set{'http_url_regex'})/g; foreach my $url (@http_url) { if (!grep(/^$url$/i, @link)) { print "link : $url\n"; push(@link, $url); } } なぜなのでしょうか?
864 :
nobodyさん :2007/01/20(土) 16:57:02 ID:x00E/Fj7
<form enctype="multipart/form-data" action="....cgi"> <input type="text" name="title" size="40"><br> <input type="file" name="File" size="32"><br> <input type="submit" name="send" value="送信"><br> </form> 上のプログラムのように、テキストタイプのデータと画像などのデータを送信するプログラムを作りたいんですが 最初のフォームのテキストデータがちゃんと受け渡せません multipart/form-dataで送信した際には、cgi側でどのような操作を行えばURLエンコードで送信した場合と同じようにテキストデータを扱えるんでしょうか?
2chの掲示板のソースコードはどこかで手に入りますか?
>>863 何故っと云われてもわかんないけれどもおそらく恐ろしく効率が悪いみたいです♪
@http_url = $text =~ /($set{'http_url_regex'})/g; # $textからURIらしきものを取り出す。
# @link に追記。(ブロックにしておきますね)
{
my %link_hash = map +($_, 1), @link; # URIをキーにしたハシュを作る。
for my $collect_uri (@http_url){
defined $link_hash{$collect_uri} and next; # キーが存在すれば次。
push @link, $collect_uri; # キー(URI)が無かったので追記♪
}
}
これでどうかしら?
@linkにスタックされた順番を考えずに済むのなら他の方法もあるけれども♪
あと、@linkの要素総てに改行が含まれているなら刈り取っておかなきゃです。
>>864 Googleで"multipart/form-data perl"で検索してみるといいぞ。
検索結果をトップから10件分読めば大体分かる。
870 :
nobodyさん :2007/01/21(日) 09:24:25 ID:prBhWU2Q
>>869 検索して、何となくはわかったんですが、深く理解はできませんでした
けどstdio.plというライブラリを見つけました
stdio.plと一緒にダウンロードしたサンプルプログラムのgetMultipartFormDataを使えば何とかなりそうです
返信ありがとうございましたm(_ _)m
会員制のサイトで ID パス 入力で 個人ごとのデータを管理するオープンソースってありますか?
オープンソースって言いたいだけちゃうんかと。 まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
オープンソースって言いたいだけちゃうんかと。 まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
オープンソースって言いたいだけちゃうんかと。 まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
エスパー居すぎワロス
>873 伊東さんです。 >874 魔美さんです。 >875 ユンゲラーです。
世界のエスパーが集うスレと聞いて飛んで来ました
来てます!
とうとうナポレオンズの時代が来たようです
881 :
nobodyさん :2007/01/23(火) 10:33:18 ID:gVOiAeSh
-------------------------------------------------------- sub mail_okuru{ my($aitemail) = $_[0]; $_[2] = &adebo($_[2]); $mail = "To: $aitemail\n"; $mail .="From: \日\本\語\名\前 <$mail_add>\n"; $mail .="Subject: $_[1]\n"; $mail .="Content-Transfer-Encoding: 7bit\n"; $mail .="Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n"; $mail .=$_[2]; &jcode::convert(*mail,'jis'); open(MAIL,"|$sendmail -i -t -f $aitemail"); print MAIL $mail; close(MAIL); } ------------------------------------------------------------ 自動返信メールのアドレスの【日本語名前】のところがどうして文字化けしてしまいます 文字化けしないようにしたのですがどうすればよろしいでしょうか? お願いします
文字化けの原因は何だと思う?
これは普通に検索すれば解決するだしょ base64でぐぐれよ
そーゆー問題か?
From行が・・・ これは気づくまで放置か?
釣りとみた
てことは俺は釣れたわけかorz
mimew.pl入れたら上手く行ったよ
教えて下さい flockをローカルテスト鯖で使いたいのですが Windowsで対応しているのはどのバージョンからでしょうか。
NT系なら使えるはず。
xpは動くでしょうか?
え、flock って Unix 専用じゃなかったの? NT系で使えるってのは初耳だ
ソースを見るとwin32/win32.cにwin32_flockというのがあって、非NTのときはcroak、 それ以外ならモードにあわせてLockFileEx/UnlockFileExを呼んでるな
print "content-type: text/html\n"; print "Set-Cookie: test=test; domain=test.co.jp; expires=$expiredate;\n"; print "\n"; Set-Cookieでdomainを他のサーバーで指定するとcookieが発行されないのですが、 これは何が原因か教えて頂けますか。 domainの値を自サーバーもしくは、domain自体を記述しなければちゃんと発行されます。
他のドメインのクッキーを勝手に食わされるとセキュリティ上問題あるので クライアントはそういうのは拒否することになっている。詳しくは RFC2965(HTTP State Management Mechanism)の3.3.2(Rejecting Cookies)参照 たぶんこれにひっかかったんじゃないか。
仕様ですな。
898 :
895 :2007/01/24(水) 13:08:20 ID:???
仕様なんですか。ありがとうございます。 そうしたらdomainを入力する項目ってほとんど必要性がないような…(´・ω・)
example.comで発行するとhoge.example.comやfoo.example.comにも影響する そこで有効範囲を指定してhoge.example.comのみに発行させることができる
>>898 example.comでクッキー発行すればauction.example.comでもshopping.example.comでも同じクッキーが使える
auction.example.com(ドメイン省略時の例として)で発行すればそこでしか使えない
外部のサイトの http://〜/***.cgi?no=*** というようなページ(のソース)を読み込むことって出来ますか?
902 :
895 :2007/01/24(水) 14:35:35 ID:???
なるほど、ありがとうございました(´・ω・)
903 :
895 :2007/01/24(水) 14:39:06 ID:???
外部のソースですが、
use LWP::UserAgent;
use
HTTP::Request::Common qw(GET);
my $ua = LWP::UserAgent->new;
my $url = "
http:// 〜/***.cgi?no=***";
my $request = GET($url);
my $res = $ua->request($request);
if ($res->is_success){
$content = $res->content;
}
といったような形で読めますよ(´・ω・)
>>903 ありがとうございました。勉強してみます。
サーバ上でdata.txt(SJIS)をUTF-8に変更の上、 data1.txtとして別名で保存したいのですが どのようにすればいいでしょうか? ちなみにperlは設置ができる程度です。 親切な方よろしくご指導ください。 Perl バージョン 5.008004 です。
読み込み→変換→別ファイルに保存
907 :
nobodyさん :2007/01/24(水) 16:25:47 ID:2EUwcZjV
ログなどにデータを保持する場合、配列の区切り文字としてはどんなものを使うのが一般的なんでしょうか? できるだけ短くてユニークなものが理想的だと思いますが 「普通はこれ使うだろ」といったような暗黙の標準区切り文字みたいなものはありますか? それとも、コードの中で一時的にユニークな区切り文字に置き換えて処理し、 データに書き込むときは汎用性の高い区切り文字(カンマ等)で統一する、 といった方法の方が一般的なんでしょうか? 「自分はこうしている」という意見でも良いのでよろしくお願いします。
>906 読み込みと保存はなんとなくこんな感じでしょうか。 変換がよくわかりません open IN, "data.txt"; $data = <IN>; close IN; open OUT, ">data1.txt"; print OUT $data; close OUT;
LWP::UserAgentで外部サイトを取得する場合、 指定したURLが転送される場合303 See Otherが出て取得できない。 どうすれば転送後のサイトを取得できますか?
>>907 データの中に区切り文字を含まないように工夫すればなんでもいいんじゃね?
>>908 本を一冊読むことをおすすめする。
ここで全部を教えるのは難しい
>>909 "LWP リダイレクト"でぐぐった?
911 :
909 :2007/01/24(水) 17:49:56 ID:???
>>907 CSVやTSVを使ったり、SQLiteやPgSQLを使ったり。
自サイトにあるフォームメールにスパムが来るようになりました。 そこで半角のみの投稿は不可にしようと思ったのですが 正規表現だと $char_check = $form{"message"}; if($char_check =~ /^[^0-9a-zA-Z]$/ ){ 送信 } else { エラー処理 } こんな感じでやってみたのですがうまく動きません。 正しい動作をさせるにはどのように書き直せばいいでしょうか?
if ($char_check =~ /[^ -~¥r¥n]//) { 送信 }
!~ /^[a-zA-Z0-9]+$/ あとURLに使われる文字とか。
Perlでケータイ電話からのアクセスかどうかを判別したいと考えています。 UserAgentは簡単に偽装できるので、IPアドレスベースの識別をしたいのですが、 アクセス者のIPアドレスがサブネットマスク形式のアドレスで指定した条件に一致しているかどうかを 確認するモジュールはないでしょうか? つまり、 my $ipType = &IP_Check('127.0.0.1', '127.0.0.0/24'); if ($ipType) { print 'ループバックアドレスです。' . "\n"; } みたいなことができる関数が欲しいです。 よろしくお願いします。
>>916 とりあえずCPANでsubnetで検索してみた?
その目的からするとTie::NetAddr::IPがこんな感じで使えてよさそうに見える。試してないが。
tie my $carriersSubnet, 'Tie::NetAddr::IP';
$carriersSubnet{"10.0.10.0/24"} = "CarrierA";
$carriersSubnet{"10.3.20.0/24"} = "CarrierA";
$carriersSubnet{"10.10.2.0/24"} = "CarrierB";
my $carrier = $carriersSubnet{$ipaddr};
>>889 winじゃないけど
Mac OSX もunixなので可
921 :
nobodyさん :2007/01/26(金) 07:14:03 ID:??? BE:198705029-BRZ(9100)
Net::CIDR::MobileJP
Perlで簡単な占いみたいなのを作りたいのですが、どうしてもならないところがあるので 質問させていただきます。 質問を提示してその下にラジオボタンで選択肢を作ります。 で、質問に答えたら次の質問と続いていくわけなんですが。 その選んだ答えを1.と答えたのがが3個 2.と答えたのが4個と最後に合計を出したいの ですが、合計を出そうとするところができません。 そういう簡単なサンプルとかを提示していただきませんでしょうか?
>>922 if ($x eq $a){
$one++;
} eisif ($a eq $b) {
$two++;
} else {
$three++;
}
print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、''2は' . "$two" . '、' . '3は' . "$three";
925 :
924 :2007/01/26(金) 12:43:20 ID:???
間違えた if ($x eq $a){ $one++; } eisif ($x eq $b) { $two++; } else { $three++; } print "Content-type: text/html; charset=文字コード\n\n"; print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
926 :
924 :2007/01/26(金) 13:01:23 ID:???
あ、また間違えた if ($x eq $a){ $one++; } elsif ($a eq $b) { $two++; } else { $three++; } print "Content-type: text/html; charset=文字コード\n\n"; print '1は' . "$one" . '、''2は' . "$two" . '、' . '3は' . "$three";
927 :
924 :2007/01/26(金) 13:02:48 ID:???
これでいいや
928 :
924 :2007/01/26(金) 13:08:50 ID:???
ああまただ これが正解だ if ($x eq $a){ $one++; } elsif ($x eq $b) { $two++; } else { $three++; } print "Content-type: text/html; charset=文字コード\n\n"; print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
連投するならせめて空行を抜けヴォケ
なんかわろた
変数しかないのにダブルクオートで囲むのは気持ち悪い。 あとprintf覚えようね。
>>922 の文章は、複数の質問が1つのページにあるのか、
それとも1つの質問が書かれた複数のページがあるのか、はっきりしない。
前者なら、全ての質問について、選択肢をキーとしたハッシュでも作って集計すればいい。
後者なら、hidden フィールドでも使って、前ページまでの集計結果を覚えておけばいい。
933 :
nobodyさん :2007/01/27(土) 10:46:19 ID:F/NZnu0B
perlでBBS作ろうと思っているのですが、 お薦めのBBS向けのフレームワークとかご存じでしたら教えてもらえませんか?
CGI.pmとテンプレート系モジュールがあれば十分じゃない?
printfなんか使ったことが無い俺は勝ち組? 今度使ってみるかなぁ。 つっても、%ndぐらいしか使わなそうだけど。
オレもデバッグのとき見やすくするときぐらいしかprintfって使うことないよ
sprintfなら使う
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three"; なんて書くくらいなら printf("1は%d、2は%d、3は%d", $one, $two, $three); の方が見やすいと思う。もしクォートの対応間違えてSyntax Errorになったら 探すのめんどいから。あとは、 printf("1は%d、2は%d、3は%d", @total{qw(one two three)}); のように書けるとき便利。
C言語から入ったような人だと、どの言語でもprintf系を使いたくなるらしいからなあ。 いや俺の話だけど。
print "1は$one、2は$two、3は$three";
${one} って書いた方が無難かもかも。。
>>941 >>940 の方が意図しない挙動が起こらないからいいだろ。
0100 をプリントしたい場合
perl -e 'printf "%d", 0100 '
perl -e 'printf "%d", "0100" '
perl -e 'printf "%s", "0100" '
perl -e 'printf "%s", 0100 '
perl -e 'print "0100"'
まあ、printf "%04d", "100" 使えって云うんだろうけど。
CGI::Upload.pmを使ってるんですが ファイルを保存する方法がわかりません。 どうすればいいんでしょうか?
CPANのマニュアル見てください
マニュアルには保存のことまで書いてないです
書いてあります。ちゃんと見てください。
for(1..4){ if($pObj->ping($host, $timeout)){ print "$host is running.\n"; } else { print "$host is not running.\n"; } PINGが4回送信成功したらall complete 四回とも失敗したときにnot reaction としたいのですがどこに制御文足せば良いのか教えてください。
失敗したときのカウント数えれば?
成功したときのカウント数えれば?
いっそ成功なら 1失敗なら-1 4か-4かで判断汁
>952の方法そのままだと、 「3回目の試行で全成功」と「4回試行して1度失敗」の区別が付かないような。 まあ、目的次第か。
書かれてる要件では「lostなし」「全lost」のどっちかがわかればよさそうだから その辺の区別はできなくてもいいんでない? 「どうカウントして条件分岐させればスマートか?」という質問じゃなくて 「どこに制御文を足せばいいのか?」なだけに、 みんなが書いた回答では片づかないような気配を感じる。
955 :
949 :2007/01/30(火) 11:19:12 ID:???
>>954 そうですね
自分としては9同じような意味で書いたつもりだったのですが
書き方的に悪かったのかもしれません。
サーバーがC++ winsockでクライアントがPerlなのですが、 クライアント側でソケットをcloseすると、なぜかFD_CLOSE が2回届いてしまいます。 特に支障はないのですが、これって正常なんでしょうか?
ソースを見直しなされ
>>948 見てるものが違うのかやっぱり書いてなかったけど
ソースを見て、ぐぐってわかりました。
ヒント:バッファリング
960 :
nobodyさん :2007/02/01(木) 18:34:00 ID:uO0f4S6q
クッキー読み書きのサンプル探してます。 どこかにないですか?
@log = ('AAA,100,aaa','BBB,200,bbb','CCC,300,ccc'); @data = ('bbb','ccc'); $num = @log; for($i=0; $i<$num; $i++){ ($name, $price, $text) = split(/,/, $log[$i]); foreach(@data){ if($text eq $_){ $name = 'MATCH'; last; } } push(@newlog, "$name,$price,$text)"; } このような処理をしたいのですが、 とても効率が悪そうで悩んでます。 調べてみると、grepが利用できないかと思ったのですが、 うまくまとめられません。。どなたかよい智恵を貸して下さい!
すみません。 >push(@newlog, "$name,$price,$text)"; push(@newlog, "$name,$price,$text"); です・・
>>962-963 # usage> perl this_script 2 bbb ccc
my($pos, @word) = @ARGV;
my $regex = join '|', map quotemeta, @word;
$regex = qr/(?:$regex)/;
my @matched;
(split /[,\n]/, $_, $pos + 1)[$pos] =~ /^$regex$/ && push @matched, $_ for <DATA>;
print @matched;
__END__
AAA,100,aaa
BBB,200,bbb
CCC,300,ccc
DDD,400,ddd
>>964 感謝です!応用してやってみます。
ありがとうございました。
$text = 'abc'; $s1 = \$text; $s2 = \'abc'; $s3 = \('abc'); $s4 = \('abc', 'def'); $s5 = \($text = 'def'); $s1〜$s5は全部スカラーのリファレンスになったのですが $s4とかが配列にならないのは何故なんでしょうか? 夜も眠れません(>_<)
>>966 http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html#Making_References > 列挙リストに対するリファレンスを取るということは、ブラケットを使うことと
> 同じではないということに注意してください。これはリファレンスのリストを
> 生成することと同じなのです!
>
> @list = (\$a, \@b, \%c);
> @list = \($a, @b, %c); # 同じこと!
>
> 特殊な場合として、\(@foo)は@fooの内容へのリファレンスのリストを返し、
> @foo自身へのリファレンスは返しません。これは%fooと似ていますが、
> キーのリファレンスがコピーに対するものである点が異なります(これは
> キーがfull-fledgdスカラーではなく単なる文字列であるためです)
$i=1;のときに print "$iueo";の出力結果を1ueo と表示するために$iを何かで囲めば良かったと記憶しているんですが度忘れしてしまいました。 すみませんが教えて下さい。調べるキーワードでも結構です。
${i}ueo
973 :
nobodyさん :2007/02/08(木) 17:09:57 ID:MLG2+XR4
ActivePerl5.8.8にてNet::Pingを利用した鯖死活監視CGIをコーディング予定です。 必須事項として、レスポンスmin/maxから算出したアベレージが必要です。 コマンドプロンプトからの実施時のようにレスポンスを採りたいのですが、Net::Pingにはこのよいな実装がないのでしょうか? かなり検索はしたのですが、レスポンスタイムの取り方を解説している場所がありませんでした 何か良い方法が有ればご教授下さい。
974 :
脱帽 :2007/02/08(木) 17:29:34 ID:???
Net::PingのマニュアルのSYNOPSISのところにある # High precision syntax (requires Time::HiRes) $p = Net::Ping->new(); $p->hires(); ($ret, $duration, $ip) = $p->ping($host, 5.5); printf("$host [ip: $ip] is alive (packet return time: %.2f ms)\n", 1000 * $duration) if $ret; $p->close(); が応答時間をとる例そのものずばりじゃないか。何回かやって平均/max/minとる ところは自分で書いてください。そのくらいはできるだろ。
976 :
nobodyさん :2007/02/08(木) 18:43:10 ID:MLG2+XR4
977 :
あっこ :2007/02/08(木) 19:23:45 ID:LIdpjyEo
とりあえずおっぱいうp
>>977 &kouyaku()の中身が知りたいという事か?
1から$num1と$num2の小さい方までをforで回して
$num1と$num2が両方割り切れるようならその値をリストに追加、
最後にリストをまとめて返すというだけの処理。
この程度のソースが書けないのは素人どころのレベルじゃねーぞ。
とりあえず
>>1 を100万回読み直して自作のソースを晒せ。
違うよ。 1.両方の数字を因数分解 2.両方に共通する因数を抜き出す 3.それらの組合せの全て出す 4.各組合せの乗算を算出 5.重複した値を除いて、「1」とそれらの値を画面出力
intとハッシュでおk 30秒で出来た
こんな時こそデータベースだろッ!
983 :
972 :2007/02/09(金) 12:39:36 ID:???
>>974 出来ました!
あ(・∀・)り(・∀・)が(・∀・)と(・∀・)う!
984 :
nobodyさん :2007/02/09(金) 16:40:43 ID:bT11nyvb
ハッシュ配列においてpushという命令使用できないのでしょうか?
オブジェクトへ配列のリファレンスを渡すと、何故かリファレンスではなく 展開されたデータが渡ってしまうのですがなぜでしょうか? @a = qw(a b c d); $obj->hoge(\@a); sub hoge{ my $self = shift; my $ref_array = shift; print $ref_array; } こうするとなぜか「ARRAY(0x275cc8)」 といったアドレスデータではなく、「a b c d」と勝手に展開されたものがプリントされてしまいます。
987 :
986 :2007/02/09(金) 21:19:14 ID:???
すみません、試行錯誤してたら自己解決しました。 デリファンスを @a = @$ref_array; ではなく、 @a = @{$ref_array}; とやったらうまくいきました。 なぜそうなのかはわかりませんが・・・
>>987 そもそもお前が986で示したプログラムにはそんな部分はないわけだが。
ちゃんと正確に晒さないと的確な回答は得られないと思われる。
次スレ待ち保守
use Perl6::Say; say '埋め';
use CGI::SOSHI; use strict; my $stop = CGI::SOSHI->new; print $stop->soshi(); 阻止!
use BBS::WWW2ch; write_thread 'php', '164519503', '梅';
機械よ 産め!
久米
use CGI::SUSHI;
うめうめ
松竹梅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。