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

【Perl】初心者コーナー Part13

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/05/30 13:06ID:R2kt1mTx
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0409nobodyさん02/06/26 09:25ID:???
>>408
use IO::File;

my $fh = IO::File->new( $filename ); ## open()と基本的に同じ
print $fh "foobar\n";

のどこが面倒くさいのだろうか。少なくともグロブがなんちゃらとか
考えるよりかはるかにシンプルだと思うんだけどな。大体perldoc perlref
を読んでる暇があるのにperldoc IO::Fileが面倒くさいのもわからんし。

まぁ使いたくなかったらそれはそれでいいんだけど。素直に使ったほうが
楽だし、そのほうがPerl コミュニティのカルチャーにそってると思う。
041040402/06/26 09:37ID:???
>>408
print関数の第1引数は、シンボルでもスカラ変数でもない場合は
ブロックに入れないと構文エラーになるよ。(昨日覚えた)
print {*$stdout} "test\n";

>>409
ほっといてくれー。こういう瑣末なことを調べるのが趣味なんだよー。
たぶん408の人も、おれと同じタイプ。
あ、もちろん実際にスクリプト書くときは素直にIO::File使います。
0411nobodyさん02/06/26 12:14ID:???
>>410
ああまぁ趣味のスクリプトとかならいいんですけどね。
プロダクションコードでそういうのを見たくないのでとりあえず
牽制した、ということで。
0412nobodyさん02/06/26 15:38ID:1ADBKX33
自分でちまちま作ったCGIを公開しようと思ってるんですが
(公開といっても使うのはネットの仲間だけ)これだけはしちゃイカン!って
処理とかあるんでしょうか?cgiのバグでunixコマンドを打てるとかっていうのが
気になるんですけど。
0413 02/06/26 15:49ID:???
>>412
>cgiのバグでunixコマンドを打てる
とんでもないのがあるじゃねーか!
0414nobodyさん02/06/26 15:50ID:???
>>412
-Tスイッチをつけないで実行しちゃいかん。

何をすべきでないのかわからないなら、これは必須。
0415nobodyさん02/06/26 16:55ID:???
#!/usr/bin/perl -UX
0416nobodyさん02/06/26 17:29ID:ZfGn23SZ
>>414
>>412じゃないんですが -T スイッチってどんなものなんでしょう?

-wスイッチはつけるようにしてるんですけど -T スイッチは見たことがありませんでした・・。
041741602/06/26 17:36ID:ZfGn23SZ
あっ調べてみたらありました。
http://tech-web.net/perlmania/perlrun2.html
汚染チェックをオンにするとか書いてますけど、なんだろう・・?
つけておいたほうがいいのかな。
0418nobodyさん02/06/26 17:39ID:???
罵倒覚悟で聞きます
Perlで2chのDAT直読みは無理なんでしょうか?
User-Agent: Monazilla/1.00 (toolname/ver) ←こうゆう風にしても
無理なんですけど、、。
0419nobodyさん02/06/26 18:17ID:???
Accept-Encoding: gzip
は?
0420nobodyさん02/06/26 18:26ID:???
別に罵倒するつもりはありませんが、普通に取得できましたが・・・
URLが間違ってるとかそこら変チェックした方がいいかと思います。

#!/usr/bin/perl
use LWP::UserAgent;

my $ua = new LWP::UserAgent;
my $request = new HTTP::Request('GET', 'http://pc.2ch.net/php/dat/1022731565.dat');

$ua->agent('Monazilla/1.00 (libwww-perl/5.65)');
$response = $ua->request($request);
print $response->as_string;
042141802/06/26 18:37ID:???
>>420
謝謝、
URLが間違ってたみたいです。
Perlでは規制がかかってると思ってあきらめてたんですが、、よかった。
042241202/06/26 18:50ID:1ADBKX33
>>414
1行目を#!/usr/bin/perl -T にするって事でしょうか?
unixコマンドを打てる、というバグを発生させないためにはどうすれば
どんな点に注意すればいいんでしょう?
バグというか、何も対策してないcgiだとアドレスのcgi-bin/xx.cgi?の後ろに
いろいろへんなのを入力するとunixコマンドを打てるとかいうバグがある話を
聞いたんですが。
0423nobodyさん02/06/26 18:58ID:???
>>422
あなたきもい
0424nobodyさん02/06/26 19:25ID:???
>>422
いっぱい情報あるから検索すれ。キーワードは「脆弱性」「CGI」等。
0425fusianasan02/06/26 19:28ID:???
>422
要は、ブラウザ側で入力された値をチェックしないでそのまま以下のような
関数に渡さなければいいだけ。

open
exec
system
qx//
eval
``
0426nobodyさん02/06/26 19:47ID:CyvQGqzW
grepもマズーじゃねーの?
0427nobodyさん02/06/26 20:55ID:???
>>422
そのほか、クロスサイトスクリプティングにも注意。
たとえば、User-agentを内容をチェックせずにそのまま出力しちゃだめ。
ttp://www.ipa.go.jp/security/awareness/vendor/programming/a01_02.html
0428nobodyさん02/06/26 23:02ID:???
バグじゃないだろ…
0429nobodyさん02/06/26 23:13ID:???
>Unixコマンド実行
それがバグだったら世界中のPerlUserが嘆くことになるな。
0430nobodyさん02/06/27 01:16ID:riwIozkn
質問です。

$a = '&xyzあいうえお<A href="http://www.xxx.com">リンク</A>';

$a =~ s/&[^lt;|^gt;]/&/g;

こんな感じで文字列の < と > 以外の & を & に置換したいのですが、
上のようにすると & の次の文字(ここでは x)が消えてしまいます。
どうすれば &xyz とすることができるでしょうか?
043142902/06/27 01:19ID:riwIozkn
あぁ・・失敗したのでもう一度かかせてください・・

$a = '&amp;xyzあいうえお&<A href="http://www.xxx.com"&>リンク&</A&>';

