Perl コーディング初心者質問コーナー Part27
1 :
nobodyさん :
03/08/14 06:06 ID:xOc/6R60
つーか、荒してるのひとりだけだし、こまめに削除依頼出せばいい
あぼーん
あっと、演算子でしたか…。 演算子は数値なので、<=>を使用。
s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge; s/\s/+/g;
s/\s/+/g は、 s/ /+/gでは無いので注意しましょう。この場合は問題は起きないけど。
16 :
nobodyさん :03/08/14 11:29 ID:H+TQovVp
今、深沢千尋氏の書いた『すぐ分かるPerl』を元に勉強しているのですが、 その中の、第五章『プログラムにデータを渡す 〜引数〜』という章で、 #! /usr/local/bin/perl print "$ARGV[0]\n"; print "$ARGV[1]\n"; print "$ARGV[2]\n"; print "$ARGV[3]\n"; print "$ARGV[4]\n"; に"love"という引数を与えてみましょう。 と書いてあるのですが、どうやれば引数を与えられるのでしょうか。 OSはWindowsXP、エディタはTeraPadを使っています。 よろしくお願いします。<(_ _)>
>>16 @ARGV は実行ファイルに対する引数。
ファイル名を aya.plとした場合、
aya.pl love
で動くでそ
18 :
13 :03/08/14 12:09 ID:???
>>14 ありがとうございます。
ところで、
>>14 を見て逆に、
googleで「エンコード perl unpack」で検索していくつかのページを見たんですが、
s/ /+/g; とやってるところしか見あたりませんでした。
>>15 の意図はどんなところにあるのでしょうか?
[0-9A-Za-z_ ] 以外は変換済みなので\sに該当するものは 空白しかないけど、本来の目的ではTAB等も+に変えたかった ってことじゃねーの?あまり深い意味は無い
20 :
16 :03/08/14 12:43 ID:H+TQovVp
>>17 レスありがとうございます。
早速ファイル名を aya.cgi love にしてFFFTPを使ってトクトクに送り、
あなたのアクセスしたファイルは、
アクセスする権限が与えられていないか、
もしくはindex.html 又は index.htmが存在しません。
と表示されました。
お手数ですが、他に方法は無いでしょうか。よろしくお願いします。
補足
*拡張子 .pl だとこのCGIのダウンロードが始まり、駄目っぽいので、元通り拡張子.cgiで試してみました。
*#! /usr/local/bin/perl と書きましたが、これは本の中にこう書いてあるだけで、実際には #!/usr/bin/perl
であり、Tok2.comに送ってやっとります。 説明不足スイマセン。
面倒くさいからこれでいいだろ s/(\W)/'%' . unpack('H2', $1)/eg; 半角スペースは当然 %20 に変換される
>>20 共有サーバでそんなテストなんかするな!
自分のPCにperlとhttpd入れてやれ
それにやってること丸っきり的外れ
>>20 「すぐわかるPerl」なら
1.1Perlは入っているか?
をじっくり読んでみてください。
>>19 URLエンコードは本来不可逆だってこと?
>>20 トクトクから損害賠償請求が来ますよ?
>>20 つまり、おまえみたいな馬鹿は二度と来るなってこと。
すげー迷惑。人のことも考えろ、ハゲ!!
#!/usr/bin/perl # CGIヘッダの出力 print "Content-type: text/html\n\n"; while($HP1 > 0) and ($HP2 > 0){ srand1; srand2; } # Player1 $HP1 = 400 - $kougeki1; $KIK1 = 60; $PAN1 = 20; $DF1 = 10; # Player2 $HP2 = 300 - $kougeki2; $KIK2 = 100; $PAN2 = 40; $DF2 = 0; # Player1 $kougeki1 = srand; # Player2 $kougeki2 = srand2;
srand; if($mode == 1){ $offense = \%you; $defense = \%my; }elsif($mode == 2){ $offense = \%my; $defense = \%you; } if( int(rand(2)) ){ #punch $damage = $offense->{'$PAN1'} - $defense->{'$DF2'}; if(!$rand = int(rand(5))){ #half $damage = int($damage / 999); }elsif($rand < 3){ #miss $damage = ""; } }else{ #kick $damage = $offense->{'$KIK1'} - $defense->{'$DF2'}; }
srand2; if($mode == 1){ $offense = \%you; $defense = \%my; }elsif($mode == 2){ $offense = \%my; $defense = \%you; } if( int(rand(2)) ){ #punch $damage = $offense->{'$PAN2'} - $defense->{'$DF1'}; if(!$rand = int(rand(5))){ #half $damage = int($damage / 999); }elsif($rand < 3){ #miss $damage = ""; } }else{ #kick $damage = $offense->{'$KIK2'} - $defense->{'$DF1'}; } ($damage < 0) and ($damage = 0); $defense->{'HP1'} -= $damage; ($damage < 0) and ($damage = 0); $defense->{'HP2'} -= $damage;
# HTMLの出力 print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n"; print "<html>\n"; print "<head><title>対戦バトル</title></head>\n"; print "<body> <p>Player1:体力は$HP1です</p> <p>Player2:体力は$HP2です</p> <p>Player1は<big>$kougeki1</big>のダメージを与えた。</p> <p>Player1は<big>$kougeki1</big>のダメージを受けて混乱した。 <p>Player1は<big>$kougeki1</big>のダメージで友達のトイレではみ出したクソをし始めた。 <p>Player2は<big>>$kougeki2</big>のダメージを与えた。</p> <p>Player2は<big>>$kougeki2</big>のダメージを受けて裸踊りを始めた。 <p>Player2は<big>>$kougeki2</big>のダメージで友達の女にレイプし始めた。</p></p></body>\n"; print "</html>";
あぼーん
あぼーん
32 :
nobodyさん :03/08/14 19:26 ID:OJ2itBeZ
socket (SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')); このように、socketで作ったSOCKハンドルのポインタ操作はでき ないのでしょうか。 どこで操作しても、ポインタは「-1」となっております。 理解不足で申し訳ありませんが、宜しくお願いいたします。
>>32 ポインタ操作って何?
>2: それでこんな風にやってみたが・・・
ここを具体的に。
>>20 やってることは10章の内容です
もう少し本を読み進めてから取りかかってはどうでしょうか
>>32 操作をすることはできません。
Perlをやってる奴はおまえさんみたいなオタクが多い。
オタクはきもいから、気づかないんでしょうね。
>>20 perl = cgi ではない。
お前さんがまずしなければならんのは、自分のパソコンにperlをインストールして
コマンドラインさっきのコマンドが実行するかを確認することやね。
この文章読んでわからんようであれば、あらしと取られかねんからそのつもりで。
#あと、perlをどうやってインストールしたらいいですかなんてことは聞くなよ(w
Perlの s./// と tr/// の違いがいまいちわからないのですが、どういう違いがあるのでしょうか・・・
sub get_select_form{ my ($name, $selected) = @_; my ($key, $form); $form .= '<select name="' . $name . '">' . "\n"; foreach $key (sort keys %{$name}) { if($key eq $selected){ $form .= '<OPTION value="' . $key . '" selected>' . ${$name}{$key} . '</OPTION>' . "\n"; } else{ $form .= '<OPTION value="' . $key . '">' . ${$name}{$key} . '</OPTION>' . "\n"; } } $form .= '</select>' . "\n"; return $form; } このようなselectボックスを生成するサブルーチンを作ったのですが、 sort keys %{$name} のところで「〜HASH ref while "strict refs"〜」と怒られてしまいます。 no strict;は使いたくないので、何かよい解決策があれば教えてください。 すみませんが宜しくお願いいたします。
>>38 たとえば $_='ABCDECBA' あたりで
s/ABC/123/
と
tr/ABC/123/
を試してみれば分かります。
えーと、前にも一応お世話になった者で基本的な質問で悪いんですが、 配列に格納されているすべての文字列の先頭にある文字列を連結させたいんですが 下記のコードではうまくいきませんでした。 実際は頭に付ける文字列を変えて何回もこの処理を繰り返すのですが、 (サブルーチンにして、↓の例の$push_wordは引数として受け取る) 二回目からは、前回頭に付けた文字列と$push_wordを頭につけてしまいます。 簡単な応用技術ですがご教授願えたら幸いです。 【理想】 @bar = ("gg","dge","mpire","ncode","nglish") を @bar = ("Egg","Edge","Empire","Encode","English") とするような処理(配列名barに意味はなし) 【こうしてみた】 (@barを定義した後、) my $push_word = "E"; foreach (@bar){ my $a = $push_word; $a .= $_; $_ = $a; } print "@bar";
2chみたいに、一度ポートチェックをする掲示板を作りたいのですが if (connect (SOCK,sockaddr_in($target_port, $addr))) { ®ist; }else{ &error(); } みたいにしたのですが、テスト運用してみると 途中でスクリプトごと落ちることがあり悩んでいます。 どのようにしたら、安全な処理ができますでしょうか?
®ist; エスケープしてませんでした。 &regist; と書いたつもりです。
あれ? ®ist;です
>>41 my @bar = ("gg","dge","mpire","ncode","nglish");
my $push_word = "E";
print map $push_word.$_, @bar;
漏れも勉強中なので自信ありませんが
こんな感じでどうでしょうか?
結果はEggEdgeEmpireEncodeEnglish
>>39 引数がちょっと無茶じゃない?普通に考えて、
・selectの名前
・selectedにしたいもの
の他に、
・option要素のハッシュ
が必要でしょ。
例えば
<select name="chara">
<OPTION value="giko" selected>ギコ</OPTION>
<OPTION value="mona">モナー</OPTION>
</select>
を作るとして、その関数だと get_select_form("chara", "giko")を
呼ぶときに、グローバルの %chara にOPTIONの要素を入れておく
ってことになるけど、それって変じゃない?
引数リストを $name, $selected, $ref_values (順不同)みたいにすれば
いいと思うよ。
>>45 すばやい回答thx。
print map 〜ってのってどういう意味?map関数ってとほほに載ってないんだけど…
あと、注文多くて悪いんだけど、Eを追加した後の@barが欲しいんだ。例で書いた最後の@barはおまけみたいなもん。ごめんな
>>47 @bar map{ 'E' . $_ } @bar;
mapはぐぐって調べるぐらいはするこった・・・
>>39 ソフト(シンボリック)リファレンスをやめて、リファレンスを使う。
>>41 foreach使うなら
foreach(@bar){
$_ = $push_word. $_;
}
mapは、リストを受けて、処理を行って、リストで返すパイプみたいなもの。
perldoc -f map
#
>>48 '=' 抜けたね。
>>42 エラーかシグナルか、落ちる原因をはっきりさせてから対策を立てる。
>>49 おうっ、盲点でした。
今は見えてる点のほうが圧倒的にすくないけどなw
>>45 3行目に
open (IO,"+<$logfile");
7行目に
while (<IO>){
if ($_ =~ /<>$ip/){
@y2=split(/<>/,$_);
if ($y2[6] ne $ip){
push(@log,$_);
}else{
$y2[0] = 'All Clear (^-^)v'; #消去後の名前
$y2[5] = 'All Clear (^-^)v'; #消去後のメッセージ
push(@log,"$y2[0]<>$y2[1]<>$y2[2]<>$y2[3]<>$y2[4]<>$y2[5]<>$y2[6]<>$y2[7]<>\n");
}
}else{
push(@log,$_);
}
}
11行目に
truncate(IO,0);
seek(IO,0,0);
print IO @log;
close (IO);
&reload2;
}
を入れると直ります。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
61 :
nobodyさん :03/08/15 21:25 ID:ifID8mtm
perlスクリプトを書いたのでそれをDLLファイルにしたいのですが。 あと、できればサブルーチンがそのままDLLの関数になるようにしたいのですが。 どういう風にすればよいのでしょうか。 環境はWinMEでActivePerlです。
63 :
山崎 渉 :03/08/15 22:25 ID:???
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
>>49 そうですね。落ちる原因を考えて出直してきます(コナクテイイカ
お早うございます。 初めてこのスレ来ました レベル低すぎ じゃあサヨウナラ
my %hash = ( 5 => 5, 10 => 10, 15 => 15, 30 => 30, 50 => 50 ); このようなデータを foreach my $key (sort keys %hash) { print $key; } このようにsortすると、 10 15 30 5 50 となりますよね。 この5が一番上にいくような効率のいい方法はないもの でしょうか。
>>66 sort {$a<=>$b} keys %hash
68 :
KY :03/08/16 04:59 ID:???
>>66 sort {$a<=$b>=$KIK} keys %doragonash
の方がうまくいきますね。それよりもあなたの知性の低さは迷惑です。
早く首吊って死んでくれることを祈ってます。
>>67-68 こんな遅い時間に二人も答えてくれるなんて、ホントここは
いい人がいますね。
本当にどうもありがとう。
あぼーん
>>69 ごめんなさい。
だけど、親切に答えてくれて、本当にどうもありがとう。
感謝してます。
あぼーん
あぼーん
あぼーん
こんなかんたんな問題に答えラれなれないなんて、なんてクズなところでしょう。 本当、ここはくさった人間しかいませんね。とっとと死んでください!!
削除依頼を出しまくっているやつは荒らしか? かちゅ使用者には迷惑だって言っているだろうが。
あぼーん
>>46 ,49
返事が遅れてしまい、すみません。
ハッシュのリファレンスを使うことにより、無事解決
いたしました。
本当に有難うございました。
あぼーん
あぼーん
あぼーん
>>77 削除依頼よりかコピペ荒らしで挙げれば規制対象になるのにねぇ。。。
84 :
nobodyさん :03/08/16 08:41 ID:mdqCqsMr
SQL文のデバッグなどで、printとは別にどこかへ変数の内容などを出力する場合、 どのような方法が考えられるでしょう?
あぼーん
86 :
nobodyさん :03/08/16 10:24 ID:22Mj43o0
>>62 お答え、ありがとうございます。
できるとは最初から思ってはいませんでしたが。
C言語とかでDLL書くのめんどくさいのでperlでかけたらなぁって。
とりあえずまずはperlcc使えるように環境を整えようかと思っております。
なぜか僕の環境、Cプログラムは吐き出すんですがコンパイルしてくれなくて。
しかもそのプログラムをコンパイルしてみるがエラー続出。
どうなんだ、LarryWallよw
仕方がなく自分でエラー部分を書き直してるのですが。
なんとかまともなCプログラム、吐き出させられないですかね。
ちなみに環境はWinMeでActivePerl、CコンパイラはDev-C++(GCC系)とBCCです。
解決方法がありましたら、教えてください。
VC++を使う。
>>83 そう思うなら、おまえがコピペ荒らしとして規制依頼しろよ。できねーくせにガタガタぬかすな
89 :
nobodyさん :03/08/16 11:18 ID:mv+dlsfN
KENTのネットクルーザーで 検索部分を改良したい。 英語の半角、全角をともに検索するには どうしたらいいのでしょうか?
92 :
91 :03/08/16 12:08 ID:???
ErrorDocument 404 /nph-test.cgi だと、ヘッダに404となってしまうので、 ファイル名をnph-program.cgiにして、「print 'HTTP/1.0 200 OK'."\r\n";」とヘッダに追加。 でも、エラーログが(ry
>>91 DirectoryIndex
スレ違いなので後は自分で調べな。
94 :
nobodyさん :03/08/16 12:32 ID:R1l09wg/
>> 93 DirectoryIndex DirectoryIndex nph-program.cgi と記載してあります。 やっぱプログラム側の問題じゃないからここじゃ駄目ですね。。。
コピペ荒らしにマジレス。 残り少ない夏休みを2chでコピペ荒らしするだけに費やす気みたいだけど、 入門本くらい一通り読んで初心者レベルに到達してから来てね。
>>86 perlをCにトランスは完全に出来ませんし
できたとしても使い物にはなりません(実行ファイルは馬鹿でかい)
あきらめたほうがいい
XSをつかうかswigをつかうか
perlのソースコードを書き換えるかしてください
Win32系のモジュールで直接DLL関数に引数はわたせます
>>84 コメント扱いで出力。htmlなら<!-- -->内に埋め込む。batならremの後ろに書く。
自分でファイルをオープンして書き込み保存。
syslogに飛ばす。
変数デーモンを作成して、そこへの接続を全て記録。
>>91 そう言う用途にはapacheのモジュールのmod_writeを使うと便利。
が、確実にスレ違いなのでそれ以上言わない。
mod_writeじゃねーよ>オレ mod_rewriteね。
99 :
91 :03/08/16 13:05 ID:R1l09wg/
googleでmod_rewriteで探してきます。 Apacheの板orスレってあったっけ?(−−
>>99 この板にも自宅サーバ板にもUNIX板にも
101 :
91 :03/08/16 13:49 ID:R1l09wg/
>> 100 おお。..._〆(゚▽゚*)メモメモ ありがとうございました それではいってきます(w
102 :
91 :03/08/16 15:16 ID:R1l09wg/
/htdocs/.htaccess: Invalid command 'RewriteEngine', perhaps mis-spelled or defined by a module not included in the server configuration こんなエラーから進めない(;;
103 :
91 :03/08/16 15:39 ID:R1l09wg/
>>99 mod_rewriteが入っていない可能性が出てきたので他の方法ってありませんか?
105 :
84 :03/08/16 15:54 ID:mdqCqsMr
>>97 >コメント扱いで出力。htmlなら<!-- -->内に埋め込む。batならremの後ろに書く。
……コロンブスの卵(^^; そーか、SQL実行しないでこーすればいいのか(汗)
アドバイスありがとうございました。
あと、「syslogに飛ばす」っつーのは、具体的にどうすればいいのでしょうか?
厨で申し訳ありませんが、ヒントなど頂ければ幸いです。よろしくお願いします。
>>105 qx{/usr/bin/logger -s "Virus warning: uploader:[$host]:Detected $1 and deleted."};
みたいな。
このスクリプト、どうもみても初心者のじゃねーよ
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
質問スレが珍しく荒れてるな〜と思ったら、全部 メール欄??? の仕業かい!w
お。なるほど。メール欄であぼーんすればよかったのか
117 :
84 :03/08/16 18:57 ID:mdqCqsMr
……syslog.phってどーやってつくればいいのでせう?<厨なアタシ(T_T) それはさておき、「Can't locate Date/Manip.pm in @INC〜」なんてエラーが出てきました。 CPANで「Install1 Date」はしたのですが、他になにかしなければならないことがあるのでしょうか? 重ね重ねで申し訳ありませんが、よろしくお願いします。
十進数の数字があり、それを出力する時16進数にしたいのですが、 どのように変換すれば良いのでしょうか? すみません、かなり初歩的な質問ですがお願いします。
sprintf
%x
122 :
84 :03/08/16 22:43 ID:mdqCqsMr
>>118 Date::Manipは入りました。……単純に「install Date::Manip」でOKなんですね。
厨でごめんなさい(T_T)
あぼーん
>>119 printf("%x", $a);
とか
$s = hex($a)
とか
125 :
119 :03/08/17 01:30 ID:???
返信遅れてすみません。 アホな質問に答えてもらって、とってもありがとうございました。 m(__)m
126 :
nobodyさん :03/08/17 01:59 ID:okMBcaWD
ディレクトリ作成するときって mkdir("mydir",0700); のようにパーミッション指定できるが、 open(fp,">output.txt"); ってやって書き込むとパーミッションが自動的に644になります。 これを600にするにはどうしたらいいでしょう??? っつってもあとでchmodすればすむことなんだが、 open時に600にするようにできればしたい、
>>126 いったんファイルを削除します。それからディレクトリで呼び出すを選ぶと
復元できるので、その設定でパーミッションを設定すると固定できます。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
>>126 IO::Fileモジュール使うとパーミッションを指定しながらオープンできます。
(sysopen互換のO_XXX指定を使うとファイルロックしながらオープンできたり便利。)
137 :
126 :03/08/17 02:42 ID:???
大変参考になったぞ。 おめーらに感謝。
あぼーん
139 :
nobodyさん :03/08/17 05:55 ID:EjdzKOi8
POP3サーバと接続してメールを閲覧するプログラムを 書きたいのですが、これをsocketモジュールを使わない で行うことは可能でしょうか。 初心者ですみませんが教えてください。
140 :
nobodyさん :03/08/17 06:21 ID:1qkkfnQM
化膿。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
149 :
nobodyさん :03/08/17 13:11 ID:8iaOJK9H
X.cgiの中の、一部の数字を取り出したいのですが。 X.cgiの中身はこんなです 1,データA,データB,データC, 2,データA,データB,データC, 3,データA,データB,データC, この中の、最後のデータの数字「3」を変数に入れたいのです。 open(IN,"X.cgi") ; while (<IN>) { $num = split(/,/); } close(IN); print $num; これ全然違いますが、$numに「3」が入ってくるようにしたいんです。 よろしくおねがいします。
>>149 splitの使い方がまちがっとる
$num = split(/,/); のすぐ下に print $num; を入れてみ。
その後で、splitの説明を読むとグー
>>149 $num = split(/,/); の2つ下に print $num; を入れる。
それからwhile (<IN>) { をwhile($IN1 > 0){
に変える。
その後で、スクリプトを3の入るようにすればOK。
上はどっかの馬鹿だから無視しろ。
あぼーん
あぼーん
あぼーん
あぼーん
>>126 おまえの脳みその程度もよくわかりました。
もう、二度と来ないでくださいね。すっごいむかつく!!
くだらん質問する暇あったら自分で調べろ!死ね!!
あぼーん
あぼーん
あぼーん
レス削除で削除人からコピペで依頼してくれってあったから、 運用情報のほうへ回そう 荒らしとしてアク禁しますっていうことなんじゃないか?
>>160 なんでアレは削除依頼に入れてくれないんだろう。
164 :
nobodyさん :03/08/17 17:34 ID:FkUVLAYO
#! /usr/local/bin/perl while(<STDIN>) { print; } のようなフィルター(そのまま出力するだけですが(;´Д`))を作った後、 DOSの場合、どうやって実行するんですか? すごい初歩的な質問でスイマセン
Perlでバイナリファイルに保存したいんだけど、なにかあります?
>>164 perlにパスが通っており、
それがtest.plというファイルなら、
test.plのあるフォルダにcdコマンドで移動し、
perl test.pl
と打ってEnterを押す。
とか、普通に答えてみる。
コーディングの質問じゃねー。
>>165 binmode( FILE );
print FILE $buff;
168 :
nobodyさん :03/08/17 18:23 ID:FkUVLAYO
>>166 出来ました。ありがとうございます。
というかスレ違いでしたか、スイマセン。今から気をつけます。
>>165 >Perlでバイナリファイルに保存したいんだけど、なにか(いいバイナリファイル)あります?
画像ファイルがバイナリファイルだろうね。
あぼーん
171 :
nobodyさん :03/08/17 18:44 ID:ycQ+dswy
アクセス解析のCGI作ったんですけど、 フレームを使っている性で全部リファラがindexになってしまいます。 使っている鯖はSSIは使えませんし、.htaccessも使えません。 どうすればリファラが取れるんですか?教えてください。御願いします。 すれ違いだったらすいません。
>171 CGIスレ向き。
あぼーん
174 :
139 :03/08/17 19:29 ID:???
>>140 説明不足ですみません。
要はモジュールを使わずにpop接続を行いたいのです。
あぼーん
176 :
149 :03/08/17 19:40 ID:8iaOJK9H
>>151 ありがとうございました。
ちょっとうまくいかないんですが(TT)
なんか根本的に判ってないかもしれないので出直します。
splitの勉強を・・・
>>174 一旦モジュールを使って望みの動作をするスクリプトを組み、
コードを全てインライン展開する。
荒クンを解析してみたよ。 ・17歳童貞 ・高校生だが、成績が追いつかず、学校でも苛められて現在引き篭もり中。近々退学予定。 ・自己管理が出来ず、体系は肥満気味。お風呂に入らないので臭い。 ・家族構成は共働き両親2人とペットのハムスター20匹(名前付き) ・起きている間は、ほぼインターネットを利用している。 ・最近KENT-WEBからASKAを借りてきて、初めてPerlを知った。 ・日ごろから、書き込む度に叩かれている某掲示板には恨みを抱いているようだ。 ・もう2ヶ月ほど家族意外と顔を合わせた事は無い。
182 :
nobodyさん :03/08/17 20:58 ID:qWovZd+9
#!/usr/local/bin/perl require './cgi-lib.pl'; %form = &read_input('euc'); $name = $form{'name'}; print "Content-type: text/html\n\n"; print "<html><head><title>結果</title></head><body>\n"; print "<p>名前:$name</p>\n"; print "</body></html>\n"; ↑のようなスクリプト作ってANHTTPDを起動し、 実行しようとしても「サーバーがみつかりません」が表示されます。 何がいけないんでしょうか?
IO::File の使い方教えてください 日本語で解説してある際とがぜんぜんないもんで。 use IO::File; my $fh = new IO::File('log.dat','r'); #読み込み my $fh = new IO::File('log.dat','w'); #書き込み my $fh = new IO::File('log.dat','r+w'); #両方 などでオープンできるとこまではわかったんだが、 このファイルから全部読み込む場合にはどうしたらいい? my @array = $fh->read; ← こんな感じでよいのかい? あと、書き込むときは $fh->print('文字列'); で、可能みたいなんだが、英語が四面からわからん。
>>184 perlコーディングとは「全く」関係無いですね。そのエラーから「推測」すると、
あなたのクライアントからサーバーが見れていないようです
> で、可能みたいなんだが、英語が四面からわからん。 こんな事言う様じゃ解答する気になれないな。 これを機会に読めるように辞書片手に必死こいて読んで見たら? 解答者の中にはそうやってスキルとか知識身につけてる人もいるんだから
>>186 ,
>>188 回答ありがとうございます。
でもANHTTPDは「CGIを実行する」にチェックが入ってます・・・
190 :
139 :03/08/18 00:10 ID:???
>>181 仕事でパッケージ化するかもしれないといわれたので、
完全オリジナルでなかったら何かと問題が出るかと思い、
質問させていただきました。
もともとは趣味で作ってたものなので。
標準モジュールは使っても問題ないのでしょうかねぇ、、、
>>189 どっちにしてもさっきのソースとは関係なし
ANHTTPDがちゃんと動くことを確認してから質問せよ
>>189 そもそもCGI以外はどうなのか。閲覧可能なのか。
>>189 板違いだ!ヴォケ!!二度と質問するな!クソ坊主!!
>>139 できねーっていってんだろ!馬鹿!!
おまえみたいなよく読まない奴は、うざいからさ。とっととどっか行ってくれない?
まじに迷惑なの、わかんない??
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
>>174 getprotobyname
gethostbyname
socket
bind
connect
これらを使えばOK
bindはいらないと思う。
Date::Simple という、 日付のチェックを行う便利なライブラリがあったので インストールしたんですが、なぜか使えません。 my $date = new Date::Simple(1999,12,31); を実行すると Undefined subroutine というエラーが出ます。new関数が定義されてないとか言われ増す。ためしに print $Date::Simple::VERSION; とやってみたら、ただしく 1.03 と表示されたので、 ライブラリのパスが間違っているとかそういうことはないと思うんですが、 どうやったら使えます?
>>204 理由は?それに、「思う」とか不確実な表現されても理由も書かないんじゃ全然説得力無い
208 :
nobodyさん :03/08/18 11:11 ID:rz7xuT5a
if($ran==6) だと6の時という事ですが、 6以外と指定するのはどう書くんですか?
211 :
nobodyさん :03/08/18 12:12 ID:WxMQyRS0
217 :
nobodyさん :03/08/18 14:27 ID:PgjPpzIP
>>206 普通にキモイと思います。多分伊達眼鏡とかかけてる人。
>>205 useしてる?
・・・してないわけないか。
219 :
nobodyさん :03/08/18 14:48 ID:OsKLKOac
ちょうド素人でスマソ 重いPerl製CGIをサーバーに置こうと思ってるんですが、 少しでも動作を軽くしようと思っています。 そこでききたいのですが、Perlのコメント部分を全て消して余分な部分を少しでも減らしたら少しでも軽くなるでしょうか? コメントを消したりしたら軽くなる、ってはなし聞いたことないんですが、実際のところはどうなんですか? 一応、少しだけでも軽くなれば目標達成なので。
220 :
nobodyさん :03/08/18 14:50 ID:WxMQyRS0
2行目にexit;って入れたら最速になるぞ
>219 ナノ秒やピコ秒単位でなら早くなるかもね。
perlでファイルを新規作成するにはどうしたらいいのでしょうか? 書き込み時にファイルが存在しないとファイルが作成されるのは知ってるのですが、 unless (-e $datafile){ <unlinkの逆> $datafile; }; をやりたいのですが。。。
224 :
nobodyさん :03/08/18 18:44 ID:P7pot7R5
乱数の生成は分かるのですが、 パスワードの生成(しかも、使える文字は[a-z0-9]で大文字はなし)が どうすればいいのでしょうか?
226 :
223 :03/08/18 18:49 ID:???
>>224 すいません。perlからunixのコマンド起動できないんです。。。
>>219 まず、ファイルを削除します。それから、ファイルの復旧を行って
オプションを、コメントなしに設定すると軽くなります。
>>223 板違いだから、WEB板へいけ。邪魔だ。消えろ!
>>226 そんなエレガントな(?)関数は無いよ。
sub touch ($) {
local *FH;
my $ret = open(FH, ">>$_[0]");
close(FH);
return $ret;
}
>>225 乱数を細かく設定するには、ファイルの削除で削除してから
設定します。
>>226 そのパソコンはできないんだよ。
初心者の質問は違うとこでやってね。迷惑。うざい!死ね!!
>>223 open FILE , ">$datafile" unless -e $datafile;
close FILE;
これで空ファイルつくるだろ。
>>228 >>231 もちっとましな物言い、できんのかよ…
自分らの書いたせりふ、声に出して言ってみ
>>225 なぜか面白いことがしたくなる…
@char = (0 .. 9, 'a' .. 'z', 'A' .. 'Z');
print join '' @char[ map(int rand @char, 1 .. 8) ];
おっと。コンマが抜けた。 print join '', @char[ map(int rand @char, 1 .. 8) ];
大文字は無しか…うぅ @char = (0 .. 9, 'a' .. 'z');
あぼーん
あぼーん
>>225 こうだな
@char = (0 .. 9, 'a' .. 'z', 'A' .. 'Z');
print join '' @char[ while(int rand @char, ..) ];
あぼーん
あぼーん
あぼーん
>>205 newメソッドがないと
Can't locate object method "new" via package "Date::Simple"
とでるので、別の原因があると思われ。
Date::Simpleはpure perlだから、/Date/Simple.pmを探してみそ。
>233 荒らしは放置しる。
無知がこんどは糞7扱いか。
簡単なことだと思うのですが、 CGI(Perl)で、カレントディレクトリにあるHTMLを、 呼び出して、それをそのまま表示する方法が分かりません。 具具ってもなかなか見つからないので、お助け下さい。
>>246 (略)
if(!open(FILE,"file.html")){
print "Can't open\n";
exit(1);
}
undef $/;
$a=<FILE>;
print $a;
何故ぐぐっても分からないか。 ・そんなことしても意味がない ・簡単すぎるから解説するまでもない
>>246 my $file = "hoge.html";
open(Fh, $file) or die "Could'nt open $file $!\n";
print while(<Fh>);
close(Fh);
Perlっぽく。
CGIならContent-typeとか、dieするとまずいとかあるから、注意。
>>249 ファイルハンドルは全て大文字で書かなくても委員会?
動作はするだろうがな
>>246 何故ぐぐってもわからない馬鹿が質問するか?
・
>>246 は生きる価値のないクズ!
・
>>246 は初心者で板違いの迷惑やろう
・早く死ね!
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
>>250 別に大文字じゃなけりゃいかんという決まりはなかったと思うが。
>>260 が、大文字でなかったために色々妙な動きをしてるやつがいたな。
意図していない動きをしているので、大文字でやっとけってことだよな。
大文字にしといたら、それがハンドルであることに気付きやすくなってちょっと幸せ。
大文字といっても、DATAなんかは避けといたほうがいいね。 別に使っても害はないけど、なんか気分的に。
263 :
nobodyさん :03/08/19 22:14 ID:IYLLDi9m
時差を修正するにはどうすりゃいいでつか? ぐぐったけど、初心者なんで分からないでつ。
あぼーん
>>262 FAIRUHANDORUとかがよろしい。
一目瞭然さ!
____ /∵∴∵∴\ /∵∴∵∴∵∴\ /∵∴∴,(・)(・)∴| |∵∵/ ○ \| |∵ / 三 | 三 | / ̄ ̄ ̄ ̄ ̄ |∵ | __|__ | < おい、誰かPerl教えろ!! \| \_/ / \_____ \____/
____ /∵∴∵∴\ /∵∴∵∴∵∴\ /∵∴∴,(・)(・)∴| |∵∵/ ○ \| |∵ / 三 | 三 | / ̄ ̄ ̄ ̄ ̄ |∵ | __|__ | < パールだ!パール!真珠じゃねえぞ \| \_/ / \_____ \____/
____ /∵∴∵∴\ /∵∴∵∴∵∴\ /∵∴∴,(・)(・)∴| |∵∵/ ○ \| |∵ / 三 | 三 | / ̄ ̄ ̄ ̄ ̄ |∵ | __|__ | < まずはパンチ5分の2な! \| \_/ / \_____ \____/
____ /∵∴∵∴\ /∵∴∵∴∵∴\ /∵∴∴,(・)(・)∴| |∵∵/ ○ \| |∵ / 三 | 三 | / ̄ ̄ ̄ ̄ ̄ |∵ | __|__ | < おまえは5分の2、おれのケーキは5分の3な \| \_/ / \_____ \____/
____ /∵∴∵∴\ /∵∴∵∴∵∴\ /∵∴∴,(・)(・)∴| |∵∵/ ○ \| |∵ / 三 | 三 | / ̄ ̄ ̄ ̄ ̄ |∵ | __|__ | < あと、イフとエルスとリリスとアダムも教えろよ! \| \_/ / \_____ \____/
273 :
205 :03/08/20 02:43 ID:???
Date::Simpleについて質問した者だが、 実は mod_perl を使っていたんだが、 今日、mod_perl を外して、普通のCGIとして実行させたら、 Date::Simple の new メソッドが正常に動きました。 この場合、mod_perl が原因なのは明らかだが、 具体的に mod_perl のなにがおかしかったのかよくわかりません。 わかる人レスください、
274 :
nobodyさん :03/08/20 03:55 ID:LVmz2hpa
本を買ってきて見ながら勉強し始めたものです。 メモ帳に本のとおりにこのように書きました。 (長いので2回にわけます) #!C:\Perl\bin\perl $agent = $ENV{'HTTP_USER_AGENT'}; print "Content-type:text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>環境変数</title>\n"; print "</head>\n"; print "<body>\n"; print "環境変数の取り出し\n"; print "<hr/>\n"; print "$agent\n"; print "</body>\n"; print "</html>\n"; exit;
275 :
続きです :03/08/20 03:56 ID:LVmz2hpa
上のものをftpソフトでアップすると、 「環境変数の取り出し」という文字はブラウザに表示されるのですが、 本に載っているような実行結果が出力されません。 (本にはMozilla/4.0(compatible〜...と載っています) ブラウザのソースを見てみると <html> <head> <title>環境変数</title> </head> <body> 環境変数の取り出し <hr/> </body> </html> とだけなっていて、空白のようです、 アドバイスお願いいたします、、
あぼーん
#!C:\Perl\bin\perl と print "<hr/>\n";
あぼーん
279 :
274 :03/08/20 04:18 ID:???
わー、書き間違えてました、 1番上は#/ur/local/bin/perlの書き間違いです print "<hr />\n";これを取り外せばよいのでしょうか、 やってみます
print "<hr />\n"; これは単にタグがおかしいだけ。
281 :
274 :03/08/20 05:02 ID:???
FTPソフトがなぜか接続しました、のまま止まってしまって
やっとつながりました、遅くなりました、
やってみたのですがMozilla/4.0(compatible〜...と出てくれません、、
次のページのものはずらずらっと文字が表示されて成功だったのですけど、
1番最初のができないまま進めてしまってよいものなのかなぁ、、
寝て起きたらもうすこしやってみます、
>>227 さん、
>>280 さん、お返事ありがとうございました
>>281 うちで使ってるサーバーでは、そのコードでちゃんと動いたよ。
>>263 「何の時差をどう修正したいか」ぐらいは最初から書こうよ。
>>273 思い込みはデバッグの敵だぞ。君のスクリプトが
mod_perl 上で走る為の要件を満たしていないだけかも知れん。
ともかく検証に必要な最低限のコードが示されないと、
何が悪いのかなんて分からんよ。
>>281 ブラウザやプロキシの設定で HUA 消してない?
my $exists = exists $ENV{'HTTP_USER_AGENT'} ? 'exists' : 'not exists';
my $defined = defined $ENV{'HTTP_USER_AGENT'} ? 'defined' : 'undef';
my $agent = $ENV{'HTTP_USER_AGENT'};
...
print "$exists, $defined, [$agent]\n";
とかしてみ。
280じゃないけど <hr/> 最近のブラウザじゃちゃんと解釈すると思うが…。 まぁ、考慮して<hr />にしと居た方が良いかもしれないけど。
<hr/>ってかなり普通だし。 XHTMLなら最初に宣言つけろってことか?
>>286 hrと/の間にスペースを入れろってことじゃないの?
<hr/>ってのを知らんかっただけだろ
まあ
>>275 のHTMLに<hr/>って有っても滑稽なだけだが
要らないよ。
>>291 とりあえずスペース入れろ。
それと一回ファイルを削除して、復元しろ。わからないところ、間違っているところが表示される。
#!/usr/bin/perl # CGIヘッダの出力 print "Content-type: text/html\n\n"; while($HP1 > 0) and ($HP2 > 0){ srand1; srand2; } # Player1 $HP1 = 400 - $kougeki1; $KIK1 = 60; $PAN1 = 20; $DF1 = 10; # Player2 $HP2 = 300 - $kougeki2; $KIK2 = 100; $PAN2 = 40; $DF2 = 0; # Player1 $kougeki1 = srand; # Player2 $kougeki2 = srand2;
srand; if($mode == 1){ $offense = \%you; $defense = \%my; }elsif($mode == 2){ $offense = \%my; $defense = \%you; } if( int(rand(2)) ){ #punch $damage = $offense->{'$PAN1'} - $defense->{'$DF2'}; if(!$rand = int(rand(5))){ #half $damage = int($damage / 999); }elsif($rand < 3){ #miss $damage = ""; } }else{ #kick $damage = $offense->{'$KIK1'} - $defense->{'$DF2'}; }
srand2; if($mode == 1){ $offense = \%you; $defense = \%my; }elsif($mode == 2){ $offense = \%my; $defense = \%you; } if( int(rand(2)) ){ #punch $damage = $offense->{'$PAN2'} - $defense->{'$DF1'}; if(!$rand = int(rand(5))){ #half $damage = int($damage / 999); }elsif($rand < 3){ #miss $damage = ""; } }else{ #kick $damage = $offense->{'$KIK2'} - $defense->{'$DF1'}; }
($damage < 0) and ($damage = 0); $defense->{'HP1'} -= $damage; ($damage < 0) and ($damage = 0); $defense->{'HP2'} -= $damage; # HTMLの出力 print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n"; print "<html>\n"; print "<head><title>対戦バトル</title></head>\n"; print "<body> <p>Player1:体力は$HP1です</p> <p>Player2:体力は$HP2です</p> <p>Player1は<big>$kougeki1</big>のダメージを与えた。</p> <p>Player1は<big>$kougeki1</big>のダメージを受けて混乱した。 <p>Player1は<big>$kougeki1</big>のダメージで野クソを食べ始めた。 <p>Player2は<big>>$kougeki2</big>のダメージを与えた。</p> <p>Player2は<big>>$kougeki2</big>のダメージを受けて、道路で裸踊りを始めた。 <p>Player2は<big>>$kougeki2</big>のダメージで電車の中のブス女をレイプし始めた。</p></p></body>\n"; print "</html>";
スペースは要るが、そこが問題の本質ではないってことだな。
300 :
274 :03/08/20 12:59 ID:dhaQVioy
こんにちは、原因がわかりました、 怒られそうです、 ノートンインターネットセキュリティを無効にしたら きちんとMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)と表示されました、 あー、、自分が嫌になりました、、 もっとちゃんといろいろやってみて どうしてもこうしてもわからなくなったら書き込むようにします、 お騒がせいたしました、申し訳ありません、、
<hr/>でもいいけど、<hr />のほうがいい。
303 :
nobodyさん :03/08/20 15:45 ID:ynfrwlt/
文字列の並び換えを他の数値リストから行ないたいのですが、どうしたらいいでしょうか? readdir()で取得したリスト@file_listを for($i = 0;$i < @file_list;$i++){ $time[$i] = (stat("$file_list[$i]"))[9]; } で取得した最終更新日でソートしたいのですが。 @timeをソートした時に、同じ順番で@file_listもソートするような事は どうしたらいいでしょうか? お願いします。
>>303 ファイルリスト取得時から根本的に変えると
my @file = map { name => $_, time => (stat $_)[9] }, readdir DIR;
print
map { scalar localtime $_->{'time'}, " $_->{'name'}\n" }
sort { $a->{'time'} <=> $b->{'time'} }
@file;
305 :
303 :03/08/20 16:34 ID:???
>>304 さん、ありがとです。
動いております。並び換えられているようです。
しかしながら、map童貞には、何故動いてるかわからんです(まだ1行目を理解しただけ)。
正直おっかないですw
306 :
303 :03/08/20 16:57 ID:???
for($i = @time;$i != 1;$i--){
for($j = 0;$j < (@time - 1);$j++){
if($time[$j] < $time[($j + 1)]){
$tmp = $time[$j];
$time[$j] = $time[($j + 1)];
$time[($j + 1)] = $tmp;
$tmp = $list[$j];
$list[$j] = $list[($j + 1)];
$list[($j + 1)] = $tmp;
}
}
}
結局こんなのを書いて逃げてしまう漏れは駄目ぽです。
>>304 さん、こちらでとりあえずお茶濁しときます。
perlらしい書き方も勉強せねばならんです。イキナリ読めなくなる。
>>306 @file と @time でやるなら
my @file = readdir DIR;
my @time = map { (stat $_)[9] } @file;
# 添え字を時刻昇順でソート
foreach (sort { $time[$a] <=> $time[$b] } 0..$#file) {
print(scalar localtime $time[$_], " $file[$_]\n");
}
こういうのは Perl 的な慣用句だけど、難しい事はしてないから
関数リファレンス片手に順番に読み解けばすぐ理解できるよ。
>>303 mapはforeachの亜種と思えば良いとおもう。
覚えとくと便利。手放せない。まじ。
基本的には右側の配列を順番に回してるだけ。
@array1 の要素を「:」で区切って2次元配列にする↓
@array2 = map { [ split ':', $_ ] } @array1;
と
foreach ( @array1 ) {
push(@array2, [ split ':', $_ ]);
}
がおんなじ。
309 :
nobodyさん :03/08/20 21:49 ID:Loi9JQvi
telnetで接続できるBBSをPerlで書こうと思っています。
現在、
http://x68000.startshop.co.jp/~68user/net/echo-3.html のechoサーバを参考に作っているところなのですが、
いかにしてキー入力を取得するかで悩んでいます。
現在、標準入力からそのまま取得しているのですが
これでは、BSやDELが効きません。
#入力された文字列がそのまま表示されてしまうため
#パスワードの入力にも使えません。
sub lineinput {
my ($mes) = @_;
print CLIENT $mes;
my $line = <CLIENT>;
$line =~ s/\x0D?\x0A?$//;
return $line;
}
どなたか、このような場合の一行入力ルーチンを
ご存知の方はいらっしゃいませんか?
>>306 とりあえず入力ルーチンを入れろ。
それと一回ファイルを削除して、復元しろ。わからないところ、間違っているところが表示される。
#!/usr/bin/perl # CGIヘッダの出力 print "Content-type: text/html\n\n"; while($HP1 > 0) and ($HP2 > 0){ srand1; srand2; } # Player1 $HP1 = 400 - $kougeki1; $KIK1 = 60; $PAN1 = 20; $DF1 = 10; # Player2 $HP2 = 300 - $kougeki2; $KIK2 = 100; $PAN2 = 40; $DF2 = 0; # Player1 $kougeki1 = srand; # Player2 $kougeki2 = srand2;
srand; if($mode == 1){ $offense = \%you; $defense = \%my; }elsif($mode == 2){ $offense = \%my; $defense = \%you; } if( int(rand(2)) ){ #punch $damage = $offense->{'$PAN1'} - $defense->{'$DF2'}; if(!$rand = int(rand(5))){ #half $damage = int($damage / 999); }elsif($rand < 3){ #miss $damage = ""; } }else{ #kick $damage = $offense->{'$KIK1'} - $defense->{'$DF2'}; }
srand2; if($mode == 1){ $offense = \%you; $defense = \%my; }elsif($mode == 2){ $offense = \%my; $defense = \%you; } if( int(rand(2)) ){ #punch $damage = $offense->{'$PAN2'} - $defense->{'$DF1'}; if(!$rand = int(rand(5))){ #half $damage = int($damage / 999); }elsif($rand < 3){ #miss $damage = ""; } }else{ #kick $damage = $offense->{'$KIK2'} - $defense->{'$DF1'}; }
($damage < 0) and ($damage = 0); $defense->{'HP1'} -= $damage; ($damage < 0) and ($damage = 0); $defense->{'HP2'} -= $damage; # HTMLの出力 print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n"; print "<html>\n"; print "<head><title>対戦バトル</title></head>\n"; print "<body> <p>Player1:体力は$HP1です</p> <p>Player2:体力は$HP2です</p> <p>Player1は<big>$kougeki1</big>のダメージを与えた。</p> <p>Player1は<big>$kougeki1</big>のダメージを受けて混乱した。 <p>Player1は<big>$kougeki1</big>のダメージで野クソを食べ始めた。 <p>Player2は<big>>$kougeki2</big>のダメージを与えた。</p> <p>Player2は<big>>$kougeki2</big>のダメージを受けて、道路で裸踊りを始めた。 <p>Player2は<big>>$kougeki2</big>のダメージで電車の中のブス女をレイプし始めた。</p></p></body>\n"; print "</html>";
>>306 2行目に
open (IO,"+<$logfile");
5行目に
while (<IO>){
if ($_ =~ /<>$ip/){
@y2=split(/<>/,$_);
if ($y2[6] ne $ip){
push(@log,$_);
}else{
$y2[0] = 'All Clear (^-^)v';
$y2[5] = 'All Clear (^-^)v';
push(@log,"$y2[0]<>$y2[1]<>$y2[2]<>$y2[3]<>$y2[4]<>$y2[5]<>$y2[6]<>$y2[7]<>\n");
}
}else{
push(@log,$_);
}
}
を入れろ。
あぼーん
あぼーん
中途半端に荒しやがって。 どうせならどんと荒してアク禁になれよな。
320 :
nobodyさん :03/08/21 12:36 ID:DAq1ln5w
#============================================================================= # クッキー書き込み # &cookie_regist(クッキー名, データ, 日数); # ・クッキー名 ⇒ クッキーの名称、半角英数字 # ・データ ⇒ キー!値,キー!値,キー!値 の書式で整えられたデータ # ・日数 ⇒ 保存しておく日数(ただし、sessionと入力すると、 # セッションクッキーとなる(ブラウザを閉じたらクッキーは削除される) # ★注!:キー値に「!と=と;は使わないこと」 #例文: #&cookie_regist("session","sessionid!246",1/24); #----------------------------------------------------------------------------- sub cookie_regist(){ local($cookiename, $cookievalue, $cookiedate) = @_; ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + 60*60*24* $cookiedate ); @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); $date_gmt = sprintf("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT", $week[$wday], $mday, $mons[$mon], $year+1900, $hour, $min, $sec); if ($cookiedate ne "session"){ print "Set-Cookie: $cookiename=$cookievalue; expires=$date_gmt\n"; } else{ print "Set-Cookie: $cookiename=$cookievalue\n"; } } という関数をつくったのですが、(長いので次のレスに続きます)
321 :
320 :03/08/21 12:38 ID:DAq1ln5w
すいません、タブを全角スペースにするの忘れたので見づらいので、書き直します。 #============================================================================= # クッキー書き込み # &cookie_regist(クッキー名, データ, 日数); # ・クッキー名 ⇒ クッキーの名称、半角英数字 # ・データ ⇒ キー!値,キー!値,キー!値 の書式で整えられたデータ # ・日数 ⇒ 保存しておく日数(ただし、sessionと入力すると、 # セッションクッキーとなる(ブラウザを閉じたらクッキーは削除される) # ★注!:キー値に「!と=と;は使わないこと」 #例文: #&cookie_regist("session","sessionid!246",1/24); #----------------------------------------------------------------------------- sub cookie_regist(){ local($cookiename, $cookievalue, $cookiedate) = @_; ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + 60*60*24* $cookiedate ); @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); $date_gmt = sprintf("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT", $week[$wday], $mday, $mons[$mon], $year+1900, $hour, $min, $sec); if ($cookiedate ne "session"){ print "Set-Cookie: $cookiename=$cookievalue; expires=$date_gmt\n"; } else{ print "Set-Cookie: $cookiename=$cookievalue\n"; } } という関数をつくったのですが、(長いので次のレスに続きます)
322 :
320 :03/08/21 12:41 ID:DAq1ln5w
&cookie_regist("hoge_session","hoge_sessionid!".$in{cust_code},180); みたいにしてクッキーをセットすると、 ネスケでは、180日有効なクッキーがセットされるのですが、 IEだと、セッションクッキー(ブラウザを閉じると削除されるクッキー)に なってしまいます。 どこがおかしいのでしょうか?
323 :
320 :03/08/21 13:29 ID:???
すいません、自己レス。いつのまにか、 @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); のあとの @week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); を消してしまっていたことが原因でした。 しかし、ネスケでexpireを強引に認識してくれて、IEだと無視されるとは・・・ (逆なら納得いくんだが) ともかく解決しました。すみません。
324 :
nobodyさん :03/08/21 15:29 ID:pPohBqhp
PHPの質問で数値の表示方法についての質問なんですが、数値の計算で 例えば 10×1.05 をやると 10.5 になるのですがこれの小数点以下を切り捨てたいのですが、どうすれ ば良 いのでしょう。number_format関数を使えば小数点以下の修正が 行なえるというのは知っているのですが、number_format関数を使うと 1000などの数値の時、1,000となり","(カンマ)が表示されてしまい、数 値として認識しなくなってしまいます。 この計算の後にもさらに計算をしたいので、数値として認識させなけれ ばならないので、こまっています。 どうぞご指導をよろしくおねがいします。
>>324 ここPerlだしPHPよく知らんけど、
$formated_number と $number と別にすればいいんでないの?
なんでPHPの質問板でしないの? floatだっけか忘れた。
327 :
nobodyさん :03/08/21 15:42 ID:pPohBqhp
ごめんなさい。間違えました! ※ちなみに$numberと$formated_numberを使ってみたところfatal error になっちゃいました。 すみません。迷惑かけました。ありがとうございました。
328 :
nobodyさん :03/08/21 17:56 ID:DAq1ln5w
"私は39歳のオヤジで2人の子供がいます。" という文字列に対して、全角数字を半角数字に置換したいのですが、 どうすればいいのでしょうか? (文字列も、スクリプト自体も、文字コードはEUCです)
329 :
nobodyさん :03/08/21 19:23 ID:DAq1ln5w
@fooでなく、 @ふー みたいに、配列の変数名に、日本語を交ぜる使う方法ってないでしょうか? あるいは、似たような方法でも・・・
330 :
nobodyさん :03/08/21 19:38 ID:DAq1ln5w
$in{'場所'} には "渋谷_AND_新宿_AND_銀座_AND_日暮里" という文字列が入っているのですが、 これを、 $in{'場所'}[0] = "渋谷"; $in{'場所'}[1] = "新宿"; $in{'場所'}[2] = "銀座"; $in{'場所'}[3] = "日暮里"; と分割したいです。 で、 @tmp = split(/_AND_/, $in{'あいうえお'}); for ($i=0; $i<=$#tmp; $i++){ $in{'あいうえお'}[$i] = $tmp[$i]; } とやっているのですが、@tmp を使っているあたり、いまいちスマートでないと思います。 もっとスマートな(というかストレートな?)方法はないでしょうか?
>>328 http://www.din.or.jp/~ohzaki/perl.htm#JP_Z2H >>329 require 5.008; # 要 Perl 5.8.0 or later
use utf8;
use encoding "euc-jp", Filter => 1;
binmode STDIN, ':encoding(euc-jp)';
binmode STDOUT, ':encoding(euc-jp)';
my @foo = qw(bar baz);
my @ふー = qw(ばー ばず);
print join ' ', @foo, @ふー;
>>330 $in{'場所'} = [ split '_AND_', $in{'場所'} ];
>>331 s|'_AND_'|/_AND_/|;
あぼーん
Formで、 <input type="checkbox" name="hoge" value="東京"> <input type="checkbox" name="hoge" value="埼玉"> <input type="checkbox" name="hoge" value="千葉"> <input type="checkbox" name="hoge" value="栃木"> をsubmitしたときに、 クエリーストリングをデコードする関数の中では、 ------------------------------------------------------------- if ($in{$key}){ $in{$key} .= "_AND_" . $val; }else{ $in{$key} = $val; } としてます。 ------------------------------------------------------------- すると、$in{hoge} = "東京_AND_埼玉_AND_千葉_AND_栃木"; となるので、 @array_hoge = split(/_AND_/, $in{hoge}); みたいな使い方をしてるのですが・・・ (質問1) また、nameがhogeでなく、「ほげ」みたいな日本語のとき、 @array_ほげ となってしまい、エラーになってしまうんですよね。。。 こういう場合、なるべく近いような書き方で、どうすればいいんでしょうか? (質問2) あるいは、もっとスマートなやり方はないでしょうか? みなさんは、複数選択項目のデコードは、どうしてますか?
>@array_hoge = split(/_AND_/, $in{hoge}); >また、nameがhogeでなく、「ほげ」みたいな日本語のとき、 >@array_ほげ となってしまい、エラーになってしまうんですよね。。。 なんでよ? @array_hoge = split(/_AND_/, $in{'ほげ'}); でええやん。
>>334 if (ref $in{$key} eq 'ARRAY') {
push @{$in{$key}}, $val;
}
elsif (defined $in{$key}) {
$in{$key} = [ $in{$key}, $val ];
}
else {
$in{$key} = $val;
}
として、@{$in{'hoge'}} をそのまま使う。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
345 :
nobodyさん :03/08/22 09:53 ID:bizbHwzJ
%hash = ( element1 => [ 1, 2 ,3, 4, 5], element2 => [ 3, 4 ], element3 => [ 5, 6 ], ); print "Content-type: text/html\n\n"; for ($i=0; $i<= (@hash{"element1"} -1) ;$i++){ print $hash{"element1"}[$i] . "<br>"; } てっいうスクリプトがあるんですが、 $i<= (@hash{"element1"} -1) の部分、リファレンスに関する知識が乏しいために、 苦し紛れに書いていて、見苦しいです。 もっとスマートに($#などを使って?)書くには どうすればいいのでしょうか? というか、こういう場合、普通、 $i<= (@hash{"element1"} -1) の部分はどうやって書くもんなのでしょうか?
>>345 それ実行したら無限<br>になったんだが…
基本的にはforeachで回すのがいいんじゃない?
自分はmapを使ってこう書いてみた。
print map { "$_<br>" } @{$hash{"element1"}};
$in{'ほげ'}[0]; $in{'ほげ'}[1]; $in{'ほげ'}[2]; (中略) $in{'ほげ'}[n]; まで配列があるのですが、このn(またはn+1)の値を取得するには、 どうすればいいのでしょうか。
モジュール XML::SAX はPerl5.8からしか入らないんでしょうか? エイゴ嫌いなり・・・・・
350 :
nobodyさん :03/08/22 11:08 ID:qLHm82v9
Perl愛好家の方々に質問ですが、怒らないで聞いて下さい! PerlってCGI用言語ですよね? ということは、PHPの方が良い言語なわけですよね? それでもPerlを使用している人が多いというのは、何か特別な理由が あるのでしょうか? 何か良い理由があるのなら私もPerlを勉強しようと思っているのですが、、、 教えて下さい。お願いします。
>>345 for ($i=0; $i<= (@hash{"element1"} -1) ;$i++){
print $hash{"element1"}[$i] . "<br>";
}
これの意味(目的)が全く分からないんだけど。。。(↑なんかめちゃくちゃだぞ、これ。)
目的は{element1}が指し示す配列を個々にデリファレンスして表示する事だろ?(知らんけど多分)
foreach($hash->{"element1"}){
print $_ . '<BR>';
}
こうじゃないのか?
実行してないから知らんけど。
条件式は
@{$hash{"element1"}}
こーでもいーよ。多分。
>350 別に無理して勉強しなくていいんじゃないの。
353 :
345 :03/08/22 11:09 ID:???
>>346 >それ実行したら無限<br>になったんだが…
あ、ほんとだ、気づきませんでした。すみません。。。<br>じゃなく<hr>にしときゃよかった。
>print map { "$_<br>" } @{$hash{"element1"}};
でうまくいきました。ありがとうございます。
で、実は自分、@{$hash{"element1"} っていう配列の書き方を知らなかったもので、
>>345 を、
for ($i=0; $i<= ( @{hash{"element1"}} -1 ) ;$i++){
print @{$hash{"element1"}}[$i] . "<hr>";
}
に書き直したんですが、やはり、無限ループになってしまいました。
これって、どういう理由というか理屈で無限ループになってしまうのでしょうか_
>>350 は釣りか無知か。
Perl = Practical Extraction and Report Language
どこにもCGIなんて入ってない。
>PerlってCGI用言語ですよね? 全然違います。 まー、どーせあんたはCGIとしてしか使わんと思うし、 さらに他人の鯖使ってると思うので、ドコでも使えると思われるperlがいーと思われます。 環境とか調べてPHPがいーと思うならそーしてください。
>>347 よく意味が分からん。
どっからどんな感じで取得したいんだよ。
>>350 Perl = Practical Extraction and Report Language
PHP = Hypertext Preprocessor
PHPはWeb専用。Perlは汎用。(多少語弊有)
どっちが良い言語かは自分と相談して、良いと思った方を使え。
358 :
nobodyさん :03/08/22 11:19 ID:qLHm82v9
だけど大抵のマニュアル見てもCGI=Perlってなってますよ!
どうしてですかね?
>>354 はただ馬鹿にしたいだけでしょう?
>>358 CGIとして使われてんのがほとんどperlって話しだろ。
所でスレ違いだから他当たれ。
あとヤツ当りはせんでいーぞ。
360 :
nobodyさん :03/08/22 11:23 ID:qLHm82v9
>>357 なるほど!!Perlは汎用なんですか。
じゃあやっぱりCGI=Perlっておかしくないですか?
もしかしてマニュアルは嘘つき?
>358 どうして言われても・・・・・ そのマニュアル(何のマニュアルか知らんが)の筆者じゃないからねぇ。 わからんねぇ。
>>360 > じゃあやっぱりCGI=Perlっておかしくないですか?
ちょっとおかしい。正しくは「CGI ⇒ Perl」。
CGIと言えばほとんどPerlだけど、
Perlと言えばフィルタとしてログの解析や集計やらに使うことが多い。
ビルドするのにPerlが必要なソフトウェアもあるしな。
364 :
347 :03/08/22 11:34 ID:???
>>348 すいません、全部読んだのですが、個々の文章としてはなんとなく理解できるのですが、
全体として理解できていないため、
結局、
>>347 の答えがわかりませんでした。
答あるいはヒントでもいいので、おしえてください・・・
365 :
347 :03/08/22 11:36 ID:???
>>356 とあるメールフォームが、
<input type="checkbox" name="ほげ" value="田中">
<input type="checkbox" name="ほげ" value="高橋">
<input type="checkbox" name="ほげ" value="近藤">
のようになっていて、それをデコードする際、
「aaa=bbb」形式を「$key と $val」にした後、
#############################################################
if ($in{$key}){$in{$key} .= "_AND_" . $val;
}else{
$in{$key} = $val;
}
#この時点では、 $in{'ほげ'} = "田中_AND_高橋_AND_近藤" の状態
としてから、
foreach $key (keys %in) {
if ($in{$key} =~ m/_AND_/){
@tmp = split(/_AND_/, $in{$key});
for ($i=0; $i<=$#tmp; $i++){
$in{$key}[$i] = $tmp[$i];
}
}
}
#この時点では、$in{ほげ}[0] = "田中";$in{ほげ}[1] = "高橋";$in{ほげ}[2] = "近藤"; の状態
#############################################################
としています。
で、メールフォームの確認画面で
「田中/高橋/近藤」のように表示させたいため、
for文を書くために、
>>347 の質問をさせていただきました。わかりずらくて、すみません。
なんかややごーいんな処理だなぁ。
まぁ、それは良いとして。
よーするに
$in{'ほげ'}
の値を全部出力したいのか?
それならたぶん
>>351 周辺と同じだ。
知らなかったらあれだから言っとくけど、
それ、リファレンスだぞ。
いちおー省略のないちゃんとした書式使って、あと無駄な処理はぜんぶ省くよーに。
>>347 代入したときの$iを
$number = $i;
とかして記録しとけば
>>349 英語が嫌い? じゃあ (require|use) 5.00x; されてないか
ソース辿って調べたら? Perl (これも*言語*だよね) なら
いいんでしょ? :p
>>353 まぁ一文字抜けてるだけの話なのだが。
1. @{hash{"element1"}} は @hash{"element1"} と等価
2. @hash{"element1"} は 1 要素のハッシュのスライス ≒ $hash{"element1"}
3. $hash{"element1"} はリストリファレンスで、そのまま評価すると
リファレンスの型とアドレスを返す => 'ARRAY(0x10c1350)' 等の文字列
4. この文字列を - 1 と数値コンテキストで評価しているので、
@{hash{"element1"}} - 1 == 0x10c1350 - 1 == 17568591
5. 無限ではなく 17,568,591 回ループする
という事で
>>348 読んで基本から勉強し直せ。
>>365 > if ($in{$key}){$in{$key} .= "_AND_" . $val;
> }else{
> $in{$key} = $val;
> }
を
>>336 にして
> foreach $key (keys %in) {
> if ($in{$key} =~ m/_AND_/){
> @tmp = split(/_AND_/, $in{$key});
> for ($i=0; $i<=$#tmp; $i++){
> $in{$key}[$i] = $tmp[$i];
> }
> }
> }
を省いて
> メールフォームの確認画面で
> 「田中/高橋/近藤」のように表示させたいため、
print join '/', @{$in{'ほげ'}};
配列の要素数なぞ全く必要無いのだが。
370 :
nobodyさん :03/08/22 12:42 ID:6rNcNFDD
>>360 perlはCGI用の言語ではなくて、
こんぴーたのログや各種統計情報を効率的に解析する
ために作られたもの。
当然ログなどはテキスト情報になるので、強力なテキスト
処理能力が組み込まれた。
そのテキスト処理能力がHTMLを書き出すCGIにうってつけだった、
というのと、
ほぼすべてのUNIXに標準で入っている(Perlを使わないとシステムで
処理できないものが多い)ため、
CGIに多用されるようになった。
そして今やしろーとたちの間ではCGI用としてだけperlがやたら有名に
なってしまい、そのインチキ解説本の著者のように勘違いを
する輩が増えた、ということだ。
PHPはもう完全にCGIに特化した言語。
Perlはシステム管理上も必要になる局面が多いため、
管理者としてはPHPではなくPerlを身につける必要がある。
(サーバ管理者として飯食ってるやつでPerlがわからないやつはいない)
perlでシステム管理は語弊があるかな。
基本はシェルスクリプト。
暑いので
>>370 にやつあたりしてみますた(・∀・)!!
372 :
nobodyさん :03/08/22 13:42 ID:6rNcNFDD
>>371 突っ込みthx。
ただ俺が言ったことは必ずしも的外れではないと思うぞ♪
>>370 釣り用のテンプレに最適だなこれ。
> ほぼすべてのUNIXに標準で入っている
ほぼ全てって・・・(w。ここまで豪快に無知だとかえって清清しいな。
ちょっとお前、UNIX板に言って同じ事言って来い。
> (Perlを使わないとシステムで処理できないものが多い)
例えば何だ?無くてもシステムは動かせるぞ。
> Perlはシステム管理上も必要になる局面が多いため、
まぁあれば便利程度だな。無くても平気じゃないとシステム管理者
は勤まらん。
Perlに頼ると、/standしかマウントできなくなった時にパニックに
なるだろうし、そんなシステム管理者はいらん。
あと全体を通して、CGIとCGIスクリプトを混同してますね。
>>372 いや、結構的外れだと思う。
374 :
nobodyさん :03/08/22 14:42 ID:yhl2dNIV
375 :
nobodyさん :03/08/22 14:48 ID:yhl2dNIV
$aaa =~ s/<\/a>//g; これで閉じタグは除去できました。
376 :
nobodyさん :03/08/22 14:49 ID:yhl2dNIV
ちなみに、リンクは <a href="../aiueo/aiuoe.html"> こういうのもあります。
ちょっと関係ないけど
>>370 は/sbinを su bin だと思ってるに一票
あぼーん
ちょっと関係ないけど
>>377 はsuをSuperUserの略だと思ってるに一票
ちょっと関係ないけど
>>380 はsuをSwitchUserの略だと思ってるに一票
ちょっと関係ないけど
>>381 はsuをSukhoiの略だと思ってるに一票
>>373 は重要なところを突っ込み忘れてるな。
> PHPはもう完全にCGIに特化した言語。
ほよーん?
アクセス解析をSSIのIncludeで全てのページに埋め込んでいるのですが、 最近になって各文書毎にわけて取りたくなってきました。 #今までは取りあえずリファ取るだけで良いと思っていたので全文書で共通にしてた と言うわけで埋め込み元の文書のファイルパスがわかれば良いと思ったのですが、 方法が見付かりません。 どのようにすれば良いのでしょうか。 #include virtual="/hoge/log.cgi?file=foo/bar.html" のようにパスに適当なクエリつければ出来ると思ったのですが 全ての文書を書き直すのが面倒で…。
>>384 それのどこがperlコーディングの質問なんだ?
Perlでスクリプト書いてるからこのスレが良いと思ったのです…
それのどこがperl "コーディング" の質問なんだ?
うーん、スクリプト側で何とかできるのかと思ったのです。 できないようなら諦めてクエリくっつける方法でやってみます…。
基本的なことを理解しないまま、なにかと手をつけてしまう人が最近多いみたいだね…。
夏休みとか長期休暇になると、上辺だけ学ぼうとする奴が出るからな。 上辺だけでも作れてしまうのがPerlのいいところでもあるが。
>>384 $ENV{'REQUEST_URI'}
$ENV{'DOCUMENT_URI'}
$ENV{'DOCUMENT_NAME'}
辺りで取れない?
環境変数を吐くスクリプトをリンクしてみて、よさげな環境変数をあさってみたら。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
削除依頼しとくわ
>>374 $aaa =~ s/(<a .*?>|<\/a>)//g;
403 :
nobodyさん :03/08/23 21:14 ID:eQY6UqcN
また再取得させる気か
>>403 削除そのものに文句があるなら削除議論逝ってこい。
>>403 再取得がイヤなら自動再取得するようにプログラム汁。
すみませんです。 比較的頻繁にファイルへ追加書込みしたいのですが、、、 一番よい方法ってありますか? open( LOG, ">>$file"); flock( LOG, 2 ); print LOG $data; flock( LOG, 8 ); close( LOG ); これじゃ、ダメですかね?
>>407 >flock( LOG, 8 );
これはいらない
すまん。407じゃないんだが、flock( LOG, 8 ); はいらんの? 今まで慣用句的に使ってきたものとしては気になるんだが。
ロック解除はcloseにさせよう。
>>410 407じゃないんだけど、closeで解除させるのと、flockで解除させるのって変わりあるんですか?
どっちでもいいとかじゃなくて。
>>411 5.004以降はロック・アンロックの前に自動的にフラッシュするので、どっちでもいい。
どっちでもいいものを保守するのって結構面倒。
所々忘れてたりするし。
# ひょっとしたら5.004より前のバージョンで実行するかもしれないしね。
文字列置換なんだが、 my $a = 'abcdefg'; $a =~ s/abc/ABC/; こうすれば $a は ABCedfg となるが、こうじゃなくて、 元の文字列は変更しないでそのままにして、 置換結果だけを新しい変数に入れる場合はどうしたらよい?たとえば my $a = 'abcdefg'; my $b = $a =~ s/abc/ABC/; としても、$b には 1 としか入らないので困った。もっとも my $b = $a; $b =~ s/abc/ABC/; とすればいいだけの話だが、これを1行で書きたい。
my $b = $a; $b =~ s/abc/ABC/;
(my $b = $a) =~ s/.../.../; まぁ、諦めるしかないってこった。
なぜ1行 にこだわる
423 :
421 :03/08/25 12:52 ID:???
if処理で ある 配列 @a = (1000個くらい) を 最初から読み込んでいって 配列@bにその値が含まれている場合 ある処理をしたいと思ったんですが @a = (2,5,6,8,9,4,2,6,5,4,6,3,5,2,4,5); @b = (1,2,3,4,5,6,7,8,9,10,11,12,13,14); foreach $a (@a){ foreach $b (@b){ if($a == $b){ ここに処理; last;} } } というのを考えたんですけど 二つ配列が共に1000個近くあると Maxで1000*1000近くループしそうなのですが もっとスマートな方法ってないでしょうか? または 変数がある配列に含まれているか 真偽を返す関数などはありませんでしょうか?
use strict; ってチェックの時だけやって 普段は外すっていうのは駄目ですか? 単に宣言なしの変数チェックと言う認識しか無いのですが 常にuseしておいた方が良いのならそうしようかと…。
>>425 Larry Wallは常にuseしろと仰ってますね。
俺も常にuseしてる。というか、付けると便利なものをなんでわざわざ外そうと
思うのか分からない。
>>424 メモリは食うが
my %b;
@b{@b} = (1) x @b;
for my $a (@a) {
$b{$a} or next;
...
}
>>425 use strict; したままだと困る事があるなら外せばいい。
俺は部分的に no strict ...; する方を選ぶが。
428 :
349 :03/08/25 15:07 ID:???
どうも。5.6.1にXML::ParseおよびXML::SAX入れることができますた。 邪魔してたのはcc on SunOSですた。
430 :
424 :03/08/25 15:27 ID:???
>>427 漏れが書いたのと
どっちのほうが効率的でしょうか?
ケケケ
Larryの言う「常に」とはどんなスクリプトを書くときでもという意味では。
>426 >427 useすると微妙に重くなるのかな?という気がしたので…。 比較的リクエストの多いサイトのスクリプトなので ほんの少しでも負荷を減らせるのかなと。
>>429 >>432 そりゃそうかも。
でも俺が仕事で書くような場合、使い捨てか、頻繁にメンテするような場合が
多いので付けっぱなしだな。外してもいいけど、外す理由が特に見当たらないって
ことです。
>>433 実験してみたけど、目に見える負荷軽減にはならないみたい。
>>430 そんなあなたにはBenchmarkモジュールがオススメ!
use Benchmark qw(:all);
@a = (2,5,6,8,9,4,2,6,5,4,6,3,5,2,4,5);
@b = (1,2,3,4,5,6,7,8,9,10,11,12,13,14);
cmpthese(10000, {
'424' => sub {
my $n = 0;
foreach $a (@a){
foreach $b (@b){
if($a == $b){ $n++; last;}
}
}
},
'427' => sub {
my $n = 0;
my %b;
@b{@b} = (1)x@b;
for my $a (@a) {
$b{$a} or next;
$n++;
}
} ,
});
結果は動かしてみてのお楽しみということで。
436 :
435 :03/08/25 16:02 ID:???
スマン、全角SPに変換前のを出しちまった。
>>435 補足。同じベンチ取るなら実状に合った値でやらないと
意味のある数字が出ないよ。
この例だと @a の値は全て @b に存在するから条件文は
常に真になるし、@b の要素数が実際より極端に少ないと、
速度差が他の処理にかかる時間に埋もれてしまう可能性
がある。
あと if (EXPR) BLOCK より or の方が速いので、後者の
方が本当に測りたい処理内容と関係ない部分で有利になる。
比較したい部分以外のコードは極力統一させよう。
「条件文は常に真」ってのは嘘だね。ゴメン。 @a の要素一つを @b の全要素と比較した時、遅かれ早かれ 真になるって意味で。
>>435 はもとの質問者の例に沿っての内容だから
質問者は自分とこの実情に合わせてベンチ取るんじゃないの?
結局、数が多いならソートしてバイナリサーチのが速かったりするな
440 :
nobodyさん :03/08/25 17:57 ID:xdYfVnfd
あの、、 POST形式のデータは、どこにあるのですか?
>434 ふーむ、そこまで軽くはならない訳ですね。 なら指定しておいても良いかな…。
>>440 $ENV{'CONTENT_LENGTH'}
>>444 その長さぶん標準入力から読み込むんだってば。
>>440 use POSIX;
POSIX::getenv("CONTENT_LENGTH");
447 :
nobodyさん :03/08/25 20:28 ID:ph7+YYot
read(STDIN, $post, $ENV{'CONTENT_LENGTH'});
>>448 これって、とんでもなく巨大なデータを渡されても大丈夫なんだろうか?
>>449 大丈夫じゃないだろうから、事前にCONTENT_LENGTHwpチェックしないといけないんじゃねぇ?
ウチは
>>448 のやり方しか知らんかった…
サイズチェックとかある程度のサニタイズとかはやってるけど。
もっとスマートな方法は無いっすかね。
CGI.pmを使えば、スクリプトはスマートになるよ。
多少短く、見やすくなるとしても スマートにはならんと思う。
$CGI::POST_MAX
455 :
nobodyさん :03/08/25 23:40 ID:FunMWm7F
ネットサーフィンをしていたら、parlという言語があるのを知ったのですが、 これはperlと関係のある言語なのでしょうか?
>>427 existsを使えば、
@b{@b} = ();
で行けるよ。
>>455 まずあなたがparlという言語を知ったきっかけのページを教えてください。
458 :
nobodyさん :03/08/26 00:14 ID:ccW2nPTT
>『Parl』を動作させる為に『Active Perl』をインストール どう読んだらスキル高そうだと思えるのだ?
jcode.plをうまく使って、ひらがなを半角カナに変換する方法は ないものでしょうか。
>>451 POSTで無限に長いデータを送ってやると、Content-Type: で指定した値に関わらず全部そのまま
CGIに垂れ流すWebサーバーが存在するから、CONTENT_LENGTHをチェックしても、
$a = <STDIN>;
とかやってると、Webサーバーによってはメモリ食いつぶすまで読み込ませることが可能。
だから、動作させるWebサーバーが不定の場合は
>>448 のやりかたは必須。
>>460 trを使ってひらがなをカタカナに変えて、z2hで半角にすればいいだろ。
あとは自分で考えてくれ。
英数字判別の正規表現のように、文字列がひらがな・カタカナで あるという判別を行うことは可能でしょうか?
>>463 全角カタカナも半角になる罠。
それでいいのなら問題ないのだけど。
便乗質問 歌代さんがromkan.plというのを作ってらっしゃいますが、 これの逆のものってないですかね。 かなを英字ローマ字に変換するようなもの。 かなり無理があるとは思いますが
同じことだろ
>>467 s/あ/a/g;
s/い/i/g;
.
.
.
って書いてけば?
>>470 まあ促音や拗音の処理とかあるから変換する順番が重要になる上に
膨大な数にはなるけどできんことはないなあw
>>471 かなだけだったら、どうにかなるんじゃないですかねぇ?
仮名だけでつかいものになるんだろうか。
>>470 テーブル作ればなんてことないでしょ。
テーブル本体もPerlにさっと作らせてヘボン式とか例外的な綴りを
手で追加してやるだけでよさそうだし。
476 :
nobodyさん :03/08/26 11:49 ID:9/vV6DaN
www.foo.ne.jp/hoge/hage.cgi
で、
require 'mimew.pl'; #(
http://www.cc.rim.or.jp/~ikuta/mime_pls/ にある有名なやつ)
して、
#メールのサブジェクトを、MIME-Base64化
$Subject = &mimeencode($MySubject);
としようとすると、
[Tue Aug 26 11:34:47 2003] [error] Undefined subroutine &Apache::ROOTwww_2efoo_2ene_2ejp::hoge::hage2ecgi::mimeencode called at /usr/local/foo/htdocs/hoge/hage.cgi line 179.
と言われてしまいます。
mimeencode.plは、cgiを同じディレクトリに入ってます。
なぜこのようなエラーがでてしまうのでしょうか?
「Undefined subroutine &mail::mimeencode ...」みたいなエラーなら見たことあるのですが・・・
このエラーメッセージの意味がわかりません。。。
mod_perlなんでしょ、それ以外は普段と同じ
flockなんですが、 1. ファイルを読み込んで配列に入れる 2. 閉じる 3. 処理する 4. 先程と同じファイルをもう一度読み込んで処理後の配列で上書きする と言う場合何処で掛ければ良いんでしょうか。 今は4のところだけでロックしてますが 2〜3の間にファイルが更新されちゃうと駄目ですよねこれって。
とか書いて思ったけどPerlコーディング自体とはあまり関係無いっすね…スイマセン。
482 :
nobodyさん :03/08/27 19:13 ID:hDW5O06D
プロンプト[ Windowsです(^^;) ]からの入力に応じて実行する内容を分岐させたいのですが。 たとえば「1」と入力してリターンすると &one を、 「2」と入力してリターンすると &two を、 というようなあんばいです。
>させたいのですが。 で、お前は何をやったのかと、問い詰める。
487 :
482 :03/08/27 20:44 ID:hDW5O06D
プロンプトから入力されたデータがどこに入ってるのかわかりません。 入力を待つ→受け取って実行するっていうルーチンをどう書けばいいのか さっぱりわかりませんのでまだ何も試せません。
あぼーん
>487 本を一冊買って読め。
490 :
482 :03/08/27 20:50 ID:hDW5O06D
<>
>>490 本を買うのが嫌なら図書館でも逝って借りてくることをお勧めする。
Web上の解説等だけで勉強するのははっきり言って無理。
詳しく解説していったらそれこそ本が出来る罠
解決しますた。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
503 :
nobodyさん :03/08/28 08:53 ID:JP6BwLoY
新しいマシンにRedHat9入れたら、Perl5.8.0が入ってきました。 ところが、5.8からNDBM_Fileがないので、前に作っていたデータベースが 使えない。5.6.1のを持ってきたけど(NDBM_File.pm, NDBM_File.bs, NDBM_File.so)、エラー出る。requireしてるXLoaderとかの変更があるみたい。 元のマシンでNDBMからSDBMに変換して新マシンにコピーして使うか、 新マシンに5.6.1入れるか、どっちがいいと思う? いろいろググったが、情報ないんで聞かせてくらはい。
いらっしゃーい、Perlの[[[コーディング]]]で困ってる人のスレです。
運用はスレ違い
>>504 , 505
Part26までは、「コーディング」なんて制限はスレタイにもなかった。
これを付けた香具師もwebプログラミングと区別したかったからに
過ぎない。とにかく、もういい。お前らには、聞かない。
そりゃよかった。二度と来るなよ。
>>503 5.8.0のディストリビューションには入っているようだが…何故入ってないんだ?
Perlのソースを落としてきて、NDBM_Fileだけをビルド・インストールできるんじゃないかな。
データの変換の方が面倒がなくていいかもしれないが。
>5.8からNDBM_Fileがない こう決め付けてるから対処がおかしくなるんだな ソースから入れたPerl5.8.0にはNDBM_Fileあったけど たしかにRedHatに最初から入ってるやつには無いね。なんでかしらんけど
510 :
506 :03/08/28 10:58 ID:TK42EOIB
良識ある
>>508 ,
>>509 さん、ありがd。
そですね、Perl5.8.0のソースからNDBM_Fileだけ抜き出して
buildできるかやってみまつ。
低能無恥の
>>507 さん、お前こそ消えて出てくんな
>>510 わからんなあ。
507が「低脳無恥」(これ、無知の間違いじゃない?)だと言う証拠はどこにもないんだが。
507がどれくらいの能力を持っているのか、本当に知っているのか?
これこそ勝手に自分の脳内妄想を垂れ流してるだけじゃないか?
ついでに言えば、508、509を「良識がある」としているが、これまた脳内妄想でしかない。
Part26までがどうだったかは知らないが、現在ではコーディングに限定した話題のスレになっているんだ。
ガイドラインに沿わない質問をした
>>506 が変であり、かつそれに対して回答を示した508、509もおかしい。
これは、スレの主題をぼやけさせる一因であり、本当に良識があるなら、厳に慎むべき行為だろう。
スレの状況を読まず、自分に都合の悪い回答をした507をこきおろし、
自分に都合のいい回答をした508、509をあがめたてる、ただの自己中に見えるんだが、
そこんところ自分を客観的に見てどう思うかね、
>>510 よ。
513 :
506 :03/08/28 12:16 ID:TK42EOIB
一言余計なんだよ。それがなきゃ静かに終わったかもしれんのに 正規のスレに同じ事かかれたらうざいんでとりあえずここで 話し進めただけだし
なんでそんなにこだわるかなあ そこまでこだわるなら夢イタに行くべきだよ。
>>515 CGIの質問をして追い出された人が怒るかもしれないから。
>>516 CGI/perlな人がけっこういるわけで、WebProgにあればCGI/perlな人が
寄ってくるのはいたしかたないし、追い出す方がおかしい、と思うけど。
ムイタならここよりCGI/perlな人は少ないわけで、
ここの住人も幸せにコーディング語れるんじゃないの?
ちょいと質問です。 perlのCGIプログラムをインストールしようとしているのですが、それがCGI.pmを利用しています。 そのバージョンが指定されていて、/usr/lib/perl5/5.00503/ にあるもののバージョンが 古いです。 ローカルにバージョンの新しいCGI.pmをインストールして、そっちを利用させるようにしたい のですが、どこをいじればいいのでしょうか? require './CGI.pm'; をしてみましたが、結局別のプログラムなどが読んでいるところでエラーになります。 use ./CGI; なども当然ダメです。 よろしくお願いします。
>>518 そのCGIプログラムと同じデレクトリにCGI.pmを置いても?
>>519 ダメですねぇ。
できるはずなんですか?requireでなくてできるはずなら、色々調べてみます。
>>520 /home/hoge/perl-lib とかにCGI.pm置いて
use lib '/home/hoge/perl-lib';
use CGI
するとかして使ってるけど。;
ローカルに、じゃなくてユーザーデレクトリに、だよね。 ローカルに置いたモジュールをサーバから使わせようとしてるわけじゃないよね。
>>522 そうです。ユーザディレクトリにです。
>>521 まだ試していませんが、これで解決できそうです。
ありがとうございました。
Perlでファイルハンドルを変数に入れて、メソッドに渡すことがしたいのですが、 どうやればいいのでしょうか? open($FILE,"ABC.def"); test($FILE); close($FILE); sub test { my $FILE = @_; my $line = <$FILE>; #一行読み込む printf("%s\n",$line); #何も表示されない(undef) } こんな感じでやりたいのですが...
open(FILE,"ABC.def"); $file = FILE; じゃあかんの?
むしろ、IO::File推奨。
FileHandle.pmを使ってみたのですが、 何故か $in = new FileHandle("ぼくのにっきちょう.nick","r"); $line = <$in>; printf("%s\n",$line); は出来ても、この$inを bob($in); sub bob { my $in = @_; my $line = <$in>; printf("%s\n",$line); } とやったら駄目みたいです ($inの中の値はどちらも同じだった(アドレスも))
っとおもったらなんかできちゃいましたみなさんどうもありがとうございました!
ファイルハンドルを変数に入れる場合は型グロブを使う open(FILE,"ABC.def"); $file = *FILE; test($file); close(FILE); sub test { my $file = @_[0]; my $line = <$file>; print $line; }
534 :
nobodyさん :03/08/28 19:51 ID:wikcpHV0
掲示板なんかで正規表現で自動リンクをしちゃってるわけですが、 リフェラでやってくる人がいるので、対策が必要です リンク専用のCGIと受け渡しファイルを置いて、壁を作ろうと 思うのですが 掲示板のCGI → リンクをファイルに記録 → 専用CGIで読み出し飛ぶ これで大丈夫ですか もっといい手がありますか?
リフェラ リフェラ リフェラ リフェラ リフェラ リフェラ リフェラ リフェラ リフェラ
おふぇら おふぇら おふぇら おふぇら
ime.nu挟めば簡単。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
ime.nuは広告がアレな感じ。
(>543じゃ無いけど) >547 ソレダ━━━━━(゚∀゚)━━━━━ッ
534だった。
553 :
nobodyさん :03/08/29 19:54 ID:na9A2pd2
>>552 全部試したけど、それだけはok
全然個人的な場所でも飛べる、凄い凄い
554 :
nobodyさん :03/08/29 23:29 ID:fl8oeL92
ほんとだ。これはLOCATIONヘッダで飛ばしてるな
どうもレス数があわないとこがたまにあると思ったら 最新があぼーんされたとこだったのか
あぼーん
558 :
nobodyさん :03/08/31 17:26 ID:tuFrpWkq
perlでGoogleの検索結果を取得するプログラムとして、
open(SEARCH, "search");
(ファイルsearchには文字コードEUCでクエリーが書かれています)
$query = <SEARCH>;
chomp($query);
$url ="
http://www.google.co.jp/search?q= ".$query."&hl=ja&lr=&ie=EUC-JP&oe=UTF-8&start=10&sa=N";
として、
$rootpage=get($url)としたのですが、
うまくとって来てくれず$rootpageがundefになっています。
どう対処したらよいのでしょうか?
561 :
558 :03/08/31 17:47 ID:tuFrpWkq
LWP::Simpleモジュールにある URL引数で指定されたドキュメントを返す関数です。 通常のページだとgetのカッコ内にurlを入れるだけで そのページをとってこれるのですが、Googleではうまくいかないんです。 yahooの検索結果を取ってくるプログラムはできたのですが。。。
561まであるらしいんだがNGのお陰で556でスレ止まってるのが笑える。 何が書き込まれてるんだ全く…。
超気のせいだったゴメ
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
>>558 UAではねられてるね。
別のモジュールを試すか、こそっとLWP::SimpleのUAを書き換えるか。
571 :
nobodyさん :03/08/31 18:38 ID:OYZkvYjT
>>558 UAだねぇ。
でもスクリプト対策しているところからあえて取ってくるより、
別の検索エンジンを探すとかしたほうがいいかもよ?
(自分は、あえてするときはLWP::SimpleのUA書き換えてるけど)
ちなみに、$uaをエクスポートしてもらえば串を刺すなど
好き勝手できるのでお勧め。(普通にやるとアク禁されるからね)
572 :
558 :03/08/31 18:39 ID:tuFrpWkq
>>570 ご意見ありがとうございます。
さらに質問で申し訳ないのですが、
別のモジュールにはどのようなものがあるのでしょうか?
あと、UAとはUserAgentのことでしょうか?
573 :
558 :03/08/31 18:51 ID:tuFrpWkq
>>571 ご意見ありがとうございます。
こちらもさらに質問になってしまうのですが、
LWP::SimpleのUAの書き換えというのは、初心者にもできるでしょうか?
なにぶんPerlについての知識が乏しいもので。
もし難しいようでしたら、Googleでの取得はあきらめたほうがよさそうですし。
ヒントもらったら、それを元に自分で調べたらどうか?
575 :
570 :03/08/31 19:12 ID:???
576 :
558 :03/08/31 19:19 ID:tuFrpWkq
>>575 丁寧に教えていただき、本当にありがとうございました。
アドバイスに従いやってみます。
578 :
558 :03/08/31 20:40 ID:tuFrpWkq
>>577 御意見ありがとうございます。
さきほど、LWP::UserAgentを用いてやってみたのですが、
こちらでも同様な結果となってしまいました。
うーん、難しいですね。
>>578 意味わかってないだろ
使い方の説明くらい読んだら?
580 :
558 :03/08/31 20:45 ID:tuFrpWkq
>>579 すいませんでした。
こちらの使い方が間違っているようですね。
これからもう少し詳しく読んでみます。
581 :
558 :03/08/31 22:12 ID:tuFrpWkq
LWP::UserAgentの使い方がようやくわかりました。 これで何とかなりそうです。 皆様ありがとうございました。
582 :
nobodyさん :03/08/31 22:20 ID:ynlYypMb
素朴な質問なのですけど、どなたか教えて下さい。 あさっての会社の面接で知識のあるASP(VBScript)を主張しようと思っているのですけど、 ASP(VBScript)をはじめCGIやJavaなどの言語でさくせいするページ作成を、 「WEB系アプリケーション」っていう言い方で合っていますでしょうか?
584 :
582 :03/08/31 22:28 ID:ynlYypMb
>>583 あれ・・・、「WebProg 初心者の質問 Part5」って板に書いたつもりが、
違う板にかかれてしまったようです。
単なる凡ミスです。申し訳ありませんでした。
585 :
nobodyさん :03/08/31 22:51 ID:3rubdTEF
ちょっと不可解で調べても分からんので誰かおしえて。 perlで同じdirectoryに3つのfileがあって 1.const.pm package宣言なし $AA = "okだよ"; 2.sub.pm package sub; require const; sub bb{print "sub $AA\n";} 3.main.cgi package宣言なし require const; &sub::bb; print "main $AA\n"; とすると sub okだよ main と表示されます。$main::AAでもだめ。 $main::AAと$sub::AAと別々に登録され両方 表示されると思っていたのですが・・ ただし、mainとsubのどちらかのrequire constを require './const.pm'とすると sub OKだよ main OKだよ と両方表示されます。 なんでだろう?長文ごめん。
586 :
585 :03/08/31 22:54 ID:3rubdTEF
ちょっと訂正 main.cgi package宣言なし require sub;<-ココ抜けてた require const; の間違い
>>585 Perlは、%INCに入ってると、読みません。
588 :
585 :03/08/31 23:18 ID:3rubdTEF
%INCに入っていないとってことですか? sub.pmとmain.cgiで同じ指定require constとすると はじめに読み込んだ方しか読み込めないってのが どうも納得がいかんのです。それぞれ別のpackage変数として シンボルテーブルに入ると思ってるんで。
>>585 # Active Perl 5.6.1で異常終了するんですけど。。require sub;
ここはひとつ、doでドゥでしょ。(くるしー
>>585 君は変数のスコープを誤解している。
別の言語とごっちゃになってないか?
#--- Const.pm ---
# package 宣言していないのでここは main パッケージ
$AA = 'OK.'; # $main::AA
#--- Sub.pm ---
package Sub;
# どの名前空間で読み込んでも Const.pm に書かれた
# コードの名前空間が変わるわけではない
require Const;
# パッケージ指定されていない => $AA eq $Sub::AA
sub bb { print "sub $AA\n" }
1;
#--- main.cgi ---
# package 宣言していないのでここは main パッケージ
require Const;
require Sub;
Sub::bb(); # "sub \n"
print "main $AA\n"; # "main OK.\n"
591 :
585 :03/09/01 00:02 ID:wUdXVEqP
>>589 以上終了ってsub.pmが@INCにないってこと?
5.6はカレントみてくれんのかな?
これ試したのはactive perl v5.8.0でした。
do調べてみます。
今まで一枚のfileに全て突っ込んでたけどstepupしようと
思ってfileわけるとこれだもんなあ。。
foreach (@INC) { print"$_\n"; } してみれば
593 :
585 :03/09/01 00:15 ID:wUdXVEqP
>>590 ># どの名前空間で読み込んでも Const.pm に書かれた
># コードの名前空間が変わるわけではない
ってことはどこでrequireしようとも$main::$AAとして存在するって
ことでしょうか?
main.cgi内でrequire subのほうをrequire constの前に書くと
&sub::bbの方はokが表示されてmain.cgiないのprint $AAのほうは
表示されないんですが・・
594 :
585 :03/09/01 00:29 ID:???
>>592 @INCを調べてみるとカレントは入っていませんでした。
ただ、requireの戻り値をみるとどのrequireも成功は
しているようです。
ということで@INCの問題ではないよな気がするんですが、
どうでしょうか?
うちは入ってたけどね 消して試してみるか・・・
596 :
589 :03/09/01 00:34 ID:???
え、私?(なぜに… perldoc -f require すると吉。 で、doは do 'const.pm'; の書式の方ね。ループさせないでね。
597 :
585 :03/09/01 00:38 ID:???
で、やりたいことは const.pmで定数を用意して 各パッケージからconst.pm読みこんでその定数を使いたい。 この際問題なのが 定数を読み込むcgiから別のパッケージをrequireした時、 別のパッケージ内でも定数を読み込んでいると、 定数のrequireと別のパッケージのrequireの書く順番によって どちらかのばっケージでしか定数が有効になっていないのです・・。 とりあえず、もう一回らくだ読みます。
598 :
585 :03/09/01 00:52 ID:???
requireをdoに変えると、main.cgiでのprintと main.cgiからrequireされたsub.pmでのprintともに const.pm内の変数をprintすることが出来ました。 requireとdoの違いを勉強してみます。 みなさん、ありがとうございました。
>>593 すまん、俺も勘違いしてた。もう解決したみたいだが一応。
require はファイルに書かれたコードを*実行*するので、Sub.pm
(package Sub) 内で require Const; した場合、require 文のところが
$AA = 'OK.' に置き換わるような振る舞いになり、$Sub::AA = 'OK.'; と
等価。main.cgi (package main) 内で require Const; した場合は
同様に $main::AA = 'OK.'; と等価。
で、require は %INC を見て一度読み込まれたファイルはスルー
するので、先に呼び出した方の名前空間に $AA が 定義され、
もう一方には定義されない。
do なら毎回読み込むので、両方に $AA が定義される。但しこれは
$Sub::AA と $main::AA で、それぞれ別の変数。Sub.pm 内で $AA を
変更しても $main::AA に反映されるわけではないので注意な。
>>597 のようなニーズなら、単に Const.pm で package Const;
として、require する側では $Const::foo 等と読めばいい。
パッケージ名で修飾するのがイヤなら perldoc Exporter 。
600 :
585 :03/09/01 01:19 ID:???
>>599 requireの一度読み込まれた場合ってのがkeyですね。
一度読み込まれたってのがどういう条件で判断されるのか。
あるpackage内でなのか(今回の例でこれは違うだろうけど),
あるファイル内でなのか(requireされたコードも含む)
あるプロセスでなのか。
昨日からのムカムカが後少しですっきりします。
みんな、ホントに感謝!!
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
共有サーバなのでPerlのモジュールとかインストールできないんですが、 UTF-8からUTF-7へ変換出来る.plのライブラリってありますか? jcodeとかは、そもそも.pmでないとユニコードすら対応していないので・・・
あぼーん
あぼーん
あぼーん
あぼーん
615 :
nobodyさん :03/09/01 15:09 ID:fFXrj9/A
初心者本を読み終えて、自分でPerlを書いてみたんですが うまくいきません、、、。 htmlファイルのフォームで受け取ったデータをcgiにpostして そのデータをファイルに書き込み、確認のhtmlを出力したいのですが、 # ------ここから出力-------- print "Content-type:text/html\n\n"; print << "END_OF_HTML"; <html> <head> <title>確認</title> </head> <body> $form1{'a'}を$form1{'x'}ですね。<br> </body> </html> END_OF_HTML
616 :
nobodyさん :03/09/01 15:11 ID:fFXrj9/A
って感じで出力するhtmlの中に日本語を入れるとそこから <title /title>となり htmlのソースがおかしくなってしまいます。 日本語を使わなければ、正しく表示されます。 ちなみにcgiファイルに直接アクセスすると、 「をですね。」と変数は表示されずに htmlは正しく出力されています。 原因を教えて戴けませんでしょうか? お願いします。
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> を入れてみたら?
>>617 のcharsetは使ってる文字コードに置き換えて。
ちゃんとフォームの中身は受け取ってるんですかね? まさか、↑のが全てじゃないよね。
620 :
nobodyさん :03/09/01 17:06 ID:fFXrj9/A
>>617 有難う御座います。教えて戴いた事を試してみたんですが、
解決しませんでした、、。
そこで試しにもう一度初めから書き直してみたら、うまくいきました(汗
そこで、以前のファイルと比べてみようと開いてみたら
元のファイルが文字化けしてしまいました。
原因は初めそのファイルをemacsで作っていて、途中でgeditで編集
した時に文字コードが変わってしまっていた事のようです。
ご迷惑をおかけしました。
621 :
609 :03/09/01 19:49 ID:???
>>610 御察しが良いようで。
UTF-8形式でPOSTされたデータをsendmailで送りたかったのですが、
Base64で符号化、という方法もありましたね。
ところが、UTF-8をBase64で符号化すると、
漢字を含む文章を正しく表示できなくなってしまうようです。
今度はQuoted PrintableでGogってます。
>>rPbXixOt
荒らし?
>>621 そう。粘着荒らし。このスレのあぼーんはほとんど奴。
削除依頼して削除するのも荒らしをかまうことにならないのかな・・・
こんばんは。 先月からPerlの勉強始めて、初心者なのですが 検索した結果、わからなかったため質問させていただきます。 勉強を兼ねて掲示板を作成中で、METHOD="POST" でHTMLからCGIにデータを送って処理させています。 コード化されて転送される漢字の”十”にバックスラッシュの コードが含まれていて、文字化けがおこるとのことですが、 処理後、表示される文字は文字化けがおきていません。 jcode.plでデコード処理をおこなったり、CGIにデコード処理の プログラムを追加することで防ぐそうですが、必要性がいまいち理解 できません。また、ほとんどのCGIプログラムではGETとPOSTとの違いが わからないようにしているそうですが、GETはセキュリティが弱いため 隠すのはわかるのですが、POSTを使っていけない理由がわかりません。 長文になりましたが、先輩方ご教授ください。
>>623 >ほとんどのCGIプログラムではGETとPOSTとの違いがわからないようにしているそうですが
へ?ソースのformタグ見ればわかるじゃん
まず、誰が使ってはいけないと言ったのか。
626 :
623 :03/09/01 23:52 ID:???
>>626 POSTとGETの違いを「意識させない」ように
CGIライブラリが作ってあるって意味。
ブラウザとCGIのやり取りは次のようになる。
1. データをURLエンコードする。(ブラウザがやってくれる)
2. CGIでデータをURLデコードする。(上のCGIライブラリや自力でデコード)
3. 必要に応じて文字コードを変更(統一)する。
で、文字化けに関係してくるのは 3.の部分で、
SJISの「十」は0x8f 0x5cになり、2バイト目が0x5c=「\」と一致する。
そのため次の文字の1バイト目がエスケープされる。
そうすると1文字目の1バイト目と2文字目の2バイト目が合体(キメラ化)して
別の文字になってしまうというわけだ。
>>623 バックスラッシュが含まれて化けるのは、
あくまでリテラルの話な
629 :
623 :03/09/02 00:33 ID:???
回答ありがとうございます。 キメラ化の話はサイト巡回中にあったとおもいます。 また、いろいろ考えてみたのですが POSTで送られてきたデータを@value=param('name')として格納した後 各スカラーに($1,$2,$3)=@valueとして格納するのと POSTで送られてきたSTDINからread関数でスカラーに格納して、必要に応じて splitして各スカラーに格納した後に、jcode.plによって漢字変換する方法で 前者は@valueに格納された文字がすでに漢字であり、jcode.plにかける必要がなく 後者はSTDINの内容がメタ文字などを含むコードになっていて、漢字変換する必要がある という考え方でよろしいのでしょうか? あまりに基本的な話すぎて申し訳ないです・・
630 :
623 :03/09/02 00:35 ID:???
↑追記:送られてくるデータが漢字の場合です。
>>630 インターネット上では、日本語の文字セットとして
EUC-JP,Shift_JIS,ISO-2022JP
等が使われています。
それぞれのコードには互換性がないので、これを変換して
一つの文字セットに統一するものがjcode.pl(jcode.pm)です。
ある文字列の、先頭40バイトだけを取り出したいのですが、 40バイトが、マルチバイトのたとえば「男」の先頭1バイトだった場合、 39バイト(つまり、「男」の直前まで)だけを取り出す、という処理は、 perlではどうすればいいのでしょうか
40byte目がマルチバイトかどうか調べて、そうでない場合は 40byte取り出し、そうである場合は39byteまで取り出す。 euc-jpだったら、 if (/^.{39}[\xA1-\xFE]/) { print $1, "\n"; } else { print substr($_, 0, 40), "\n";} shift-jisだったらでき・・
(.{39})だった。
>>632 my $message = 40 バイトで強引にぶった斬った Shift-JIS な文字列;
my $check1 = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*';
my $check2 = '[\201-\237\340-\374]';
$message =~ s/($check1)$check2$/$1/g;
こんな感じかも。
(♪ch携帯対応改造で使ったやつの引用)
EUCでもいっしょだよ ほんとはループさせて終端からチェックし、確実に漢字1バイト目じゃないところまで 戻って、そこから進めると最後がASCIIか漢字の1バイト目か2バイト目かわかる でも40バイトなら先頭から数えても問題ないけどね
637 :
560 :03/09/02 12:09 ID:???
ありがとうございます。
SJISだったんですが(←言ってなかったですね、すみません)、
直前にEUCに変換して、
>>561 さんのを使わせてもらって、
また、SJISに戻しました。
ありがとうございました。
638 :
nobodyさん :03/09/02 12:17 ID:nOZ+Ay6O
>>633-634 ('あ' x 20)をそのルーチンに通したら文字化けするよ。
>>635-636 そんな面倒なことしなくても、EUC文字列の場合単にMSBが立ってるバイト数を
偶数にすれば良いだけだから、
$text = substr($text, 0, 40); # 40バイト取る
$msb = '[\x8E\xA1-\xFE]'; # EUC文字片
chop $text if tr/$msb/$msb/ % 2;
これでOK。(JIS X 0212の存在は無視)
>638 文字列の中にダブルバイトとシングルバイトが共存してる事はありえないの?
あぁ、勘違い。 忘れてくれ。
641 :
632 :03/09/02 13:00 ID:???
560じゃなくて632だったです。 OpenJaneで番号ずれてた・・・
643 :
632 :03/09/02 13:39 ID:???
644 :
632 :03/09/02 13:53 ID:???
264.pts-0.venus(Attached) という文字列(先頭はタブ)から"264"を抜き出したいんですが どう書けばいいのか分かりません。 $str = "264.pts-0.venus(Attached)"; m/\t(\d)*?\.pts.*/; print $1; で何も表示されず。アドバイス下さい。
>>645 $str =~ m/\t(\d)*?\.pts.*/;
の間違いです。それでもうまく行かないです。
>>646 $str =~ m/\t(\d*?)\.pts.*/;
?ん?もしや釣り?
釣れたぞ、おい
>>632 >>635 さんので動くとおもうけど、もうひとつ。
my $sub = substr($str, 0, 40);
$sub =~ /^(?:[\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/ or chop $sub;
>>646 こうでも。
$str = "\t264.pts-0.venus(Attached)";
$str =~ m/^\t(\d+)\.pts/;
print $1;
次回からはこちらへどうぞ。
正規表現道場@2ch Part2
http://pc2.2ch.net/test/read.cgi/php/1038146241/
650 :
nobodyさん :03/09/03 02:57 ID:8C5hGjxK
みなはんエディタは何使ってる? 今まで秀丸オンリーだったけどちと検索したら いろいろあったもんで。 perleditor cgi_edit perl debugger perlを始めよう! などなど。なんかお勧めのない?
oeditは軽いがtxt,html,Perlなどを編集できる。
654 :
650 :03/09/03 03:07 ID:???
こ、これは失礼しました・・・
viでperlはきつい。
ネタじゃないんですけどね。。
>>649 のまま張り付けたけど何も出力されませんでした(´・ω・`)ショボーン
659 :
nobodyさん :03/09/03 04:16 ID:q0K9DyHf
htmlのformからcgiに aa=1,ab=2,ac=3,ba=4,bb=5,bc=6 って送って $data1 = "$form{'aa'}$form{'ab'}"; $data2 = "$form{'ba'}$form{'bb'}"; $data{'$data1'}= $form{'ac'}; $data{'$data2'}= $form{'bc'}; とした場合に print $data{'$data1'},$data{'data2'} は3,6と出力されるのに print $data{'12'},$data{'45'} は何も表示されません。 この場合、%dataのキーである12と45は数値データではなく 文字列データとして扱われているのでしょうか? またその場合、$data{'"12"'}としても12は文字列データとして 代入できないのですが、どのようにすれば代入できますかね?
>659 " と ' の違い
664 :
659 :03/09/03 15:17 ID:???
>>660 さん
ども。しかし、$data{'12'}としても$data{"12"}としても
出力されないんです、、、。
それとも、もっと前の部分で'と "を使いわけろと言うこと
でしょうか?
>>664 $data{'$data1'} => $data{"$data1"}
ちょっと考えればわかる
666 :
665 :03/09/03 15:47 ID:???
もっといえば、$data{$data1}でいい。 print '$data1'; print "$data1"; print $data1; この3つやってみたら?
667 :
nobodyさん :03/09/03 16:49 ID:Z3bfhz4O
初心者です。 ”my”と”local”は違うのでしょうか? ”my”が手元の入門書で使われていないので判りません。 教えて下さい。
>>667 はじめてのPerl WIN32 とかいうの発売されてなかったっけ?
ある文字列の中に、ピリオドが2つ以上含まれているかどうかを判断するには、 どうすればいいのでしょうか?
671 :
nobodyさん :03/09/03 17:36 ID:HPS+c9jA
>>670 こんな感じ?
if ($str =~ /\.(.*)\./) {
print "含まれてます";
}
>>671 文字列が巨大でなければこっちの方が早い。
if( ($str =~ tr/././) >= 2){
print "含まれてます\n";
}
localは変数を新しく作るんじゃなくて、一時的に"退避"させるんだったっけ
$a = '1'; print "$a\n"; #=> 1 { my $a = '2'; print "$a\n"; #=> 2 print "$main::a\n"; #=> 1 } { local $a = '3'; print "$a\n"; #=> 3 print "$main::a\n"; #=> 3 } print "$a\n"; #=> 1
>>677 >>676 じゃないが、コンテキストからわかるだろ。
そういえば、<IN>でループ回してるときに
print <IN>;
とかやっちゃって失敗したのを思い出した。
679 :
668 :03/09/04 19:47 ID:???
>673 674 675 676 亀ですみませんでした。 レスありがとうございます。 m(__)m 使い方が判りました。 簡単なパッケージを作って確認してみます。
あぼーん
あぼーん
682 :
:03/09/06 05:53 ID:???
掲示板スクリプトで自動生成したログファイルを 削除したいのですか、ターミナルからrmコマンドを 使ってもpermission deniedが出て消せません。 ローカルでやる時はスーパーユーザーになって 消せますが、ISPの鯖に上げて動かし生成した ものは自分では消せないようです。どうすれば 良いのでしょう?
>>682 強引に削除するスクリプトを描いて設置しる。
CGI になるかと思うので、レスポンス、エンティティヘッダの出力をお忘れにならないように。
684 :
682 :03/09/06 06:04 ID:???
こんな感じででしょうか? #!/usr/bin/perl unlink("ファイル名前"); exit;
>>684 それだとエラーに
#!/usr/bin/perl
unlink("ファイル名前");
print "Content-type: text/plain\n\n";
exit;
>>685 本当に消えたのかどうかはっきりさせるために、
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print unlink("ファイル名前");
exit;
とするのはどうか。
688 :
682 :03/09/06 08:13 ID:qOA5ehbE
あ、ターミナルからではなく、ブラウザから アクセスして動かさないといけないってことですか。
>>685 >>684 は表示がエラーになるだけでプログラムはちゃんと動いてる。
ファイル消すだけなんだから別に
>>685 のようにしなくてもいいと思うが。
まあ
>>687 みたいにするのもいいけど。
あと
#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
unlink("ファイル名") or die $!
とか。
つーか、Webサーバー権限でCGIが実行されるような糞なところは使うなよ。
692 :
682 :03/09/06 14:05 ID:???
うまく消せるようです。 ありがとうございました。
消すにはそのファイルが含まれるディレクトリにwriteがないと無理 cgiでディレクトリ作ってパーミッション設定忘れるとそうなるねえ
694 :
nobodyさん :03/09/06 21:22 ID:DXHBOkzn
2個のCGIから書き込み可能なファイルは、片方のCGIでロックファイルした場合に、もう一方のCGIから見てもファイルロックされているのでしょうか。 flockでやろうと考えてるんですが、誰か教えてくだせえー
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
708 :
nobodyさん :03/09/07 14:40 ID:u7agmyKi
ちょっとこのスレの趣旨と違うかもしれませんが質問させてください。 今SSIを使って<!--#exec cmd="./aaa.cgi" -->という形で ランダムでテキスト表示をしています。別にtxtファイルがあり、 その中にある文章を表示するという形です。 そのtxtファイルの中にただの文字列ではなく <!--#exec cmd="./bbb.cgi" -->というような別のSSIでさらに ランダムでテキスト表示するための文字列を加えたいのですが、 何も表示されません、 こういう芸当は無理なのでしょうか?
>>708 思いっきりすれ違いな気がするけれども
#! /usr/........
open(F, "textfile.txt") or exit;
@text = <F>;
close F;
print $text[int rand($#text+1)];
じゃ無理なの?
>>708 もしできたら永遠にループして困るだろーがよ。
711 :
708 :03/09/07 15:11 ID:u7agmyKi
>>709 それだと普通のランダム表示だと思うのですが・・・。
やっぱりスレ違いなんですね。
それっぽいスレがなかったもので、すいません。
712 :
709 :03/09/07 15:13 ID:???
あぁ、意味を取り違えてた。 でも、んなことする必要なくない?
713 :
708 :03/09/07 15:14 ID:u7agmyKi
>>710 ループしてしまうものなんですか?
一度出力したら終わりと思っていたのですが。
714 :
708 :03/09/07 15:18 ID:u7agmyKi
必要と言われるとそんな気もします・・・。 やっぱり出直します。スレ汚し失礼しました。
最初に起動するCGIで全部処理すればいいだけの話。
この辺はHTTPサーバ依存だと思うが、できるやつは無いかもね Apacheのドキュメントにははっきりと、できないしする予定も無い事が書いてある
たしかこのスレで、 あるディレクトリ($path)のtmpで始まるファイルだけを消す方法を尋ねたら、 opendir(DIR, $path) or die; unlink map { "$path/$_" } grep { /^tmp.*/ and -f "$path/$_" } readdir(DIR); closedir(DIR); という答えをもらいまして、 実際にためしたのですが、 消えません。。(ちなみに、dieにもなっていない) どうすればいいのでしょうか・・・他の方法でもいいので。 (ただ、cgiからunixコマンドを呼び出すことはできない環境です。(のでrm とかできない))
718 :
nobodyさん :03/09/08 14:27 ID:X5G7G9R4
1. やりたいこと:文字列中の漢字をひらがなに変換したい。 2. 試してみたこと #!/usr/bin/perl use NKF; use Text::Kakasi; use Text::ChaSen; print "Content-type: text/html\n\nOK!"; exit; を実行して、ChaSenが鯖に入っていることを確認。 で、googleでサンプルを探したのですが、見あたりません。 ChaSen使っている方いないでしょうか。
>>717 $path の内容の末尾に「/」が入っている悪寒。
>>717 とりあえずmap { print "$path/$_" }して中見てみれば?
722 :
718 :03/09/08 17:10 ID:???
>>719 情報有り難うございます。以下のスクリプト
---------------------------------
#!/usr/bin/perl
use NKF;
use Text::Kakasi;
use Text::ChaSen;
$res = Text::ChaSen::getopt_argv('chasen-perl', '-j', '-F', '%m ');
$str = Text::ChaSen::sparse_tostr("日本語の文字列");
print "Content-type: text/html\n\nOK!";
print $str;
exit;
---------------------------------
を実行したら、
/usr/bin/perl: relocation error: /usr/lib/perl5/site_perl/5.6.1/i386-linux/auto/Text/ChaSen/ChaSen.so: undefined symbol: chasen_getopt_argv
とエラーメッセージが出てしまいました...
723 :
nobodyさん :03/09/08 17:13 ID:bPmk+TI6
1. フォームから送ったデータを別ファイル「fileA.dat」に書き込み、その「fileA.dat」から読み出したデータで分岐をさせたい。 2.jcode.plでデータのコード変換を試みたがうまくいかない。 別の変数に代入を試みたが元データがフォームから送られてきたものである限りうまくいかない。 3. その「fileA.dat」が一枚なら問題ないのだが、ループさせて「fileA[00-99].dat」のようにファイルを複数個つくると、 ファイルがUnicodeで勝手保存されてうまくいかない。 データはブラウザ上では問題なく表示されるが、if文などの分岐の文字列として機能しない。 質問の書き方はこんな感じでよろしいでしょうか? なにか分かりにくい点がありましたらお手数ですが、レス宜しくお願いします。 どうかお助けください。
>>723 それじゃやってくれってことでしょ
うまくいかないコードぐらい貼って
725 :
723 :03/09/08 18:09 ID:bPmk+TI6
726 :
723 :03/09/08 18:16 ID:bPmk+TI6
tmp.txt = tmp.cgi で配置とパーミッションは、 tmp.cgi(755) lib(755)/ cgi-lib.pl(644) data_box(755)/ です。
727 :
723 :03/09/08 18:17 ID:bPmk+TI6
タブは表示されないのですね、失礼しました。 tmp.cgi(755) lib(755)/cgi-lib.pl(644) data_box(755)/ です。
>>725 チェックボックスのvalueを全部同じにしてわざわざ「,」で区切るなんて
根本的にフォームの使い方がおかしい
それにチェックボックスの状態を記録するためだけに
datというファイルをあえてたくさん作りたい理由はあるのか?
729 :
723 :03/09/08 19:38 ID:???
レスありがとうございます。 すみません超素人なんです…。 プロの方からみれば本当にどんくさいことをしていると言うのも重々承知しております。 もし宜しければ代替案のヒントなどいただけるとうれしいです。
730 :
nobodyさん :03/09/08 20:24 ID:3AX/sDx8
誰かKENT氏のMT-BOARD持ってる人いませぬか
持ってますが何か?
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
740 :
nobodyさん :03/09/09 13:25 ID:Art/HRbf
置換演算子s///の、/eオプションについての質問です。 $a = 'A'; $_ = '$a'; print $_, "\n"; # $aと表示 s/(\$\w+)/$1/ee; print $_, "\n"; # Aと表示。なぜこうなるのか、どなたかご教示ください。
>>740 マッチした文字列(この場合は変数名)を式として評価したから。
じゃないの?
>>740 $a = 'A';
$ab = 'hoge';
$_ = '$a';
s/(\$\w+)/$1 . 'b'/ee;
print; # hoge
743 :
740 :03/09/09 13:53 ID:???
>>741 ,
>>742 さっそくのレス、どうもありがとうございます。
742さんの例だと、1回目の/eで置換文字列は'$ab'になり、2回目の/eで
'hoge'になるということですね。
文字列連結を行っていない740の場合、なぜ2回の/eeが必要なのかわからない
のです。
>>743 マッチした文字列(この場合は変数名)を式として評価したから。
じゃないの?
/\___/ヽ ヽ / ::::::::::::::::\ つ . | ,,-‐‐ ‐‐-、 .:::| わ | 、_(o)_,: _(o)_, :::|ぁぁ . | ::< .::|あぁ \ /( [三] )ヽ ::/ああ /`ー‐--‐‐―´\ぁあ
巨大な文字列$varがあったとして、先頭128バイトが要らないとき、 余分な代入をせずに、これを無視する方法はありますか? つまりCでいう char* p = &var; p += 128; // 以後は p を使ってアクセス のようなことがしたいのですが。
747 :
740 :03/09/09 16:38 ID:???
>>742 $a = 'A';
$ab = 'hoge';
$_ = '$a';
s/(\$\w+)/$1.'b'/; print $_, "\n"; $_ = '$a'; # $a.'b'
s/(\$\w+)/$1.'b'/e; print $_, "\n"; $_ = '$a'; # $ab
s/(\$\w+)/$1.'b'/ee; print $_, "\n"; # hoge
# 上の表示をじっと見ると、文字列連結しないなら、下のようになるのは当然
# でした。お騒がせいたしました。
$_ = '$a';
s/(\$\w+)/$1/; print $_, "\n"; $_ = '$a'; # $a
s/(\$\w+)/$1/e; print $_, "\n"; $_ = '$a'; # $a(/eなしと同じ)
s/(\$\w+)/$1/ee; print $_, "\n"; # A
748 :
nobodyさん :03/09/09 17:05 ID:OBePyqIf
簡単だと思いますが、自力でわからないのでご回答願います。 文字列$strの中に「,」がいくつ含まれているかを表示させる方法
>>748 $count = ($str =~ tr/,/,/);
print $count;
s///とtr///(y///)は変換(置換)した文字数を返す。
750 :
748 :03/09/09 18:29 ID:OBePyqIf
なるほど!ありがとうございます。
>>746 $var = substr($var, 128); じゃダメ?
メールアドレスで自動リンクの仕方はどうやるのでしょうか?
754 :
nobodyさん :03/09/09 20:32 ID:v/xCzILp
@fine=(['クーラー','#eeeeee'], ['エアコン','#eeeeee']); foreach(1 .. $#fine){ $y1[79] =~ s/$fine[$_][0]/ <span style="color:$fine[$_][1]"> $fine[$_][0]<\/span>/g; でやってるんですが、どうもクーラーの ーがいけないみたいで表示が真っ黒に なってしまいます。 あと夕の文字も駄目みたいなんですが、 対処法を記載して下さい。 ーを半角にすると大丈夫みたいですが。。。
>>754 >foreach(1 .. $#fine)
foreach(0 .. $#fine)じゃないかい?
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
>>754 >>755 むしろ、全部ぶん回したいなら、
foreach ( @fine ) {
$y1[79] =~ s/$_->[0]/
<span style="color:$_->[1]">
$_->[0]<\/span>/g;
}
こうした方が。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
773 :
nobodyさん :03/09/10 10:17 ID:nCyeQoyB
ここに長いこと粘着してる荒らしって前にパンチとかキックとか言ってたやつ?
>>773 そう。あれからずっと自己紹介し続けてる。
775 :
nobodyさん :03/09/10 11:15 ID:ehR5IsOg
申し訳ありません、コンパイルエラーのことを聞くのは恥ずかしいとは思うのですが、 どこで発生しているのか見当すら付きません。 [Wed Sep 10 11:02:42 2003] [notice] Apache/1.3.27 (Unix) configured -- resuming normal operations [Wed Sep 10 11:02:42 2003] [notice] Accept mutex: sysvsem (Default: sysvsem) Can't use global @_ in "my" at /usr/local/lib/perl5/5.6.1/Carp/Heavy.pm line 30, near "return @_ " Compilation failed in require at /usr/local/lib/perl5/5.6.1/Carp.pm line 97. というエラーは、どこでどう発生しているのか、発見する方法について何かご存知の方がいらっしゃればアドバイスをお願いいたします。
776 :
:03/09/10 11:36 ID:???
フィーバー ↓
777 :
nobodyさん :03/09/10 12:06 ID:fP87jQDg
すいません PerlでBBSを作っていますが unshiftで配列だと新しい記事は上につくんだけど 2chのように下につけるにはどのようにするのですか?
あぼーん
あぼーん
781 :
754 :03/09/10 18:37 ID:Bi+qgamu
例えばコンピュータに色を付けたい時に、 色の指定の所で、「ー」の記号を使うと エラーになるみたいなので、 コンピュとタの間に色の指定をする事 は出来ないでしょうか?
782 :
nobodyさん :03/09/10 18:47 ID:v9aJB7Z5
JPEGファイル限定で<INPUT TYPE=FILE>タグからPOSTされてきた画像を 鯖に保存する際、オリジナル以外にサムネイルも一緒に保存したいのですが、 何かよい.plライブラリはありませんでしょうか? オリジナルファイルを保存することは簡単にできたのですが。 ググッっても、うまく見つけれずにいます。 知識者の方、よろしくお願いいたします。
783 :
nobodyさん :03/09/10 18:52 ID:v9aJB7Z5
>>781 トーシロで申し訳ないが、文字を抽出する時、
全角2バイトの1バイト目が[\x81-\x9F\xE0-\xFC]の場合を
考えてみたらどうでしょうか?
>>781 「ー」の2バイト目は0x5b→[
「タ」の2バイト目は0x5e→^
どっちもメタ文字だから。
\Qでも使ってエスケープしてみれ。
あぼーん
あぼーん
あぼーん
あぼーん
789 :
nobodyさん :03/09/10 23:15 ID:1gfPV2JX
>782 サーバーにImageMagickが入っていれば簡単ですよ。 確認してみたら。 ちなみに、オレはロリポというサーバーで使っているよ。
すんまそん。ActivePerl v5.8.0 built for MSWin32-x86-multi-thread です。
関数でハッシュを返したいんですが、
リファレンスで返せばいいことまではわかりました。
しかし、リファレンスで返した後どう参照したらいいかがわかりませんです。
どぼじて?
<code>
sub test {
my %ret = { '01' => "test01" , '02' => "test02" , '03' => "test03" };
return \%ret;
}
$hash = test;
while ( ($key, $value) = each %$hash ) {
print "Key: $key, Value: $value\n"; # 出力 Key: HASH(0x16253ec), Value:
}
</code>
ここ参考にします他.
http://www.rfs.co.jp/sitebuilder/perl/02/10.html#%83%8A%83t%83@%83%8C%83%93%83X%82%CC%8EQ%8F%C6
あぼーん
$hash = test; ↓ $hash = &test;
794 :
772 :03/09/11 00:08 ID:???
すいません、自己解決できました。
わてくし、ハッシュを作る時の () と、{} の違いがわかっておりませんです他。
() : ハッシュの作成。
{} : ハッシュへのリファレンスの作成。
sub testでしょっぱなから {} を使ってハッシュへのリファレンスを作成し、
それへののリファレンスを返していたので、リファレンスへのリファレンスになっていました。
それが、期待した動作を得られない原因です他。
<code>
sub test {
my %ret = ( '01' => "test01" , '02' => "test02" , '03' => "test03" );
return \%ret;
}
</code>
こうすることで上手くいきます他。
>>774 氏、お手数おかけしてすいません。ありがとう御座いました.
参考までに下記のサイトが、ハッシュのリファレンスに関してわかりやすかったです。
http://plaza17.mbn.or.jp/~naotosi/Special/perl/perl3.html#2-2
>>782 GD.pm ってのもあるけれども、、、
>>781 Shift-JISで組むな。EUC-JPで組め。
>>795 まあ、JPEG限定と最初の質問には明記しているが、
拡張性を考えてImage-Magickを使っておく方がいいもんだよ。
# 後で絶対機能追加したくなるって。
あぼーんが速くなったな
渇を入れてやったから
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
808 :
782 :03/09/11 08:35 ID:tAL7swdB
レスありがとうございます。 Win鯖なので、ImageMagickはインストールできないですよね? GD.pmもパッケージのインストールが必要なのでしょうか?
ここはコーディングの・・・いやなんでもない。
810 :
782 :03/09/11 10:03 ID:tAL7swdB
>>809 申し訳ないil||li _| ̄|○ il||li
あぼーん
>>781 なんで未だにこういうのがいるのかね。
Shift-JISで書いてわざわざ\エスケープするぐらいならEUC-JPで書いた方がマシ。
813 :
nobodyさん :03/09/11 12:54 ID:cA0CYljH
みなさん初めまして。 ホームページで、金額を表示したい場合などのために、 『引数として渡された数字を、3桁ごとにカンマで区切って、戻り値として返す』 という以下のようなパッケージを作りました。 いちおうは正常に動作しているようなのですが、 渡された引数の、先頭の数字が0だった場合(例014825)のみ、エラーが出てしまいます。 どなたか理由がわかりませんか? package utility; ###################################### # 数字を3桁づつに区切る sub sanketa { my (@arr); my (@kazu); my ($i); my ($NUM); @arr = reverse (split(//,$_[0])); while (@arr) { for (1..3) { $i = shift(@arr); push (@kazu,$i); } if ($arr[0] ne '') { push (@kazu,',')} ; } @kazu = reverse(@kazu); foreach $i (@kazu) { $NUM .= $i; } return ($NUM); @arr=(); @kazu=(); $NUM=(); }
815 :
nobodyさん :03/09/11 13:18 ID:iq0GSzN2
<input type="file" name="upload"> みたいな感じでファイル(CSV形式)をアップロードさせようと思っていますが、 スクリプト側でどのようにしてファイルを拾えばいいかわかりません。 ファイル自体を処理するのは大丈夫なんですが、 どのようにファイルを拾えばよいかどなたか御教示いただけませんか?
816 :
782 :03/09/11 14:19 ID:tAL7swdB
>>815 ### データ処理 ###
binmode(STDIN);# バイナリモード
$section_line = <STDIN>;# 区切り行
$section_line =~ s/\r\n//;
while(<STDIN>)# データ処理
{
### バイナリデータ ###
if($_ =~ /uploader/)# TAG NAME
{
if($_ =~ /filename=""/)
{
#ファイルが指定されていない。
exit;
}
~s/\r\n//;
~s/"//g;
@buf = split(/filename=/, $_);
$full_path = $buf[@buf - 1];# パス付ファイル名
$file_name = $full_path;
&jcode'convert(*file_name, 'euc');# EUC
@buf = split(/[\\\/]/, $file_name);
$file_name = $buf[@buf - 1];# ファイル名
&jcode'convert(*file_name, 'sjis');# Shift-JIS
@buf = split(/\./, $file_name);
$file_ext = $buf[@buf - 1];# ファイル拡張子
$file_ext =~tr /A-Z/a-z/;
817 :
782 :03/09/11 14:20 ID:tAL7swdB
>>816 のつづき
$file_kind = "その他";
$file_kind = "JPEG"if($file_ext eq "jpg");
$file_kind = "JPEG"if($file_ext eq "jpeg");
$file_kind = "GIF"if($file_ext eq "gif");
$file_kind = "MS-WORD"if($file_ext eq "doc");
$file_kind = "MS-EXCEL"if($file_ext eq "xls");
$file_kind = "WAVE"if($file_ext eq "wav");
$file_kind = "ZIP"if($file_ext eq "zip");
$file_kind = "LZH"if($file_ext eq "lzh");
$binary_data = '';
$content_type = <STDIN>;# Content-Type
$content_type =~ s/\r\n//;
($null, $content_type) = split(/\//,$content_type);
$null = <STDIN>;# 空行
while(<STDIN>)
{
lastif($_ =~ /^$section_line/);# 区切り行でループを終了
$binary_data .= $_;# バイナリデータ
}
### ファイル書込 ###
open(fp,">$file_name");# オープン
binmode(fp);# バイナリモード→ファイル
print fp "$binary_data";# 書込
close(fp);# クローズ
}
818 :
782 :03/09/11 14:21 ID:tAL7swdB
>>817 のつづき
### テキストデータ ###
else
{
($null, $name) = split(/name=/,$_);# TAG NAME
$name =~s /\r\n//;
$name =~s /"//g;
$null = <STDIN>;# 空行
$value = '';
while(<STDIN>)
{
lastif($_ =~ /^$section_line/);# 区切り行でループを終了
$value .= $_;# VALUE
}
$value =~s /\r\n//;
### タグ別処理 ###
if($name eq 'title')
{
$value = ''if($value eq '');
$title = $value;
}
elsif($name eq 'message')
{
$value = ''if($value eq '');
$message = $value;
}
}
}
sub foo{ my $hoge = shift; my %hoge = %$hoge; $aho = $hoge{'args'}->[0]; } というサブルーチンに関してなのですが、まず、$hogeにはfooを呼び出した時の 1番目の引数が入りますよね? で、次の二行目の意味がわからないんですが…。 %$hogeってのは、hogeは何かのリファレンスのハッシュで、それをデリファレンス しているので、その実体という事ですよね? それを自分自身に代入しているということは、リファレンスから実体に変換している という事でしょうか。でもそもそも%hogeは初期化も値の定義もされてないし…。 一行目の変数$hogeと何か関係があるのでしょうか。 それと最後の行なのですが、hogeが配列で$hoge->[0]という文ならば、 hogeはリファレンスの配列で、その0番目の要素をデリファレンスしている、 つまり$ahoにはその実体が入る、と思うのですが、ここではhogeはハッシュだし…。 ハッシュの[0]ってどういうことでしょうか。 アホな質問をしているかもしれませんが、らくだ本とかで調べてもよく分かりませんでした。 教えて頂けるとありがたいです。
821 :
813 :03/09/11 15:06 ID:???
>>820 sub foo{ # サブルーチンの定義
my $hoge = shift; # 第 1 引数をローカル変数 $hoge にコピー。
my %hoge = %$hoge; # $hoge の名前の付いた HASH をローカル変数 %hoge にコピー
$aho = $hoge{'args'}->[0]; # %hoge の 'args' というキーに格納されているリストの 0 番目の値を $aho にコピー
}
●実際に値を入れて考えてみる。
&foo('heee'); # と呼び出してみる。
sub foo{ # サブルーチンの定義
my $hoge = shift; # 第 1 引数 'heee' をローカル変数 $hoge にコピー。
my %hoge = %$hoge; # $hoge の名前の付いた HASH %heee をローカル変数 %hoge にコピー
$aho = $hoge{'args'}->[0]; # %hoge(=%heee) の 'args' というキーに格納されているリストの 0 番目の値を $aho にコピー
}
こんな感じ?
添削キボンヌ
>>822 ハッシュリファレンス期待してるサブルーチンに引数'heee'って
定数つけて呼んでもエラーだろ。
&foo( \%heee );
てか、元投稿、「らくだ本とかで調べてもよく分かりませんでした。」てのがわからん。
824 :
nobodyさん :03/09/11 16:22 ID:alzf5zjT
ファイルのCRC32値を計算するルーチンを そのへんの資料を使って、 @CRC32TABLE = ( いつものCRC配列 ); $filename = $ARGV[0]; $crc32 = &crc32($filename); print "$filename\n$crc32\n"; sub crc32 { my($char) = 0; my($crc) = 0xFFFFFFFF; open(FILE,$_[0]); binmode(FILE); while(<FILE>) { for $char ( unpack("C*", $_) ) { $crc = $CRC32TABLE[($crc ^ $char) & 0xFF] ^ ($crc >> 8); } } return sprintf("%08X",($crc ^ 0xFFFFFFFF)); } と書いて、動きはするのですが、計算速度がコマンドラインexeツールとかの 100分の1くらいしか出ません。(´・ω・`) もちっと高速化するにはどのへんをいじるとイイ感じになるんでしょうか?
@INC(ライブラリへのパス)関連の質問なんですが、 use strict でstrict.pmを呼び出すプログラムをperl -c で構文チェックすると 以下のようなエラーがでてしまいます。 Can't locate strict.pm in @INC (@INC contains: [/usr/local/lib/perl5/5.00503]/us r/local/lib/perl5/5.00503 y /usr/local/lib/perl5/site_perl/5.005/sun4-solaris /u sr/local/lib/perl5/site_perl/5.005 .) 詳しいことはわからないのですが、環境変数PERL5LIBを設定する必要があるのでしょうか 作成したスクリプトにライブラリの位置を明記しなくても、自動的に読みに行くようにしたいのですが どのように設定したら良いでしょうか?よろしくおねがいします。
826 :
825 :03/09/11 16:46 ID:???
追記: /usr/local/lib/perl5/ の中にCGI.pmやstrict.pmが格納されています
>>822 うーんとつまり、fooの第一引数はハッシュへのリファレンスで、
一行目で変数$hogeにそれを代入、二行目でローカルのハッシュ%hogeに
$hogeをデリファレンスした物をハッシュとして、つまり第一引数が参照している
ハッシュの実体を代入する、という事でしょうか。
んで%hogeはリストのハッシュで、$aho=$hoge{'args'}->[0];は、キーargsの要素
であるリストの0番目の実体を$ahoに代入する。
…で合ってるでしょうか。
>>823 リファレンス、デリファレンス、矢印演算子を扱ってる8章のあたりを読みなおして
みたのですが、いまいちわかりませんでした。
他にこの章を読んでおけってのがあれば、言ってくださると助かります。
全部読むのが一番良いんでしょうけど。
>>827 まあ、リファレンス、デリファレンスってなれないと難しいよね。
でも、らくだ本は読み物としても面白いから全部読むのがいいと思うよ。
複雑なデータ構造作ったり、そのうちオブジェクト指向やる、ってことになたら必須だし。
まあ、もって歩くには重たいけど。
で、単に要素を参照するだけならレキシカル変数 %hoge にコピーする必要ないよね。
もし %$hoge がでかかったらけっこう無駄だし。
sub foo{
my $hoge = shift;
$aho = $hoge->{'args'}[0];
}
これで要素をデリファレンスできるわけだから(※矢印位置)
がんばって。
829 :
nobodyさん :03/09/11 20:38 ID:btBR5eg4
perlチェッカー全く使えないね。 すぐにこれが出るよ↓ Missing right curly or square bracket at ore_sub-politics.cgi line 657, at end of line syntax error at ●●●.cgi line 657, at EOF これって、どっか()閉じ忘れだぞ〜って言う事なんでしょ。 それがどこか聞いてんのに…。 もっと性能の良い perlチェッカーか、 対処法を教えて下さい。
>>830 おいおい、ちゃんとスタイルに乗っとって書いてても括弧の閉じ間違いぐらい
するだろ。それとも実行する前にいちいち見直すのか?
インタプリタに渡した方が楽だろ?
間違えた 乗っとって→則って
>>824 String::CRC32.pm
>>825 PERL5LIBに設定。
しかし、なぜそんな所にstrict.pmが入るのか分からん。
>>831 俺も閉じ間違いはよくやるが、
どこで閉じ間違えたかを機械に探させるてのはかなり難問だと思う。
良いアルゴリズムがあったら教えてくれ。
かっことかっこの間を畳めるエディタとか使う。 左のガッターに+とか記号つくので、比較的どこで閉じ忘れてるか分かりやすいかも。 最大の難点は・・・ そういうエディタ少ない。
>>834 そんなルーチン開発するヒマがあるなら、閉じ忘れを防ぐエディタを開発
した方が生産的だと思うが。
俺はviクローンのshowmatchを使ってるからまず閉じ忘れや括弧の対応間違いは
ないが、そこら辺のエディタにはそういう機能はないのか?
>>829 はKENTのCGIの文法チェッカとか使っていってそうな悪寒がするのは俺だけか?
サクラエディタはイイよ
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
なんで透明あぼーんにしないんだろ・・・
845 :
nobodyさん :03/09/12 01:52 ID:B/YanBzt
CGIスクリプトにブラウザでアクセスすると、永遠に Content-type: text/html Content-type: text/html Content-type: text/html Content-type: text/html ・ ・ って表示されるんだけど、何ででしょう? 出力部分は print "Content-type: text/html", "\n\n"; for( &load_format($Format) ){ s/\$cgi_url/$cgi_url/sg; s/\$hoge/$hoge/sg; print; } exit; こんな感じなんですが・・・
load_formatの中身は?
中華、構文エラーにならない?whileマニなので forあんま使ったこと無いから 良くわかんないんだけど、ごめんね。
848 :
845 :03/09/12 02:07 ID:???
sub load_format{ my $file = shift; # $fileはHTMLフォーマットファイル open(FMT, $file) || &error('Failed to open $file: $!)'); $line = join('',<FMT>); close(FMT); return $line; } load_formatの中身です。 どうでしょう?何か悪いところありますか?
849 :
845 :03/09/12 02:08 ID:???
試してみましたが、上みたいにループはされないけど、もしかして print "Content-type: text/html", "\n\n"; 略 exit; この外側でループさせてる? …のならばそれが問題かも。
851 :
845 :03/09/12 02:19 ID:???
>>850 いや、外側でループさせてないですね。
あーもう全然ワカンナイ。
もしかして全く違う部分なのかなぁ。
print文をばらまけ
>>851 すみません、お役に立てなくてΣ(´△`;
854 :
845 :03/09/12 02:28 ID:???
いえいえ。どうもありがとう。
855 :
845 :03/09/12 03:13 ID:???
上記の件の報告。 conf.iniっていうファイルをスクリプトの最初でrequireしてたんだけど、 confではなくConfになっていますた。 実際は全小文字のファイル名。 でも、なんでContent...が無限に出るのさっぱりワカランよ。
>>847 for()の中にセミコロン( ; )がなかった場合、Perlはforをforeachと解釈します。
この場合、スカラー値なので、
for(load_format($Format)){
...処理
}
は、
{
local($_);
$_ = load_format($Format);
...処理
}
の短縮形のように使われることがあります。s///とか変数名が省略できて便利だから
という理由。LarryらしいっちゃLarryらしい仕様。
>>845 コード自体に問題はないから、その外側に問題があるんだと思う。
というか、普通requireに存在しないファイルを入れたらコンパイルエラーが返ると思う
んだが、Windows環境かなにか?
そうでないとすれば、そもそも問題視してるファイルが違うという可能性も。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
なぁコピペヲタクよ。勉強してんのか? 今のままなら、なーんも進歩せん糞人間だな。 ちったぁレベル上げろよ。
>>865 ギャラリーの存在を意識させてどうする。
せめてAA自作にしろよ(w
>>866 削除依頼をしているだけでも十分意識させていると思うよ。
次の質問をどうぞ↓
Perlってどこで売られているの?
871 :
nobodyさん :03/09/12 09:48 ID:SXvUVZeg
宝石売場
>>820 の質問をしたものです。追加の質問をさせてください。
sub foo{
my $hoge = shift;
my %hoge = %$hoge;
$aho = Jcode->new($hoge{'args'}->[0], 'jis')->euc;
print FH $aho . "\n";
}
このように、Jcode.pmを使って、jisの文字列をeucに変換してファイルに出力したいのですが、
ファイルを開いてみると、sjisのファイルだと言われ、さらに文字化けしています。
print $hoge{'args'}->[0];してみると、文字列が表示されるので、
$hoge{'args'}->[0]は文字列へのデリファレンス、つまりeucへの変換の部分は
合ってるのではないかと思うのですが…。
どこが間違ってるのでしょうか。
Jcodeのマニュアルです
http://perldoc.jp/docs/modules/Jcode-0.82/Jcode.pod
873 :
nobodyさん :03/09/12 11:07 ID:b/GH9I9g
>>872 問題ないけど。
元コードを jis って明示してるけど間違いない?
getcodeしてきました。JIS(ISO-2022-JP)で間違いありません。
あと、関係ないかもしれませんが、 $aha = foofoo($aho); print $aha; sub foofoo{ return $_; } というのを追加しても、何も表示されませんでした。 やっぱりJcodeの部分に問題があるんでしょうか。 でもそれだとprint $aha;で文字化けした文字列が表示されてもいいような…。
>>875 return $_[0];
じゃねえの?
てか、これで何調べてるのかわからんけど。
>>876 直したら正常に表示されました。
けど、$ahoには文字列の実体が入ってるんですよね?
つまりfoofoo("hogehoge");とfoofoo($aho);は同じなので、$_と書いたのですが…。
>>877 言ってることがわかりません。
サブルーチンは引数を何個だろうが @_ という配列で受け取ります。
$_ ってどっから来たの?
もちっと落ち着いて勉強したら?
>>877 あれれ、そうでしたか。
考え違いをしてました。済みません…。
で、なぜに
>>872 は化けるのでしょうか…。
>>879 知らん。
以下jisでスクリプト保存してコンソールで実行。
hoge.datには「それ」がEUCで保存された。化けません。
RedHat 7.3
This is perl, v5.6.1 built for i386-linux
なので再現しない以上わかりません。
---
use strict;
use Jcode;
my $hoge = {
kore => ['これ', 1 ],
sore => ['それ', 2 ],
are => ['あれ', 3 ],
dore => ['どれ', 4 ],
};
open FH, ">hoge.dat";
&foo($hoge);
close FH;
sub foo{
my $hoge = shift;
my %hoge = %$hoge;
my $aho = Jcode->new($hoge{'sore'}->[0], 'jis')->euc;
print FH "$aho" . "\n";
}
---
インデントは全角×3
Perlのバージョンは?
あぼーん
あぼーん
あぼーん
あぼーん
割り込んでみる
あぼーん
あぼーん
あぼーん
5.6.1です。 print getcode($aho); とすると、eucと表示されてるのに、出力されたファイルをテキストエディタで開くと sjisと認識される上、文字化けてます。 $event{'args'}->[0]が'ほげ'であった場合、ファイルには'、ロ、イ'と出力されています。 なんでできないんだろう…。
>>890 ??
それで正しいよ
、ロ、イ <- 半角カナも“、”という記号も文字として存在するんだから
テキストエディタがSJISと判断してもしかたがないんじゃ?
EUCとしてひらけばよし
>>890 > 出力されたファイルをテキストエディタで開くと
> sjisと認識される上、文字化けてます。
これってさ Perl のコーディングがどうこうじゃなくて、
エディタの問題でしょ?
エディタでファイル開いたときに文字コードの判別が
うまくいかずにデフォルトのsjisでオープン。
EUCで書かれている文字はもちろん文字化け
まさかエディタ==Windowsメモ帳ってオチじゃないだろうな。
マジっすか。 xyzzyを使ってるんで、文字コードは自動認識してくれると思うんですが…。 コーディング自体はあってるんですか…。
>>894 なんだよそれ、
明示的にEUCで開く、ってこともしないで聞いてたのかよ。
だから最初に「問題ない」って言ってるじゃんよ。
質問です。 掲示板への書き込み時にホスト名が引けない人が書き込みができないように 規制をしています。 その中で一部の人だけ、書き込みができるように設定しています。 @ok_people=('xxx.xxx.xxx','xx.xx.xxx'); #書き込みOKな人のIPアドレス foreach(@ok_people){ unless($remote_addr=~ /^$_/){ unless($remote_host){ print "ホスト名引けないエラー"; } } } なぜかこれでは書き込みOKな人もはじかれます。なぜでしょうか? また、もっとスマートな書き方があるように思うのですが、うつくしい書き方が あったら、教えて頂ければと思います。 よろしくお願いします。
ループも自分で展開しておっかけてみればわかるよ これで動くのは、@ok_people に1つしか登録して無い時だけじゃないか?
>>897 さん
今色々試して調べてみました。
やっとわかりました。
1回目はいいけど、2回目に引っ掛かるのですね。
どっかでループをぬける処理を作れば良さそうですが、あまりそういうコーディングは
良くないとどこかで聞いたことがあるような...
もうちょっと頑張ってみます。
ありがとうございました。
配列を検索する方法もいくつかあるが、 ハッシュにして一発で持ってくれば ループもいらんのでは
900 :
lopper :03/09/12 19:23 ID:ygMK1YTV
UDP を受信するスクリプトを書いているのですが、ちょっと質問です。 UDP って基本的にコネクションレスなので「送信元が、どこに宛てて」送信 したか分からないですよね。 UDP でパケットを受信した時に「宛て先」が分かるようには出来ないのでしょうか? 送信元は recv の戻り値で分かるのですが・・・
901 :
896 :03/09/12 19:39 ID:???
プロな方はよくハッシュを使いますよねぇ。 でも、ちょっと何とIPアドレスを関連づけたハッシュを作ればいいか... if (exists($hash{"xxx.xxx.xxx"})) っぽい気がするんですが、これでできるかなぁ。
902 :
896 :03/09/12 19:40 ID:???
プロな方はよくハッシュを使いますよねぇ。 でも、ちょっと何とIPアドレスを関連づけたハッシュを作ればいいか... if (exists($hash{"xxx.xxx.xxx"})) っぽい気がするんですが、これでできるかなぁ。
$hash{"xxx.xxx.xxx"} = 1 とか良くやるよ。値は何でもいい。
%ok_people = map { $_=>1 } @ok_people; &error unless ( exists $ok_people{$ip} ); こんな感じか。
コピペヲタクから返事があった。ちょと嬉しかった(w
ゲ製作技術板
http://pc2.2ch.net/gamedev/ でも逝って、ゲームプログラムとはなんたるかを勉強してこい。
そもそも、ゲームの類は色々な手法のかたまり、アルゴリズムの真骨頂。
いきなりゲームを作る!とかぬかす厨はその奥の深さを噛みしめてこい。
906 :
896 :03/09/12 20:56 ID:???
>>903 ,904
うーん、かなり短くできるのですねぇ。
ちょっと今は理解できないので、本を読んで理解してみます。
本当にありがとうございました。
907 :
896 :03/09/12 22:09 ID:???
>>904 やっと意味がわかりました...。
この場合だと、IPアドレスが完全に一致する場合でないとエラーならないようですが、
勉強になりました。
リモートのIPの下3桁をけずれば、いけそうです。
ありがとうございました。
マスクつきならちゃんと書いたほうがいいと思うよ
909 :
904 :03/09/13 01:25 ID:???
# @ok_people には、許可するIPを示す正規表現を入れる。 # 例)@ok_people = ( '\d+\.\d+\.\d+\.21' ); &error unless ( grep { $ip =~ /$_/ } @ok_people ); TMTOWTDI. ……まあ、俺は一行で済むのが好きなだけなんだが。
>>896 先頭一致なら index を使うが吉。
@ok_people = qw(192.168.0. 43.244.);
defined $remote_host or print "ホスト名引けないエラー"
unless grep index($remote_addr, $_) == 0, @ok_people;
911 :
nobodyさん :03/09/13 07:35 ID:Eo0kRzpR
BBSのログファイルの仕様をどのようにするか迷っています。 ログファイル中ではメッセージ一件を一行で保存するものとします。 ・案1 メッセージを古い順にファイルに保存する。 新規メッセージを追加書き込みするとき、ファイルの最後に追加するだけだから高速なはず。 最新メッセージを10件表示したいとき、ファイル後半の10行までファイルを辿っていく必要があるので遅くなる気がする。特にログが巨大になったとき。 ・案2 メッセージを新しい順にファイルに保存する。 新規メッセージを追加書き込みするとき、ファイル中の既存のメッセージログを変数とかに一旦格納してから、新メッセージ書き込み、既存メッセージ書き込みをする。ログが巨大になったら処理が重くなる気がする。 最新メッセージを10件表示したいとき、ファイルの先頭の10行を読めばいいから高速なはず。 上記のどちらにしても、書き込み、読み込みのどちらかに負担がかかる気がします。 なにかうまい方法があれば助言お願いします。(定石があったりするのでしょうか。)
912 :
nobodyさん :03/09/13 07:53 ID:f365Tbyt
DB_File(使えればMLDBMかまして) ハッシュにtieさせて使うので好きなデータを好きなだけ持ってけ
俺なら案1をとるけど。なぜなら排他失敗してログが飛ぶ心配がないから。 ファイルが巨大になると読み込みに時間がかかるというが、実際相当でかくならない 限りはその心配はいらんのでは? なんなら1000件毎にファイルを別に用意するとか。
914 :
911 :03/09/13 08:36 ID:Eo0kRzpR
>>912 , 913
なるへそ。
912さんのはよくわからないので調べてみます
ありがとっす。
>新規メッセージを追加書き込みするとき、ファイルの最後に追加するだけだから高速なはず。 これについては、投稿時のみの事だから、そんなに気にしなくても良いと思うけど。
2chみたいに、書き込みが物凄い量なら話は別だが…。
>>912 に一票。
use Fcntl;できれば、面倒くさいロックも考えなくてすむし、
ログが巨大になっても、データベースへのアクセスにかかる手間はほぼ変わらないし。
ログを直接読まれる可能性も減る。
>>917 中途半端な量だとDB使う方が遅くなるけどね…
>>917 ,912
DBMファイル直接ダウンロードできてしまうサーバも多いのは、気にしないの?
ついでに、DBMファイルとの接続は、普通のテキストファイルに比べて、3倍〜10倍の時間がかかるのも気にしないの?
おまけに、1件(テキストファイルなら行)あたりの読込み速度が数倍かかるのも気にしないの?
基本的にDBMファイルは横着なプログラミングに便利な予感。
920 :
nobodyさん :03/09/13 13:28 ID:rYbAvmZJ
$a、$b、$c、$d、$e が2以上の時と指定したいんですが、 $a>=2&&$b>=2&&$c>=2&&$d>=2&&$e>=2 だと長いんで、もう少し短くは出来ないでしょうか?
>>911 一定数のレスポンスでログをローテートさせた方がいいよん。
>>920 配列にできないかとか、$a >=2 と $b >= 2 をあらかじめどこかで評価しておくとか、
$dと$eはどっちか一つの評価でいいのかもとか、設計から見直してみる。
>>920 unless (int(($a+$b+$c+$d+$e)/2) < 5) { 処理; }
>>922 $a=10;
$b=$c=$d=$e=0;
int(($a+$b+$c+$d+$e)/2) == 5;
>>920 長くなるけど、エレガントにこんなんとか。
my $func_cheker = sub {
foreach (@_) { return 0 if not ($_ <= 2); }
return 1;
};
my $msg;
if ( not &$func_cheker(1, 2, 2, 5, 1, 1, 2) ) {
$msg = "2 以上の値が混じってま\n";
} else { $msg = "OK\n"; }
print $msg;
$a>=2&&$b>=2&&$c>=2&&$d>=2&&$e>=2 これでええやん…
926 :
912 :03/09/13 16:15 ID:f365Tbyt
選択支の一つとして出しただけ。 ケースバイケースで使い分けてるよ。 で、読んでるとDBMやたら遅いように感じるけど、データ読み込んでHTML展開するうちのファイルアクセス部分はその何分の一だから、体感的にはそこまでの差は感じないけど、 気にするならTEXTでもいいでしょ。 それも設計に因るでしょうけど。
掲示板等のログを更新する場合、 もしかして一旦ファイルを読み込んで閉じ、 その後処理を加えた後で再度上書きモードで開いて書き込まないと駄目なのですか? オープン→ロック→処理(ログ記事数調節とか)→書き込み→クローズ と言う流れでやろうとしたのですが無理でした…。 <$logfile だと書き込めないし、 >$logfile だと開いた瞬間ログの内容消えてる(と言うかそもそも読み込まない?)しでなんとも。
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
DBMで二次元ハッシュ使えるモジュールってある?
スレッドストッパーの文ってどこかにある?
941 :
nobodyさん :03/09/14 15:31 ID:NTDmuCBE
>>940 ぐぐれ。「書けませんよ」も追加すると吉
スレストってどうやって作るんだ? だいたいは思い浮かんでるんだが、どうもうまくいかない
673 名前: 停止しました。。。 :停止 投稿日: 停止 真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
一つ前のレスの投稿日が「停止」になってたら書き込み処理しない、でいいじゃん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
953 :
937 :03/09/14 17:36 ID:???
>>953 やっぱりも何もそんなこと初めからわかってる
香具師の気が静まるまで黙ってろ
>>953 あのな、荒らしのカキコに対してはレスアンカーつけないのが基本
結構初心者ですけど、 入力した文字を送信して その文字を表示させるのってどうやってやるの? 入力欄は名前やE-mailを入力する欄と同じに
しかし、内容見ると、洒落にならないかもしれないけど 本トの精神病患者かなにかかもしれなんな。<コピペ荒らし 書き込み時間も引き篭もりっぽいし。 他の言語信者のレベルじゃないよ。これを一緒にしたら他の言語信者に申し訳ない。
この馬鹿、なんで暴れ出したんだっけ?
960 :
:03/09/14 20:27 ID:???
さぁ、、 誰かが過剰にかまったんじゃないの
937もしっかりと削除されているw
>>958 いや、これは異常すぎるだろう。cronか何かでやってるんだろうよ。
964 :
* :03/09/15 00:04 ID:???
尻の穴が生意気な・・
幾ら無視しても精神病じゃこの粘着も無理ないな
どこが無視してるんだ?
ところで、俺は通例
>>950 を取った奴が次スレを立てるもんだと思ってたが、
今回は、
>>950 がアレだったので、そういう行動は期待できない訳で。
あれか? かわりに
>>960 くらいにやってもらうのがいいのか?
>>968 なぜまず自分から立てようとしないのか理解に苦しむ。
次スレは1ヵ月後に立てる。
>>962 ちゃんとセリフも的確に変わってるよ。cronなわけない。
>>959 確か、質問した(つもりだった)けど誰も答えてくれなかった(と思い込んでる)からじゃなかったかな。
日本語が意味不明で誰も質問の意味が分からなかったから答えようがなかった。
元々頭おかしいんだよ彼は。
もう削除依頼も止めておいた方がいいんじゃないか? どうもあぼーんになることを喜んでいるみたいだ。 透明削除してもらえるタイミングなら削除依頼、 そうでなければ放置というスタンスはどうか。
>あぼーんになること 「あぼーん」という表示になること 「あぼーん」レスが残ってしまうと「荒らせた」という満足感が出るのではないかと。
>>973 依頼してすぐに削除されるわけじゃないから透明になることはほとんどないと思う。
削除対象以降へのレスアンカーがあったら透明にはならないんだろ?(ずれるから)
「削除依頼はしない」に同意。
削除依頼することも荒らしの相手をすることになるよ。うざいと思ったら2ch専用ブラウザでも使って自分で削除。
依頼を続けるほうに一票 運用板で見かけたけどあまりしつこく繰り返している荒らしは 削除人から規制の依頼が出ることもあるようだし
>>979 $dst="Google検索「$2」;
どうでもいいけど$2はちゃんと値はいってんだろうな?
ごめん。 $dst="Google検索「$2」";
982 :
979 :03/09/15 10:27 ID:???
984 :
nobodyさん :03/09/15 11:11 ID:86NIgzh2
perl で print_hogehoge みたいな関数を定義します。 引数は 0 または 1 個で、0 個のとき標準出力に 1 個のとき引数の持つ名前のファイルに、 同一の内容を書き出します。 print (OUT "hogehoge"); として一緒に処理するためには、STDOUT を OUT に代入する(?)必要がありそうですが、 どうすればよいのでしょうか? よろしくお願いします。
985 :
984 :03/09/15 11:19 ID:86NIgzh2
とりあえず、STDOUT に出力するようにして、引数がある場合には、 open(STDOUT, "@_[0]); としたら、うまくいきました。 いいのかな?こんなんで。
986 :
984 :03/09/15 11:22 ID:86NIgzh2
いや、やっぱうまくいってないっす。 ファイルに書き出したい場合も、標準出力にでてました。 解決法探しています。よろしくお願いします。
>>984 sub print_hogehoge {
my $out = shift || '&STDOUT';
local *OUT;
open OUT, '>' . $out or error();
...
>>956 どこに送信したいのか良くわからんが、
-- HTML
<head><meta http-equiv="content-type" content="text/html; charset=euc-jp"></head>
<body>
<form action="./cgi-bin/output.cgi" method="POST">
<input name="name" value=""><input name="mail" value=""><input type="submit">
</form>
</body>
-- Script
#!/perl/bin/perl
use CGI;
$cgi = new CGI;
my $name = $cgi->param("name");
my $mail = $cgi->param("mail");
print <<"HTML";
Content-Type: text/html; charset=euc-jp
<head><meta http-equiv="content-type" content="text/html; charset=euc-jp"></head>
<body>
<dl><dt>名前</dt><dd>$name</dd></dl>
<dl><dt>メール</dt><dd>$mail</dd></dl>
</body>
HTML
これでどうだ?
989 :
984 :03/09/15 11:43 ID:86NIgzh2
解決しました。ありがとうございました。
>>990 漏れの、2chブラウザのレス番号がずれずれだったらしく、
書き込むまで、
>>957-987 の書き込みが読めなかったの。
すまんこ。
>>979 $dst='\'Google検索「\'.$1.\'」\'';
$url=~s/$src/$dst/ee;
組み込み関数のリファレンスはどうやって取得すればよいのでしょうか? my $print_direct = \print; # (1) my $print_wrap = sub { print(@_); }; # (2) &$print_direct("test", "\n"); # Not a CODE reference at ... &$print_wrap("test", "\n"); # OK やはり、ラップ(2)するのが適当でしょうか? 993 get
994 :
979 :03/09/15 14:05 ID:???
>>992 期待通りの結果を得られました。有り難うございます。
995 :
993 :03/09/15 15:03 ID:???
ageてみよう。
次スレ壊れてない?
透明あぼーんで11レスになったけど2chブラウザが検出しないな
subject.txtが更新されてないみたいだ 最近たまになるよな
>>993 無理にでもエイリアスを使いたいなら、Filter::Simpleでいけると思う。
(使ったことない。。)
なぜ使いたいかが分からないけど。
それはそうと 1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。