Perl コーディング初心者質問コーナー Part36
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/07/14 13:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0773nobodyさん
04/08/15 17:30ID:???@hozonに全部パスを入れとけアフォ
foreach(@hozon){
print "ok" if -e $_;
}
このクソアフォが!?
0775nobodyさん
04/08/15 17:37ID:???0776ぢおぢお
04/08/15 17:44ID:EbxomzZw0777nobodyさん
04/08/15 17:45ID:???if ( $a && $b && $c ){ print "これでよくね?w" }
それとも
if ( $a > 0 ){ if ( $b > 0 ) { if ( $c > 0 ) { print "天山ツームストン" } } }
にするか?いっそのこと
exit || exit;
でいいんじゃん?
0778nobodyさん
04/08/15 17:46ID:???0779nobodyさん
04/08/15 17:47ID:???0780ぢおぢお
04/08/15 18:01ID:YD+WDikbなりませんでした。
0782ぢおぢお
04/08/15 18:10ID:YD+WDikb0784nobodyさん
04/08/15 18:41ID:???foreachのように、毎回スカラにリストの内容を代入する
+
forのように$iに現在のループ回数を入れる。
みたいなことは不可能ですか?foreach側で使うのは keys %hash なのでforの$iとリンクさせる形での
処理はできません。
0785784
04/08/15 18:45ID:???ループ回数が一定の基準を超えると、発動する処理をしたいのです。
0786nobodyさん
04/08/15 18:49ID:???ダサいやつでいいなら
$i = 0;
foreach(@a){
処理〜;
print "2桁キター" if $i > 9;
$i++;
}
で一応できるよ。
0788nobodyさん
04/08/15 19:28ID:???a => 1,
b => 2,
c => 3,
d => 4,
e => 5,
);
@a = keys %data;
delete @data{@a[1..3]};
これが
$data = {%data};
の場合に
delete @data->{@a[1..3]};
としてもうまくいきませんが、何か方法はありますか?
0789黒死犬 ◆EgxBlf8nvc
04/08/15 20:17ID:???こうですね
0790nobodyさん
04/08/15 23:12ID:???read(STDIN,$$buffer,$ENV{CONTENT_LENGTH});
のようにすればできたのですが、いきなり$$bufferに代入するとおかしい気がするので(シンボリックリファレンス?なんか非推奨って読んだ気がします)
$buffer = \"";
read(STDIN,$$buffer,$ENV{CONTENT_LENGTH});
とかを考えてみました。
0791nobodyさん
04/08/15 23:37ID:???☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ ★
☆ 新規質問は名前欄・メール欄を空にして行え ☆
★ ★
☆ 質問者が返信する際は、名前欄に「最初に質問したレス番号」を入れろ ☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
0792nobodyさん
04/08/16 01:57ID:???0793nobodyさん
04/08/16 02:09ID:???こんなところか。
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ ★
☆ 新規質問は名前欄・メール欄を空にして行え ☆
★ ★
☆ 返信は名前欄に「最初に質問したレス番号」・メール欄に「sage」を入れろ ☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
0794nobodyさん
04/08/16 02:11ID:???0795nobodyさん
04/08/16 02:15ID:???☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ .★
☆ .☆
★ 右の星もちゃんと整列させてから書き込め .★
☆ .☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
0797nobodyさん
04/08/16 09:30ID:???ウザい質問者は徹底スルーが基本だって。
0798nobodyさん
04/08/16 09:52ID:f4GvLXd6qq{ INSERT tbl_name SET name="$hoge{name}" sex="$hoge{sex}" weight="$hoge{weight}" }
)
%hogeにはフォームから送られてきたクエリが格納されてます。
このようなSQLインジェクションをやる場合にXSS対策として、
foreach( keys %hoge){
$hoge{_} =~ s/"|'//g;
}
としてるのですが、これでXSS対策は万全でしょうか?とりあえず上のSQL文の場合、クォートさえ消しておけば
全部文字列として解釈されるので、おかしなことにはならないと思いますが、もしも穴がありましたら
ご指導願います。
0801798
04/08/16 10:49ID:???q{ INSERT tbl_name SET name="?" sex="?" weight="?" }
);
$sth->execute($hoge{name},$hoge{sex},$hoge{weight});
http://www.rfs.jp/sitebuilder/perl/dbi/02.html#プレースホルダとバインド値
ここを見ながらやってみましたが、これであってるのでしょうか?
後から結びつけることで、SQL構文になってしまうようなバインド値の場合にエラーを出して
executeしないんですかね?
0803nobodyさん
04/08/16 17:39ID:YMFVNVGstelnetにて正常動作したperlスクリプトをCGIとして動かすと
エラーになってしまいます。
ログをたどると以下のようになってます。
Can't locate CGI.pm in @INC (@INC contains:
/usr/home/xxx/usr/local/lib/perl5/5.8.4/i386-freebsd
/usr/home/xxx/usr/local/lib/perl5/5.8.4
/usr/home/xxx/usr/local/lib/perl5/site_perl/5.8.4/i386-freebsd
/usr/home/xxx/usr/local/lib/perl5/site_perl/5.8.4
/usr/home/xxx/usr/local/lib/perl5/site_perl
.) at /usr/local/etc/httpd/htdocs/board/index.cgi line 6.
BEGIN failed--compilation aborted at /usr/local/etc/httpd/htdocs/board/index.cgi line 6.
[Mon Aug 16 10:19:51 2004] [error] [client 138.243.201.4]
Premature end of script headers: /usr/local/etc/httpd/htdocs/board/index.cgi
で、不可解に思って、なんでCGI.pmがないんやろかと@INCのフォルダを
洗いざらい調べてみたら、なんときっちり存在しているのです。
なにか他に思いつく原因ってあるでしょうか?
ちなみにperl5.8.4です。
0805nobodyさん
04/08/16 17:59ID:???パーミッションは755です。ちなみに705にしてもエラーが出て、
上記のログがApacheのエラーログに追加されます。
またpmモジュールは読めさえ出来ればパーミッション関係なかったような。
ちなみにpmモジュールのパーミッションは444でした。
@INCの各パスとはどういうことでしょうか?
CGI.pmは/usr/home/xxx/usr/local/lib/perl5/5.8.4に確かに存在していました。
0807nobodyさん
04/08/16 18:29ID:???おかしくない?よくわからんけど。
0808nobodyさん
04/08/16 18:33ID:???/usr
/usr/home
/usr/home/xxx
/usr/home/xxx/usr
/usr/home/xxx/usr/local
/usr/home/xxx/usr/local/lib
/usr/home/xxx/usr/local/lib/perl5
/usr/home/xxx/usr/local/lib/perl5/5.8.4
これらディレクトリ自体のパーミッションが CGI の実行ユーザに対して
開いているか (読取及び実行権限があるか) ? という事。
0809nobodyさん
04/08/16 18:34ID:???一番疑われるのは、既出の通りファイルまたはディレクトリのパーミッションが
apache の実行権限で読めないようになってる、という可能性だが、
それじゃないなら、なんだろうなあ
まさか apache が実行時に chroot されてるとかか?
apache の管理人に相談した方がいいような気もする
0811nobodyさん
04/08/16 18:58ID:???0812nobodyさん
04/08/16 20:25ID:???cryptがサーバ対応してなくてMD5使えないもので、
ありましたら使い方等教えていただけますと幸いです。
0813nobodyさん
04/08/16 20:57ID:???http://search.cpan.org/search?query=MD5&mode=all
0815803
04/08/16 23:04ID:???問い合わせてみました、返答ですが
「本サーバは若干特殊でお客様のホームデレクトリが仮想ルートと
なっております。(だからホームの下に元々usrとかetcとかあるわけです)
@INCの値を/usr/home/xxx/usr/local/lib/perl5/5.8.4から
/usr/local/lib/perl5/5.8.4に書き換えれば動作します」
とのこと。@INCがおかしくてlib.pmにもアクセスできないのに
どうやって@INCを書き換えればよいのだろうか…。
0816nobodyさん
04/08/16 23:54ID:???use の仕組みを理解して lib.pm が何をしているか
読み解けばいいんじゃないか。
でもおじちゃんが君の勉強の機会を奪ってあげよう。
BEGIN { unshift @INC, '/usr/local/lib/perl5/5.8.4' }
0818nobodyさん
04/08/17 01:17ID:???これだな、うん。
0820803
04/08/17 03:32ID:???なるほど、@INCも所詮はただの配列だからスクリプト側で
勝手に追加すれってことですね。すこし効率悪いかなとも
思ってましたけど、いざ使ってみると1箇所追加するだけでも呼び出す
ライブラリ全部に反映されるみたいなので結構いい感じです。
ご教授ありがとうございます。
0821nobodyさん
04/08/17 13:03ID:???DispError("ERROR") if (判断式2);
$count++;
}
なんですが、
これは判断式1がtrueの場合DispError(ERROR)が発生するとして、
その後の判断式2はどうかかわるのですか?
0822nobodyさん
04/08/17 13:34ID:???http://www5a.biglobe.ne.jp/~n_rieko/perl/6.htm#6-7
0823nobodyさん
04/08/17 13:54ID:4w98o0dA始めたんだけど、文字列の変数展開で、
"$Foo->bar()"
みたいな事出来ないかな?
Rubyだと
"#{Foo.bar}"
という書き方が出来るんだけど。。。
0824nobodyさん
04/08/17 13:57ID:???"$Foo->{bar}"
$Foo->bar() はメソッド
0826821
04/08/17 14:01ID:???ありがとうございます、特殊な書き方なんですね。
0827nobodyさん
04/08/17 14:04ID:4w98o0dA>>825
0830nobodyさん
04/08/17 16:18ID:???printf "%s", $Foo->{bar};とか
print "", $Foo->{bar} . "";とか
いくらでも書き方はあるけど?
で、>>824に突っ込むなら、Class::Accessor使ってみたら?と。
0832nobodyさん
04/08/17 16:51ID:???ああ、あんまり使わないからわかんなかった。
漏れの場合は825の2つ目のを使うけど。
ヒアドキュメントを使う場って、長いHTMLとかSQLとか書くときがほとんどだけど、
前者はTemplate、後者はプレースホルダーとかsprintfとか使うから、
使うとしても、内部に変数を埋め込むことは少ないなぁ。
TMTOWTDIとすれ違いなのでここまでにしとく。
0835833
04/08/17 17:38ID:???は?どういうこと?
最近Web製作板で、ネオマスって言葉を質問してるやつがいて誰もわからなかったんだよ。
で、お前のアルファベットんp羅列も同じようにわかんねって話なんだが?
0836nobodyさん
04/08/17 17:43ID:???ぐぐればわかるよ。
まあ気にすんな。
時々、ああやって見慣れる言葉を書いて得意気になってる
いつものウンチクオタクだろうから。
0837832
04/08/17 17:44ID:???本気で思わなかったんだよ〜
There's More Than One Way To Do It.
Perlの標語だよ。発音はtim-todayらしいね。詳しく知りたかったらググってみそ。
0838nobodyさん
04/08/17 17:55ID:???0839名無しさん
04/08/17 19:11ID:s4X1hHlIメモリ上だけでやる方法教えてください。
あと、JavaのServletでインスタンスフィールド作ると
スレッドセーフじゃなくなって他のセッションの情報とか混ざっちゃたりするからダメ
みたいなそういう心配ってしなくても大丈夫ですか、Perlは?
0840nobodyさん
04/08/17 19:59ID:???無理。
mod_perlで変数を初期化しなければ・・・みたいなアクロバティックな
方法もあるけど、初期化しないという保証はないからお勧めできない。
PHPとかのセッション管理も実際はファイル書き込み以外の何物でもない。
後Servletは知らないけど、CGIのPerlならプロセスだから問題ない。
mod_perlだと、グローバル変数に適当にセッションの情報を放り込むと、
混ざらないとは言い切れない。
0842名無しさん
04/08/17 20:10ID:s4X1hHlIあと日本語が変でごめんなさい。
JavaのServletではそういうことやっちゃダメで
心配しなきゃなんないんだけど、
Perlでそういう感じの心配しなきゃならないとこってありますか?
ってことを書いたつもりでした。ごめんなさい。
0843nobodyさん
04/08/17 21:08ID:???プログラムで受け取っているのですが、変な文字化けを起こして
しまいます。
jcode::convert(\$form{text}, "euc");
ですと、$form{text}が「てすと」の場合は文字化けを起こさず、
「テスト」の場合は文字化けがおこります。
「テ」の場合は文字化けしません。
これを jcode::convert(\$form{text}, "euc", "sjis");
に明示的に指定すると、「テスト」の文字化けは直りますが、
今度は「てすと」が化けるようになってしまいます。
ループにはまってしまったので、質問させていただきました。
どうか宜しくお願いいたします。
0844843
04/08/17 21:21ID:???そのまえのフォーム受け取りルーチンに問題があったっぽいです。
スレ汚しすみませんでした。
0846798
04/08/17 23:56ID:b/+hcgJEプレースホルダを使用して、LIKE用に%と_をエスケープしておけばそれ以上サニタイジングは
何もしなくても安全ですか?
色々読んだところとりあえずそれで問題はないようなのですが、一応このスレのみなさんに
最終確認して自信を持ちたかったので投稿しました。
どうぞお願いします。
0848nobodyさん
04/08/18 16:37ID:FTnHFAXj$rule1 = rand 20;
$data1 = int($rule1) + 1;
#2番目の数字###############
$rule2 = rand 20;
if ($rule2 <= $data1) {
$rule2a = rand 20;
}
$data2 = int($rule2a) + 1;
ランダムで選んだ2つの数字を$data1より$data2のが大きな数字にしたいのですが
うまく動作しません、どうすればよいのでしょうか?
0849nobodyさん
04/08/18 16:41ID:???0850nobodyさん
04/08/18 16:51ID:???$rule1 = 1 + int rand 20;
do { $rule2 = 1 + int rand 20 } while $rule1 == $rule2;
$rule1 < $rule2 or ($rule1, $rule2) = ($rule2, $rule1);
print "$rule1 < $rule2";
0851nobodyさん
04/08/18 17:03ID:???得られる数値の分布は >>849 と >>850 で大きく異なるので
目的に合わせて選択されたい
0854846
04/08/18 18:50ID:???0856nobodyさん
04/08/18 21:48ID:???まあ完璧か?と聞かれるとそこまで自信が持てなくて返事ができなかったりする;
だってセキュリティ問題ってそういうもんだろ?後は↓こいつが見事な答えをだすんじゃないか?
0857nobodyさん
04/08/18 22:06ID:???まあいいけど。
SQLインジェクションが怖いのは、例えば発行してるのがSELECT文なのに
INSERTとかDELETEとかDROPとかCREATEとかそういうのを使われること。
そういう点では、プレースホルダ使えば”ほとんど”問題はない。
ただ、当然のことだが、SELECT * FROM some_table WHERE ? = ?
みたいなSQLを書いて、?にテーブルのカラム名を入れる〜みたいなのだとまずい可能性が高い。
つまり、数値だとか文字列をエスケープすると言う点ではいいんだけれど、
動的にSQLを作成し、なおかつその値をユーザーからの入力に任せるとダメ。
この辺りのチェックは絶対に必要になる。
それから、他人の情報を盗まれたり〜という点に置いての
チェックなんかも、ユーザーからの入力じゃなくて、セッション管理とかしないとね。
この辺になると、インジェクションというのとはちょっと違うけれど。
0858nobodyさん
04/08/18 22:27ID:???お前さ。2chで大丈夫だよといわれるだけで安心できるの? いくらでも逝ってやるよ。
それで完璧。絶対に大丈夫。
>>857
> 動的にSQLを作成し、なおかつその値をユーザーからの入力に任せるとダメ。
それは設計が悪い。
0859798
04/08/18 23:11ID:???>>857
注文を保存するだけのものなので、
INSERT tbl_name SET name=?
のような使い方しかしないつもりです。
>>858
2ちゃんでというか、自分でできる限り調べるのと+このスレの人の回答を
足し合わせると安心できます。
0860nobodyさん
04/08/18 23:16ID:???モジュール||ライブラリ なしで。
できるやつってすげえな。まあjcode.plの中身を見ちゃえばわかっちゃうけど、
見ないでわかっちゃうやつは
0861nobodyさん
04/08/18 23:26ID:???0862nobodyさん
04/08/18 23:29ID:???目で見ればわかる。なれた。
SJISをEUCのつもりでSJISに変換したのもわかる。
ただなぁコード書けって言われても・・・その、なんだ、困る
0863nobodyさん
04/08/18 23:44ID:???このABCを管理する為のperlプログラムDを作りたいと思っております。
具体的には
DにてABCを起動
ABCを監視し、終了したプログラムに対して再起動やログなどを残す。
プログラムの起動や終了状態を取得するには
system関数を使おうと思っているのですがsystem関数では一つの子プロセスが
終了するまで、親プロセスには制御が戻らないのでどうしたものかと
悩んでおります。
アドバイスなど頂ければ幸いです。
よろしくお願いします。
0864nobodyさん
04/08/19 00:02ID:???つーか戻り値ないsystemを使うのか・・・
0866nobodyさん
04/08/19 00:27ID:???0868857
04/08/19 01:23ID:EPjrU+Ei> それは設計が悪い。
その通り!
でも、そういうことを聞いてるんだと思ったんだが・・・
0869863
04/08/19 01:25ID:???http://66.102.7.104/search?q=cache:-1Ta6TXcnLcJ:naoya.dyndns.org/doc/perl_memo.txt+fork%E3%80%80pid%E3%80%80perl%E3%80%80waitpid&hl=ja&lr=lang_ja
ここが一番解りやすいように書いてくれてるのですが
systemとforkの使い方の流れみたいなのが今一理解できていません。
>>867さんが
system "A.pl &";
system "B.pl &";
system "C.pl &";
と書いてくれていますが、アホな漏れにもう少し補足していただければ幸いです。
書き忘れましたが
perlはActivePerl-5.6.1.635-MSWin32-x86.msi
win2000sp4です。
なのでフラッシュする必要はないと思うのですが・・あってますでしょうか。
0871863
04/08/19 02:38ID:???今調べていると
Win32システム用Perlで実装されていない関数
にforkが入ってました・・
>>870
>>不可能ではないが、どちらかと言うと、潔く諦めることをお勧めする
こう言うことでしょうか?
確かめる為に実際にforkを入れてみるとちゃんとプロセスが増えました。
dos窓がもう一つ増えるわけではありませんが、dos窓一つにperlプロセスPIDが
二つ。
本当はdos窓二つ、perlプロセス2つにしたいのですが。
forkは自分の分身を子プロセスとして作り出すのでDという管理プログラムを
使ってA、B、Cというプログラムを動かすには
Dのコードの中にABCのコードも含めて、子プロセスの場合はABCそれぞれの
ルーチンを機能させるみたいなことにしないといけないのでしょうか?
全く別のプログラムを起動させて、そのPIDを監視と言うか取得できる
方法があれば涙モノなのですがそう上手くはいかないようですね・・
0872nobodyさん
04/08/19 04:48ID:???http://search.cpan.org/modlist/Microsoft_Windows
■ このスレッドは過去ログ倉庫に格納されています