トップページphp
1001コメント371KB

Perlコーディング初心者質問スレ Part 49

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/05/31(水) 04:32:28ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0532nobodyさん2006/06/16(金) 17:46:42ID:???
#!/usr/local/bin/perl

use strict;
print "Content-type: text/html\n\n";
my $buffer;
read(\*STDIN, $buffer, $ENV{'CONTENT_LENGTH'},0);

print <<END;
$buffer
<form method="post">
<input type="text" name="111" value="&"><br>
<input type="text" name="222" value=""><br>
<input type="submit">
</form>
END
exit;

下のフォームに&amp;と入れて送信するとあら不思議。
同じような挙動をする文字を知りたいんですがどこかにドキュメントありませんか?
0533nobodyさん2006/06/16(金) 17:49:12ID:???
×<input type="text" name="111" value="&"><br>
○<input type="text" name="111" value="&&"><br>
0534nobodyさん2006/06/16(金) 17:49:56ID:???
ご、ごめんなさい><
◎<input type="text" name="111" value="&amp;"><br>
0535nobodyさんNGNG
ヒント:文字参照
0536nobodyさん2006/06/16(金) 18:16:46ID:???
スレ違い…と言おうと思ったけれど、深読みしてPerlコーディングの話と考えてみる。
$hogeにはブラウザから送られてきたのをデコードしただけの物が入っていて、
print <<END;
<form method="post">
<input type="text" name="hoge" value="$hoge"><br>
<input type="submit">
</form>
こんなことをやって、&が入っていたら&に変わっちゃう…とかいう理由での質問なんじゃないか。
HTMLに流し込む前に実体文字参照に変換汁。
$hoge =~ s/&/&amp;/g;
$hoge =~ s/</&lt;/g;
$hoge =~ s/>/&gt;/g;
$hoge =~ s/"/&quot;/g;
# というかこれを知らないなら、頼むから公開するCGIなんか作らないでくれよ…
# XSS脆弱、下手するとScript Insertion脆弱だから…
0537nobodyさん2006/06/16(金) 18:40:41ID:???
>>535
ありがとうございます!!
マークアップ記号、Laten-1、ラテン拡張とアクセント記号までは
&があっても直接変換されるようですね。

>>536
そうです、受け取り側での処理に影響するのか?という部分です。
ただし変換自体が問題ではなく、2回以上変換する場合が気になったんです。
というのもHTML::FillInFormの中で変換されてるっぽくて
先に変換かませるとひどいことに・・・
いろいろ試しているうちに上記の実態参照も考慮するべきか悩んだ次第であります。
05385362006/06/16(金) 19:30:41ID:???
>>537
スマソ、ちょっとレベルを低く見すぎた。しかしそういうことは初めに(ry
混乱してるだけだと思うが、そう悩むことではないと思うぞ。

まずCGI側がFormに流し込む、生のテキスト「&amp;」を持っているとする。
HTML::FillInFormは生のテキストをHTMLに変換する。「value="&amp;amp;"」
で、ブラウザはHTMLを解釈して元のテキストに戻してからフォームを表示する。[&amp;]
Submitされると"生のテキストを"URLエンコードなり何なりしてCGIに送り返す。「hoge=%26amp%3B」
で、CGIはURLエンコードのデコード処理をして、生のテキスト「&amp;」を受け取ることになるわけだ。

なぜに二回以上変換するようなことになるのかな…
0539nobodyさん2006/06/16(金) 19:51:08ID:???
>>538
非常に混乱しております・・・
2回以上の変換なんですが、実はTTのPluginでFillInFormを使ってるんです。
他で変換しないと生のデータとFillInFormで変換されたデータが混在してしまって。
TTのタグでひとつひとつFILTERつければ回避できそうではありますが
できれば一元管理したいなあと・・・。
クエリを受け取った段階で変換してみたらFillInFormで不具合。
TTに渡す時点で変換すれば良さそうですが、データ構造が結構深いんです・・・
0540nobodyさん2006/06/16(金) 23:41:05ID:???
>>516
perlはオブジェクト指向の書き方すると遅くなるのは当然。
「ハードの性能がどんどん上がってるからかまわない」なんて言い訳してるが、
簡単なスクリプトの時にperlでオブジェクト指向の書き方するのはやめたほうがいい。
みんなKENTをけなすが、実はKENTはそれほど悪くないのかもしれない。

こういうと、きっと「コードの再利用が...」「保守のしやすさが....」って言い始めるヤツが必ず出てくる。
でもあの程度の規模だと、動作速度以外にも、理解しやすさとか、動作に必要な条件を考えると
必ずしも悪いと言い切ることは難しいんじゃなかろうか?
0541nobodyさん2006/06/17(土) 00:24:46ID:???
> 理解しやすさとか、
どうやったらあんなコードになるのか理解できない。
0542nobodyさん2006/06/17(土) 00:25:29ID:???
このジョークのことかーっ
ttp://www.lri.fr/~filliatr/evolution

ごめんなさい。言ってみたかっただけです。
0543nobodyさん2006/06/17(土) 00:28:14ID:???
>>540
> perlはオブジェクト指向の書き方すると遅くなるのは当然。

デマですね。
0544nobodyさん2006/06/17(土) 00:29:58ID:???
デマであるというソースが欲しい
0545nobodyさん2006/06/17(土) 00:30:49ID:???
そもそも

> perlはオブジェクト指向の書き方すると遅くなるのは当然。

というソースが欲しい。
0546not 5402006/06/17(土) 01:52:07ID:???
ダミアン・コンウェイ著オブジェクト指向Perlマスターコースのはじめにかな?
んー、でも、それほど問題になる部分じゃないと思う。
0547nobodyさん2006/06/17(土) 01:55:18ID:???
>>545
残念ながら、実行速度に関してだけは >>540 が正しい。

ダミアン・コンウェイの「オブジェクト指向Perlマスターコース」の「はじめに」のvii ページ
「オブジェクト経由でメソッドを呼び出す処理は、通常のPerlサブルーチンを呼び出す場合より著しく低速である」
(「著しく低速」の部分は太字で強調)

手軽に確認するなら
perldoc perltoot
if you wanted fast, you wouldn't be using objects at all

ベンチマークだったら
http://psst.jp/syn/archives/000190.html

オブジェクト指向は遅いというのは共通認識だと思っていたのだが。

だがオブジェクト指向は実行速度を上回るメリットがある。
0548nobodyさん2006/06/17(土) 02:06:34ID:???
自クラス AUTOLOAD
親クラスのサブルーチン
親クラスのAUTOLOAD
UNIVERSAL のクラスのサブルーチン
と探すんだから多少は遅くなるのは仕方がない
0549nobodyさん2006/06/17(土) 02:07:45ID:???
>>547
オブジェクト指向型プログラミングがバカみたいに遅いのは
インタプリタ言語特有の問題だな

コンパイルすれば、かなりその差はちぢまる
0550nobodyさん2006/06/17(土) 02:31:10ID:???
>>549
でも結局は遅いんでしょ?
0551nobodyさん2006/06/17(土) 02:34:36ID:???
>>547
メリットって何?
改造したり再利用しないし。
速いならそれでいいじゃん。
0552nobodyさん2006/06/17(土) 02:52:44ID:???
>>551
お前はしないのかもしれないが、他の人間はするんだよ。
第一、スクラッチから書く人間の労力だって圧倒的に違う。
0553nobodyさん2006/06/17(土) 03:20:47ID:???
>>550
うまく作れば 気のせい 程度にはなる
0554nobodyさん2006/06/17(土) 04:45:08ID:???
>>540
そそw
いきなりメソッド呼んで、このメソッドはどのファイルにあるのかな?
これかな?誤爆。。なんて事をするくらいなら、1枚板のKENTの方が
改造なんかも手早くやりやすい。
しかもダメと叩かれる部分を修正してやると、さらに体感速度が上がるのも
教材に適してるような…w
0555nobodyさん2006/06/17(土) 05:44:41ID:4rge2G1J
しかしそれで複数メンバーでの開発には適さない。
どこになにがあるのかを説明するより、モジュールリストを共有するほうが効率がいい。
今はひとりでやってるからいいかもしれないがちょっとは先を見ることを勧める。
体感なんてそんな変わらんから、規模の大きい開発の手間のほうが重要。
0556nobodyさん2006/06/17(土) 05:45:31ID:4rge2G1J
ごめんねパパ酔ってるからごめんね
0557nobodyさん2006/06/17(土) 06:31:48ID:???
>>547 のURLのベンチは面白かった。



まあ、なんていうか、
それ以外に、

オブジェクト指向では、use とか require したときの速度が遅いのが結構ネックでな。
mod_perl はその時間が減るからいいんだけど。



関数呼び出しが 1.5倍遅い、とか言っても、
それ自体は 1秒間に 45万回 か 64万回 かって違いで、ほとんど気のせい程度の時間でしょ。
問題は何回も実行する、例えば値を取得する param() 呼び出しとかなんだろうね。
それでも param() 程度なら 1000回実行して 0.01 秒か 0.002 秒の違いなんだけど。

つまり、OOPが悪いっていうけど、require とかの時間を考えなければ、そーそー体感で変わるもんじゃないと思う。
実際は他のトコで無駄省いたりして速くするようにすれば、そっちのが変わりそうだよね。
0558nobodyさん2006/06/17(土) 06:33:38ID:???
なぜか改行が増えてる orz
Jane で書き込むとたまにこうなるんだよなあ・・・。 スペース無駄にしてスマソ。
0559nobodyさん2006/06/17(土) 07:01:46ID:???
自称KE○Tよりまともってスクリプトを拾ってきて展開してみると
作者が再利用しやすいってだけの分割されたスクリプトファイルが
20〜30個って事が結構あるぞ?
しかもKENT製を静的なページを表示するのと同じレベルで実行できる環境で
実行してみると多少の引っ掛かりを感じる。
しかもファイルが分割されてるのにpackageはmainのままだったりするから、
mod_perlで修正することなく動いてもファイルシステム上の位置が変わると
別キャッシュになってメモリを馬鹿食いに。
0560nobodyさん2006/06/17(土) 07:12:57ID:???
> スクリプトファイルが20〜30個
> ファイルが分割されてるのにpackageはmain

全然まともなスクリプトじゃねえよw さすが自称www
0561nobodyさん2006/06/17(土) 07:54:09ID:???
>>559
こう言う人たまに見かけるよね。
ファイルを分割したりモジュール使うことがオブジェクト指向だと思ってる人。
他にも sub 使えば関数指向だと思ってる人とかさ。
0562nobodyさん2006/06/17(土) 09:33:44ID:???

正規表現について質問です。

たとえば、 'abc' 以外の全ての文字にマッチする場合はどのように書けばいいでしょうか。

acb にはマッチします。
abcaa にもマッチします。
aaabc にはマッチしません。


m演算子の真偽の逆転ではなくて、正規表現内で解決する必要があります。
0563nobodyさん2006/06/17(土) 09:47:34ID:???
前方一致 とかでぐぐってみたら。
/.(?!abc)/ こういうのね
05645622006/06/17(土) 10:01:24ID:???
>>563
前方一致とかじゃ無理な気がする…って思ってたけど、できるんですね。すんません。
なんか正規表現超苦手です。。。頭いたくなるぜ。

/^(.(?!abc))+$/

まだ試してないけどたぶん大丈夫な予感です。ありがとうございますた。
0565nobodyさん2006/06/17(土) 10:05:24ID:???
>>564
まあ /^(.(?!abc))+$/ だと 文字列の最初が abc だとマッチしちゃうけどね。なんとかがんばって。
0566nobodyさんNGNG
正規表現ってか…これってPerlの独自拡張じゃなかったっけ
0567nobodyさん2006/06/17(土) 12:38:20ID:???
Catalyst(+TT)に慣れると楽で戻れないが、これをCGIで毎回
キックするのはムリなのは確かだね。必要なファイル読むだけで
しばらくかかるし(笑) レン鯖でCGIしか使えない人は残念でした。
0568nobodyさん2006/06/17(土) 15:58:17ID:YHZ73bls
なんか暇つぶしに遊びプログラムで作ろうかと。
あんまり複雑なのだと遊びじゃなくなるので。

15分くらいで作れる、簡単だけど面白いのってなんかないかな。
アイデアくだなさいあな。
0569nobodyさん2006/06/17(土) 16:00:34ID:???
>>568
tropyクローンなんかどう?
0570nobodyさん2006/06/17(土) 16:03:45ID:YHZ73bls
>>569
なんですかそれ?
ちょっと検索してみますよ。
0571nobodyさん2006/06/17(土) 16:03:46ID:???
>>569
うちもそれ思ったw
でも 15分で作れるかなあ。>>568がんば。
0572nobodyさん2006/06/17(土) 16:06:57ID:YHZ73bls
なにやら難しそうな。
以前にショッピングカートを作ったんです。
もう覚えてないのでそのレベルでさえ遊びにならない。

すごい低級になるんですが、低級なりの楽しみ方がないかなと。
少しづつ拡張できるようなのでもいいかなと。

う〜ん。スレ違いっぽ。とりあえずこれにて書込みはおしまいにします。
何かアドバイスが見には来ますのでありがたく。
それでは。
0573nobodyさん2006/06/17(土) 18:17:27ID:???
tropyクローン なら、はてなおやのがあるじゃん。
書き方おかしいけど。
0574nobodyさん2006/06/17(土) 20:51:25ID:???
ハテナオヤのはCatalyst使うじゃん。インストール面倒だよ。
結城のオリジナルのクローンを書くほうがほうがシンプルだし勉強目的にはちょうどいい。
0575nobodyさん2006/06/17(土) 21:20:25ID:???
> ハテナオヤのはCatalyst使うじゃん。インストール面倒だよ。

そうなの? CPAN コマンドで簡単に入ったんだけど。
0576nobodyさん2006/06/17(土) 22:42:28ID:???
質問ー。
外部モジュールを使わないで UTF8フラグをつけたり、ついてるかどうか検査したりするのってどうしたらいいんですかね?

どっかに誤爆したのは内緒w
0577nobodyさん2006/06/17(土) 22:55:42ID:???
>>576
utf8::*はそもそも外部モジュール不要
utf8::is_utf8
0578nobodyさん2006/06/17(土) 22:58:03ID:???
>>576
言い忘れ。utf8::以下についてはテンプレの[Perl5.8Unicodeメモ]参照
utf8プラグマと混同しないように。
0579nobodyさん2006/06/17(土) 23:03:30ID:???
>>577
え、まぢで? v5.5 とか 5.6 でもできる?
ピンクのサイトの方は見てたんだけど、v5.8 だったkら・・・
0580nobodyさん2006/06/17(土) 23:17:27ID:???
v5.5てのが5.005のことだとすると、まだutf8関係の機能が入る前だから
そもそもutf8フラグはありません。
0581nobodyさん2006/06/17(土) 23:42:47ID:???
>>580
ううーん、そうなのか・・・。
情報ありがとうー。
0582nobodyさん2006/06/18(日) 02:12:27ID:LFB3TFsx
$LOGPATH = './logs/';# ログ保存ディレクトリのパス
$EXPIRES = 3;# アクセスログ保存期間
# 日時の取得
$tm = time;
($sec, $min, $hour, $mday, $mon, $year) = localtime($tm);
$year += 1900;
++$mon;
# アクセス情報の整形
$ln = "$hour\t$min\t$ENV{'REMOTE_HOST'}\t"
. "$ENV{'HTTP_REFERER'}\t$ENV{'HTTP_USER_AGENT'}\n";
# ログファイルの書き込み
$logfile = sprintf(
"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
open(FILE, ">>$logfile")
or die("エラー:ログファイルが開けません");
eval{ flock(FILE, 2) };
seek(FILE, 0, 2);
print FILE $ln;
close(FILE);
# 古いログファイルの削除
$tm -= $EXPIRES * 60 * 60 * 24;
($sec, $min, $hour, $mday, $mon, $year) = localtime($tm);
$year += 1900;
++$mon;
$delfile = sprintf(
"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
if(-e $delfile) {
unlink $delfile;
}
0583582 5832006/06/18(日) 02:13:02ID:LFB3TFsx
>>582のプログラムで
$delfile = sprintf(
"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
となぜ形成してるんでしょうか??
消すためにはいちいち作らないとだめなんでしょうか??
これを消したとしても$logfile にログは残るんじゃないでしょうか??
0584nobodyさん2006/06/18(日) 02:38:28ID:???
>>583
$logfile と $delfile はファイル名が違う。

$logfile は新規のログのファイル名
$delfile は何日か前のログのファイル名

コメント読もうよ。
> # 古いログファイルの削除
とあって、
> $tm -= $EXPIRES * 60 * 60 * 24;
で数日前の日付を出してる。
05855832006/06/18(日) 03:08:41ID:Kocek/q+
いやそれはわかるんですが
古いファイルを作ってなぜまた消すんでしょうか?
0586nobodyさん2006/06/18(日) 03:11:44ID:???
> 古いファイルを作ってなぜまた消すんでしょうか?

どこで古いファイルを作っていることにしたいんだろう。
0587nobodyさん2006/06/18(日) 03:16:15ID:Kocek/q+
>>583の最初の行です
0588nobodyさん2006/06/18(日) 03:17:00ID:???
> >>583の最初の行です

って、

> >>582のプログラムで

これ?
0589nobodyさん2006/06/18(日) 03:23:31ID:???
ファイルを作るのとファイルの名前を作るのを近藤してるとか?
0590nobodyさん2006/06/18(日) 03:24:41ID:???
それにしてもそのスクリプトだと、”チョウド3日”目にアクセスされないと
不要なログファイルがドンドン溜まっていきそうな気が・・・
05915832006/06/18(日) 03:38:10ID:Kocek/q+
>>588
いえ二行目です
>>589
そうなんでしょうか?
>>590
そうなんです
このスクリプトは
0592nobodyさん2006/06/18(日) 03:57:55ID:???
$delfile = sprintf(
"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
で3日前のファイル名を$delfileに入れている。
unlink $delfile;
で3日前のログファイルを実際に消している。

>>$logfile にログは残るんじゃないでしょうか??
それはその日のログなので残してOK
0593nobodyさん2006/06/18(日) 07:30:51ID:???
なぜ、連想配列の連想をhashというのでしょうか

あ、hashが先か
なぜhashを連想と訳すのでしょうか

どうして? 細切れ=連想なの? 教えて!
0594nobodyさん2006/06/18(日) 09:14:10ID:???
現在は連想とは呼ばない罠
あと正確には 連想配列=hash変数 ではない。
0595nobodyさん2006/06/18(日) 11:00:31ID:???
まじ? じゃあ今はなんと呼ぶのがトレンドなの?
0596nobodyさん2006/06/18(日) 11:21:18ID:???
まあ、連想配列でも間違いではない気がするけどなあ。
perl の連想配列は内部でハッシュ法が使われているからだろうけど、
配列みたく入れた順番に取り出せないし、みんな区別して ハッシュ って呼ぶ気がする。
0597nobodyさん2006/06/18(日) 12:02:53ID:Kocek/q+
>>582ー583のもんです

>>582ー592まで質問してたんですが
古いログはlogsというファイルに残ったままにならないんでしょうか?
0598nobodyさん2006/06/18(日) 12:13:01ID:???
>597
>584-592を百回読み直せ。それでも理解できないようならとっとと市ね。
0599nobodyさん2006/06/18(日) 12:16:51ID:Kocek/q+
死んできます
0600nobodyさん2006/06/18(日) 17:41:34ID:???
質問があります。

ファイルから文章を読み出して正規表現でマッチングしようとしてるんですが
「ー」文字が入る単語をマッチング条件とするとエラーがでてしまいます。
-wcコマンドで実行するとSyntaxOKとでてます。
perlのバージョンは5.8.8です。


$word = 'マリオブラザーズ';
while (<INPUT>) {
if (/^\.([^\n]+),$word\./){
〜〜〜〜〜
}
}

読み込みファイルの内容
.data1,data2.
.任天堂,マリオブラザーズ.
.ああああ,えええええ.




前後についてる..は正規表現を使いこなせない証でしょうか…マッチングするために付加しています。
これで任天堂を$1で取り出したいんですけど$wordに「ー」含んだ単語設定すると
以下のようなエラーがでます。data2、ええええを入れた場合は、意図した通りにdata1とああああが$1に入ります。

C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin>perl search.cgi
Unmatched [ in regex; marked by <-- HERE in m/^\.([^\n]+),マリオブラザー <-- HER
E ズ./ at search.cgi line 43, <INPUT> line 1.

原因がまったく分からず困っています。どなたかご教授下さい。
0601nobodyさん2006/06/18(日) 17:42:09ID:???
EUCでやれ
0602nobodyさんNGNG
\Q\Eでも入れとけ
0603nobodyさん2006/06/18(日) 17:52:27ID:???
文字コードの違いが問題のようですね
参考になりそうなサイトをいくつかググって探せたので、調べながら頑張ってみます。
ありがとうございました
0604nobodyさん2006/06/18(日) 18:24:16ID:???
HTML作成したアンケートフォームから送信したキーとデータを
ハッシュに格納してそこからCSVに出力したいのですが、
ハッシュからキーとデータをCSVに出力すると順番がランダムになってしまいます。
キーとデータを自分の意図した順番通りにCSVに出力するにはどうしたらいいのでしょうか?
sort関数を使用しても辞書順にしかならないので、意図した通りの順番で
CSVに出力することが出来ません。

どなたかアドバイスをください。よろしくお願いします。l
0605nobodyさん2006/06/18(日) 18:27:52ID:???
>>604
1. 並べたい順にキーを並べた配列を作る
2. 1. の配列をforeach か何かで回してハッシュを引く
3. CSVに出力

06066042006/06/18(日) 18:31:47ID:???
>>605
即レスありがとうございます。
試してみます。
06076002006/06/18(日) 19:21:32ID:???
>>601,602
フォームからcgi起動してフォームから送られた単語に基づいて検索するサイトを作ってたんですけど
アドバイス頂いた事を元に、cgiとHTMLフォームのソース、検索元csvファイルをEUC-JPに変換したらうまくいきました。

初歩的な質問だったようですけど、お答えいただきありがとうございました。
0608nobodyさん2006/06/18(日) 20:05:50ID:???
>>607
ユーザ入力をメタキャラクタも含めてそのままパターンに取るような CGI を晒しておくと、イイカンジにアッー! されて色々と被害をまき散らしたりするんで安全性について要再考。取り急ぎ。
0609nobodyさん2006/06/18(日) 20:27:30ID:???
>>608
気をつけます。調べてみたんですが、

つまりデータとしてとりたい文字列がperlプログラム上で特別な意味を持つ文字になってしまって
プログラムが意図しない動作をする可能性があるってことですよね
0610nobodyさん2006/06/19(月) 12:44:33ID:???
>>593
連想配列(associative array)をラリーウォールが勝手にhashと名づけた。
けど、それに賛成できない訳者がそのまま連想配列と訳した、とか?
0611nobodyさん2006/06/19(月) 14:25:24ID:???
>>610
をいをい、あんまり勝手な事言わんでよ。
逆なら分かるけど。
0612nobodyさん2006/06/19(月) 14:36:59ID:???
、とか?
、とか?
、とか?
妙な推測するほうもアレだが
釣られるほうもアレ。
0613nobodyさん2006/06/19(月) 14:37:54ID:???
>>612
ヒント:おまえも釣られてる
0614nobodyさん2006/06/19(月) 14:38:47ID:???
アッー!
0615nobodyさん2006/06/19(月) 14:40:28ID:???
以上自演でしたまる
0616nobodyさん2006/06/19(月) 15:13:28ID:???
ファイルを開くときは

open(FILE, "$file") or die "エラーだ";

みたいな感じでdie使うもんだと思ってて深く考えたことなかったんだけど
これって、何かモジュール入れてないとエラーメッセージは表示できない?
単にInternal Server Errorが返されるだけなんだけど。
0617nobodyさん2006/06/19(月) 15:15:58ID:???
>>609
理解の方向性は合ってます。ただ危険性のレベルは一般にもっと高いです。
特に Perl の場合、値をそのままパターン内で展開する、ということは「任意のコードが実行できる」と同義なので大変危険です。
0618nobodyさん2006/06/19(月) 15:17:21ID:???
>>616
そういう問題じゃないんだけど…。
エラーメッセージはサーバのログに吐かれてる。
ブラウザに出したいなら自前でエラー処理書いて、dieじゃなくてexitする。

ちなみにその$fileをダブルクォートで括る必要は全くない。
0619nobodyさん2006/06/19(月) 15:32:57ID:???
>>618
あぁ、なるほど。die以下のメッセージはサーバのログに出てるだけだったのか。
じゃあ、レンタルサーバで不特定多数が使うcgiの場合には
dieより自前で用意したエラー処理に飛ばす方が良いってことか。

>ちなみにその$fileをダブルクォートで括る必要は全くない。
でも、シングルクォートとかダブルクォートとかで括ってるの多い気ガス。
単に好みの問題?
0620nobodyさん2006/06/19(月) 15:35:50ID:???
>シングルクォートとかダブルクォートとかで
oioi
0621nobodyさん2006/06/19(月) 15:36:41ID:???
>>617
漏れも先日までそう思ってたんだがな、実際にやって見れ。
安全措置が施されていて、use re 'eval';しないとデフォルトでは動かないんだこれが。

まあ、汚染された正規表現を実行するなんて真似は、やっぱり止めておいたほうが良いのは確かだと思うけれど。

>>619
とりあえず公式にも非推奨。
ttp://www.kt.rim.or.jp/%7Ekbk/perl-5.8/perlfaq4.html#what_s_wrong_with_always_quoting__vars
これをわきまえた上で、好みをとりたいと言うのであれば何も言うまい。
0622nobodyさんNGNG
ヒント: use CGI::Carp qw(fatalsToBrowser);
0623616=6192006/06/19(月) 15:49:01ID:???
大変勉強になります。しかも即レスだし。

>>621
なななるほど。そう言われてみれば、そうだ。
とりあえずダブルクォートで括ってみた。
中身は何でも良かった。今は反省している。

>>622
標準装備にそんなのあったんだ。
で、実際のところdieで>>622のモジュール使うのと
自前でエラー処理用意して飛ばすのと、
どっちが一般的なんだすか?
いや、それこそ好みの問題かもしれないけど。
0624nobodyさん2006/06/19(月) 15:52:21ID:???
恐ろしい子っ!!
0625nobodyさん2006/06/19(月) 15:54:57ID:???
>>623
CGI.pm を使う書き方をしてるのであれば、>>622 で良いんじゃないかな。
die のメッセージをHTMLで吐いてくれるし。

ただし、エラーがあってdieしてもHTTP的に50x系のエラーにならないのと、
デバッグが終わったら >>622 は外さないといけない事に注意。
エラーメッセージを見せるのは、セキュリティー的によろしくない。
06266162006/06/19(月) 16:05:52ID:???
>>625
アドバイス感謝です!
>エラーメッセージを見せるのは、セキュリティー的によろしくない。
言われてみればグレート当たり前のことだよね。でも、この視点完全に欠落してた…。
フォームの入力値のエラーなんかと同様に、エラーだったら何でもかんでも
ブラウザで教えてあげるのが、イケてると思ってた…。

ここは本当に恐ろしい知識の泉でつね。
オレ、今、かなり賢くなってる。
0627nobodyさん2006/06/19(月) 16:06:51ID:???
要するに最初からエラー処理用意しとけと。
0628nobodyさん2006/06/19(月) 16:12:56ID:???
$SIG{__DIE__} とかを書き換えて $! 表示して exit
0629nobodyさん2006/06/19(月) 16:21:34ID:???
>>593, 610

danのblogでも少し前に話題になってたと思うんだけど(探すの面倒くさいんで自分でやってね)、

Perl4まではPerlでも連想配列 (Associative Array)と呼んでいた。
連想配列という言葉は、この「Associative Array」という語に
対応したもの。この時点ではハッシュは関係ない。
PerlのAssociative Arrayは直接には awkのそれからきたものだと
思われるけど(awkでも Associative Array = 連想配列と称される)、
多分 IconとかSnobolの表が祖先じゃないかと思う。

で、Perl5.000になった時点で、Larry Wallが「Associative Arrayってさ
長いから書くのも読むのも面倒じゃん、Hashって呼ぶことにしようよ」
ということで呼称がハッシュに変わったのね。で、それはAssociative Array
を実現するのにハッシュ法を使っていたから。

Programming Perl (第一版 赤本ね)には実際次のような記述がある(訳本の37ページ)。

1.5 連想配列
この章の最後を締めくくる話題は連想配列(associative array)である。
(略)
連想配列は、添え字として任意の文字列を指定できるという点を除けば、
普通の配列と何ら変わらない。連想配列から得られたエントリは文字列で
あってもよいので、任意の文字列の対をたがいに関連づける(associate)ことが
可能である -- これが連想配列(associative array)と呼ばれる理由である。


呼称をハッシュに変えた理由も、Programming Perlの第二版(青本の分冊になっていない方)に書かれていたと思うんだけど、本が見つからなかったので
紹介できん。スマン。


06306162006/06/19(月) 16:53:42ID:???
open(FILE, $file);
は通るけど、
open(FILE, +< $file);
はダメなんだね。入出力の記号を付けるときはダブルクォート必須?
なら、
open(FILE, $file);

open(FILE, "< $file");
と同じだから、やっぱ
open(FILE, "$file");
と書くのが正しいんじゃね?とか思ってしまうんです。
それとも記号の付け方がおかしいのか??
そこんとこもう少しヒントを!
0631nobodyさん2006/06/19(月) 16:56:54ID:???
>>629
Programming Perl(第二版:青らくだ本)の日本語版8ページから引用

1.2 自然言語と人工言語
ハッシュ:ハッシュ(hash)は、順序付けられていないスカラーの集合で、
各スカラーに関連付けれれた文字列によってアクセスされる。
そのためハッシュは「連想配列」(associative array)と呼ばれることもある。
しかし、これは怠惰なタイピストにとってタイプするのが面倒だし、
頻繁に使われるので、私たちはもっと短くて、ぴりっとした(snappy)呼び名を
付けることにしたのだ。

ということらしい。
0632nobodyさん2006/06/19(月) 17:15:39ID:5NRkvew2
メールフォームにBBQを組み込んでいるのですが
昨日みたいに2ちゃんが落ちるとCGIが止まってしまいますよね?
落ちてる時の回避方法ありますでしょうか。。。

sub checkProxyList{
my $RADDR = $ENV{'REMOTE_ADDR'};
$RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
my $query_addr = "$4.$3.$2.$1.niku.2ch.net";
my $addr = join('.', unpack('C*', gethostbyname($query_addr)));
if ($addr eq '127.0.0.2'){print_error("PROXY ERROR")}
}
■ このスレッドは過去ログ倉庫に格納されています