こんな感じで文字列の &< と &> 以外の & を &amp; に置換したいのですが、
上のようにすると & の次の文字(ここでは x)が消えてしまいます。
どうすれば &amp;xyz とすることができるでしょうか?
0432nobodyさん02/06/27 01:19ID:???
$a =~ s/&([^lt;|^gt;])/&amp;$1/g;
0433nobodyさん02/06/27 01:21ID:???
ちなみに、どっちにしろこれじゃあ思う通りの効果はえられないと思う。
0434430と43102/06/27 01:22ID:???
>>432
うわ〜〜〜もうお答えいただきました(´∀` )ノワーイ!
ありがとうございます。ちゃんとできました。
0435nobodyさん02/06/27 10:09ID:???
>>432
それって違うと思うけど・・・

$a =~ s/&(?!=lt;|gt;)/&/g;

じゃないの?[]で囲んだらcharacter classになっちゃうじゃん。
432の正規表現では&のあとの文字がg,l,t,;,|,^だったら&
に変換されないぞ(例:&lz; &gxcv; &;;; )
0436nobodyさん02/06/27 10:15ID:???
あ、すげー間違った。すまぬ。

s/&(?!lt;|gt;)/&/g;
0437nobodyさん02/06/27 10:16ID:???
ありゃ?あ、そうか。&amp;amp;ってかかなきゃいけないのか・・・
0438430と43102/06/27 16:35ID:???
>>436
それで完璧にできました。ありがとうございます。

正規表現勉強しないと(°_°;A)アセ
0439nobodyさん02/06/27 17:36ID:???
すみません。消費者を騙し、クレームをつけると強烈な脅しで黙らせる位の
ひどいサイトがあります。思いきってサイト(HDD)をクラッシュさせたいのですが、
何かいい方法はあるのでしょうか?
こちらのIPとか所在がわからないようにしたいのです。
こう言う質問にお答えとなると問題がある場合、こういった専門サイトとかがあれば
お教え頂けないでしょうか。
0440nobodyさん02/06/27 17:43ID:???
す
ひ
何
こ
こ
お

???
縦読みじゃないのか
0441nobodyさん02/06/27 17:58ID:???
>>439 
俺はここの一流ハッカーに頼んでHDDを爆発させてもらったよ
http://www.qudsway.com/Links/Doctor/4/Html_Doctor4/4hdo9.htm
0442nobodyさん02/06/27 19:54ID:???
特殊変数 $# はどのように利用するのでしょうか?
「出力時の数値形式」ということまでは分かったのですが...。
0443nobodyさん02/06/27 20:11ID:???
>>442
-wスイッチの元で警告されるように、$#の使用はお勧めできない。
Cレベルでの内部操作だから簡単にDLLエラー(Unixだとコア吐くのかな?)を出せるしな。
それでも使いたければ:

$# = '%.3g';
print 8/9;
0444trrh02/06/27 23:55ID:mvLF/G5v
while (<file1>){
$file1++;
}
close(file1);


while (<file2>){
$file2++;
}
close(file2);

while (<file3>){
$file3++;
}
close(file3);


while (<file4>){
$file4++;
}
close(file4);

上記のソースを短く出来ませんか?
0445nobodyさん02/06/28 00:03ID:???
>>444
ネタはこちらへ。
http://pc.2ch.net/test/read.cgi/php/1024741312/
0446nobodyさん02/06/28 00:26ID:???
>>444
マルチ
http://pc.2ch.net/test/read.cgi/tech/1017736187/n186-
0447nobodyさん02/06/28 17:06ID:???
$mes = '787+8787';
$paturn = '787+8787';
quotemeta $paturn;

if ($mes =~ /$paturn/){
print "Match!\n";
} else {
print "Oops!\n";
}

これだとマッチしないのですが、どうすればエスケープ出来るでしょうか
quotemetaの使い方を間違えてんのかなあ・・
0448nobodyさん02/06/28 17:09ID:???
でけますた
\Q\E だた・・
perlは忘れ易いよ
0449japh ◆J.5V8ta6 02/06/28 20:48ID:???
>>447
quotemeta()の使い方間違えてるよ。

$quoted = quotemeta $string;

chop(), chomp()等と違って元の文字列は置き換えないからね。
0450nobodyさん02/06/28 21:59ID:???
>>447
わざとなのかもしれないけど、paturn はちょっと恥ずかしいね。
0451nobodyさん02/06/28 22:43ID:ZifxuKsx
foreach $mon(@logs) {
 @mon = split(/,/,$mon);
 $mon{$mon[1]}++;
}

3行目では何が起こっているのでしょうか?
0452&r02/06/28 22:51ID:???
ハッシュ%mon を利用して、配列 @logs の第2フィールド値の出現回数を
取得しているといったところでしょうか。
045345102/06/28 23:30ID:???
>>452さん

出現回数ですか。
どうもありがとうございます。
0454nobodyさん02/06/29 00:03ID:kfva2Nvg
質問です。
ppmでsearchを実行しても全く反応がないのです・・・

PPM> search
PPM>

のように、なってしまうのです・・・DBIをインストールしたいがために四苦八苦しているのですが、
どうしても上手いこと行きません・・・もちろんdbi.zipを直接DLして
ppm install dbi.ppd
等も試してみましたが
Could not locate a PPM binary of 'dbi.ppd' for this platform
とエラーが出てしまいます(涙

どうにか対処法を教えて貰えないでしょうか・・?
環境はwin2k perl-v5.6.0 for MSWin32-x86-multi-thred ppm(2.1.2)です
0455nobodyさん02/06/29 02:19ID:???
>>454
install DBI
でいけないか?
0456こここ02/06/29 02:20ID:8vz7q6tH
kentwebのCOSMO GATE-EXをエクスリアで設置したけど、
説明の通りに設置して、チェックモードでもOKとでたんだけど

Authorization Required
This server could not verify that you are authorized to access
the document you requested. Either you supplied the wrong creden
tials (e.g., bad password), or your browser doesn't understand
how to supply the credentials required.

ってでる。
何が悪いのかわかります?
0457nobodyさん02/06/29 02:24ID:kfva2Nvg
>>455
ダメです・・・
Installing package 'DBI'...
Error installing package 'DBI':Could not locate a PPD file for package DBI
となります・・・
ネットは常時接続なので、当然繋がったまま実行しているのですが・・・
(。´Д⊂)゜。・ こまった
0458nobodyさん02/06/29 02:27ID:???
>>456
認証でもかけてるの?
0459こここ02/06/29 02:28ID:8vz7q6tH
>>458
そうです
0460nobodyさん02/06/29 02:31ID:???
>>457
えーなんでだろう。じゃあppm使わずに
perl -MCPAN -e shell
って打ってから
install DBI
0461nobodyさん02/06/29 02:40ID:???
>>457
わかった。常時接続ならプロバイダかどっかのPROXY通してるでしょ。
それ一時的に外してみて。
0462nobodyさん02/06/29 02:46ID:???
>>459
認証を通過できなかっただけじゃん
0463補足02/06/29 02:52ID:???
http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/
> PPM doesn't work through a proxy/firewall.
> This can be remedied by setting the environment variable 'HTTP_proxy' to the name and port of your Internet proxy, e.g.:
> C:\> set HTTP_proxy=http://proxy:8080
> If your proxy or firewall requires a username and password, you will also need to set the environment variables 'HTTP_proxy_user' and 'HTTP_proxy_pass'.

多分これね
0464こここ02/06/29 02:52ID:8vz7q6tH
げげげっ!?
本当だ。
今まであると思ってたIDとパスがなかった・・・
とにかく今やったら出来た。
nobodyさんありがとう!!!
0465nobodyさん02/06/29 03:21ID:???
nobody さん?(w
0466nobodyさん02/06/29 07:00ID:???
         ここかが引き篭もりの巣ニダか!!
               ∧∧
     |\       <ヽ`∀´>         /|
     ヾ  ̄ ̄ ̄ ̄ ̄    ̄ ̄ ̄ ̄ ̄ ̄ ̄ /
       ̄ ̄ ̄ ̄ ̄ ̄|  | ̄ ̄ ̄ ̄ ̄ ̄ ̄
               |   |
        / ̄ ̄ ̄ ̄\/ ̄ ̄ ̄ ̄ ̄\
       __/ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ .\__  ドドン!!
___<__)__________ (__>___

0467nobodyさん02/06/29 12:54ID:xVhrnBTO
CGIでメインの掲示板やゲームのサブルーチンが入ってるサブのCGIファイルで
こいつらの属性を変えてやれば処理を軽くすることはできますか?
初心者なもんで質問が意味不明かもしれません…(汗)
0468&r02/06/29 12:57ID:???
>467
ほんとに意味不明だからびっくりしたYO!
0469あSD02/06/29 13:16ID:IbvPgwu5
http://isweb43.infoseek.co.jp/play/ta-bo-z/
0470nobodyさん02/06/29 13:19ID:???
>>467
うん、意味不明だ
0471nobodyさん02/06/29 16:51ID:???
Perlの事で質問です。
初歩的な事で申し訳ございません。
name1<>host1<>ip1<>111<>
name2<>host2<>ip2<>222<>
name3<>host3<>ip3<>220<>
name2<>host2<>ip2<>200<>
name2<>host2<>ip2<>222<>
name3<>host3<>ip3<>220<>
とログファイルに保存をしてありまして、
それぞれの一番右の数の合計を出すにはどうすれば宜しいのでしょうか?
0472nobodyさん02/06/29 17:01ID:???
ホストごとにまとめたい、ということ?
047347102/06/29 17:03ID:???
>>472
はい。そうです。
出来ますでしょうか?
0474nobodyさん02/06/29 17:05ID:???
>473
>451が参考になるよ。
あれをちょっといじればいい。
0475&r02/06/29 17:07ID:???
>471
こんな感じでしょうか?

$sum+= (split(/<>/))[$[+3] for <DATA>;
__DATA__
name1<>host1<>ip1<>111<>
name2<>host2<>ip2<>222<>
name3<>host3<>ip3<>220<>
name2<>host2<>ip2<>200<>
name2<>host2<>ip2<>222<>
name3<>host3<>ip3<>220<>
047647102/06/29 17:25ID:???
>>474
それは、その感じでまる2日ぐらい悩んだんですが出来ませんでした。
>>475
今、試してみましたが一番右の数の全部の合計した数が出てきました。
0477nobodyさん02/06/29 17:36ID:???
>476

> 1:自分はこう言う事がしたい。
> 2:それでこんな風にやってみたが・・・
> 3:それだとこんなエラーが出て上手く行かなかった。
>
> 1と3が無いと誰も答えられないよ。
> 良い回答は良い質問から。一緒に勉強しましょう。

1はあるけど2と3がないな。
0478nobodyさん02/06/29 17:39ID:???
結論出すと、

while(<IN>) {
 @host = split(/<>/,$_);
 $host{$host[0]} += $host[3];
}

かな?
0479nobodyさん02/06/29 17:45ID:???
>>477
おいおい。まる2日分のなんや事を書けっていうのかちみは?
0480&r02/06/29 17:52ID:???
>478
そうだね。うっかりホスト毎ってのを見逃してた。修行してくる。
048147102/06/29 17:55ID:???
>>479
んーと別に大丈夫ですよ。質問の仕方が悪いのは僕の方です。
>>477
今まで答えて頂けたことは全て一通りやってます。
エラーは出ませんでした。出たとしても;を:と間違えた等その位です。
048247102/06/29 17:59ID:???
>>478
出来ませんでした。
048347102/06/29 18:02ID:???
>>478
host3の合計しか出ませんでした。
0484&r02/06/29 18:04ID:???
>482
ハッシュの参照のしかたわかる?
ファイルハンドルが478ではINになっているから統一しているか確認して、
とりあえず以下のようにして出力して確認されない?
for ( keys %host ){
    print $_,': ',$host{$_},"\n";
}
048547102/06/29 18:04ID:???
野郎℃も出来たぜ!!
Thanks!!!!!!!!!!!!!!!!!!!!!!!!
黄金帽と呼んでくれ!!!
0486nobodyさん02/06/29 18:06ID:???
@host1 = grep { /^name1<>.*<>.*<>.*<>/ } @_;
@host2 = grep { /^name1<>.*<>.*<>.*<>/ } @_;
@host3 = grep { /^name1<>.*<>.*<>.*<>/ } @_;

foreach(@host1){
m/^name1<>.*<>.*<>(.*)<>/;
$count1 += $1;
}

これじゃ非現実的だな。スマソ
048747102/06/29 18:07ID:???
>>485
??
>>484
出来ました。ご丁寧に説明をして頂きありがとうございました。
0488nobodyさん02/06/29 20:03ID:A6ruKh9P
B83W59H86(14歳)セルフヌード衝撃うp祭り開催中!!
http://tmp.2ch.net/test/read.cgi/mog2/1022943102/l50
0489nobodyさん02/06/29 20:32ID:YfnrInm/
perlからcの関数(*.aとかlibの)を使用する方法を教えてください。


0490nobodyさん02/06/29 20:40ID:???
>>489
ム板とWebProg板にマルチポストか。おめでてーな。
0491nobodyさん02/06/29 20:47ID:???
うるせえよ

>46 :デフォルトの名無しさん :02/06/29 19:00
>>>1よ
>だいたいPerl関連はWebProg板でやるきまりなんだよ
>そっちへ逝け
0492nobodyさん02/06/29 21:30ID:???
うがー。ム板のほうにレスつけちゃったよ。
じゃ490はマルチした罰として↓の48に答えること。命令。
http://pc.2ch.net/test/read.cgi/php/997829243/n48-
049349002/06/29 21:37ID:???
何故俺が罰を受けねばならんのだ…ウワァァァァン(`Д´)
049449202/06/29 21:41ID:???
ス、スマソ…。>>493
0495nobodyさん02/06/30 06:36ID:???
open関数が失敗するときは、
・ファイルが存在しない
・パーミッションがおかしい

以外にありえるのでしょうか、おねがいします
049649502/06/30 06:36ID:wtzA9nm5
あげときます
0497nobodyさん02/06/30 09:04ID:???
>>495
・メモリが足りない
・opcodeの実行が禁止されている
0498nobodyさん02/06/30 11:08ID:???
>>497
ファイルを開きすぎとかは?
0499nobodyさん02/06/30 11:54ID:???
>>498
そういえばそれもあるか
0500nobodyさん02/06/30 12:37ID:???

今だ!200番ゲットォォォッ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
        ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ

0501nobodyさん02/06/30 12:38ID:???
欝…番号間違えた(泣

>>495
あと、既にファイルが排他モードで開かれてるってのは?
0502nobodyたん02/06/30 14:21ID:???
排他モードで開くなんてのはあるのかな?
排他モードでロックしているというのはあるが。(その場合でも open は可能)
0503nobodyさん02/06/30 14:41ID:???
>>495
【Perl】ファイルロック(排他処理)について語ろう
http://pc.2ch.net/test/read.cgi/php/1024795138/
も参照してみては?
0504nobodyさん02/06/30 15:34ID:???
ここにいる人は>>492の質問には答えられないレヴェルなのですね。
ファイルロックなんてどうせ巷の解説サイトみればすむことなのに、、。
0505nobodyさん02/06/30 15:58ID:???
>504
492は質問ではなく誘導ですが…。
巷の解説サイトにあるファイルロックできみは納得して満足してるんだろうね。
そのサイト教えて。
0506nobodyさん02/06/30 16:50ID:???
>>505
>>3-4 ぐらい読め。バーカ
0507nobodyさん02/06/30 16:59ID:???
504=506?
だから、きみが納得して満足してるであろう巷の解説サイトを教えて。
どこ?
0508505 ◆EPPSxEpw 02/06/30 17:18ID:???
http://www.bayashi.net/st/pdmemo/filelock.html
↑適当にグーぐるしてください
 ファイルロックは専用のスレもあります
 >>504の解説してください。
■ このスレッドは過去ログ倉庫に格納されています