トップページ⇒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あたりを見よう。
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の解説してください。
0509nobodyさん02/06/30 17:36ID:???
>508
そのリンクってはじめて見させてもらったけど大崎さんのスクリプトに
なんで余計なプロセス番号($$)付けてあるの?積算秒を付ける意味を
理解できてないの?
これがきみの言う「巷の解説サイトみればすむ」ってこと?

504の解説:
>ここにいる人は>>492の質問には答えられないレヴェルなのですね。
505に書いたとおり、「492は質問ではなく誘導です」
0510nobodyさん02/06/30 17:46ID:???
> 付加する数字文字列がtime関数だと秒単位なので、
> まだ完全ではないのではないかという疑問が残ります。

何が疑問なのかが疑問です。
0511nobodyさん02/06/30 18:08ID:???
>510
この板でこのレスの速さは508さん自身のサイトだったってことかな?

ロックできるかどうかのテストと実際にロックする操作を同時に行なう
ことができる atomic な関数 を使っているからロックが成功するのは
1プロセスであり、そういう意味では同じ名前にロックファイル名に
リネームしてもよいということ。
ここで、なぜ積算秒を付け足したロックファイル名にリネームするかと
いうと、もしデッドロックが残っても作成してから60秒よりも経過して
いるかどうかを確認するからです。

つまりプロセス番号($$)を付ける意味がまったくわたしには理解できません。
0512nobodyさん02/06/30 18:19ID:???
>510
付け足すけどよく見たらさ。
ロック中ファイル名って、$lfh{path} . time . $$ だから
/^$lfh{basename}(\d+)/でマッチさせた $1 って time . $$ の値になる
可能性が大きいよね。(Windows系だと$$は-nnnnnnみたいな形式だったりする
けどさ)
でもその直後に平気で積算秒から $1 の値を引いてタイムアウト値と比較してる
からデッドロックをこれじゃ回避できないんでは?
0513508 ◆EPPSxEpw 02/06/30 18:49ID:???
あーわかったからファイルロックはあっちでやれ。
http://pc.2ch.net/test/read.cgi/php/1024795138/
どうせカウンターにしかつかっとらんのやろ。
ほかになんにファイルロックつかっとるのか知りたいDBとか?
>>508のサイトはgoogleでファイルロックで検索したら一番手前にあったから貼った。
------------------------------------------------
俺はXSについて聞いてんだ。
0514nobodyさん02/06/30 19:14ID:???
>513
カウンタ程度ならむしろ使わないほうがいいだろう。うっとうしい。
まぁ、使うとしたら電子商取引システムを構築するときに使うかもな。
さっきのアドレス、きみのサイトだったらなおしとけよ。はずかしいから。

きみの検索でほんとにさっきのサイトがトップでヒットしたんなら、検索能力を
養ってから吠えるこったな。まずこれでも見ておれ。

%perldoc -m perlxs
0515508 ◆EPPSxEpw 02/06/30 19:40ID:???
まぁ言い争いはよそうや(*゚ω^)ノ
この板に電子商取引システムを構築したりする人間がいるなら
XSぐらい楽勝だろ。
0516nobodyさん02/06/30 19:52ID:???
ロックスレの存在意義が今わかった。隔離病棟なんだね。。。

>>515
で、なに質問してるんだっけ。ていうかあなた質問者本人?
perlxstutの説明に沿ってHello Worldとか作ってみた?
0517508 ◆EPPSxEpw 02/06/30 20:00ID:???
>>516
見てもいまいち分からんとです。
解説サイトみても解説のみでサンプル載ってないし
0518japh ◆J.5V8ta6 02/06/30 20:56ID:???
>>517
perlxstutのサンプルじゃ不満だと?
http://www.kt.rim.or.jp/~kbk/perl5.005/

もっと突っ込んだサンプルが欲しいなら、
CPANから適当なXSモジュール落として参考にすれ
0519nobodyさん02/06/30 22:15ID:???
508はネタ荒らしか?天然か?
http://members.tripod.co.jp/ms_mzn/
0520pear ◆FRUIT8pk 02/07/01 05:54ID:???
$ENV{REMOTE_HOST} が返ってこないサーバーがあって、
問い合わせたら、「そんなことはない、ソース見直せ」って
言われたんですけど、このソースで表示されなかったらおかしいですよね?

#!/usr/bin/perl

print "Content-type: text/html;\n\n";

print "<html><body>";

foreach (sort keys %ENV){
print "\$ENV{$_}:$ENV{$_}<br>\n"
}

print "</body></html>";

exit;

これは何かこちらのソースに問題があるのでしょうか
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています