Perlコーディング初心者質問スレ Part 60
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/09/03(木) 23:51:12ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
0083nobodyさん
2009/09/19(土) 14:47:11ID:???> 解凍した中身に「Makefile.PL」がありません。
「Linux版」の意味が不明だが、いずれにせよ、Makefile.PLはある。
また後ろに続く[LIBS='-L/where/to/find/libsuggest.a -lsuggest']もよく意味が分かりません。
"/where/to/find/"をlibsuggest.aをインストールしたディレクトリに置き換える。
0085nobodyさん
2009/09/19(土) 16:52:19ID:???my @arr = (0, 1, 2, 3, 4);
print @arr[2..$#arr];
または
my $arr = [0, 1, 2, 3, 4];
print @{$arr}[2..$#{$arr}];
008881
2009/09/19(土) 17:32:49ID:02Qx22rDレスありがとうございます。win版等があったので・・・
「Makefile.PL」はありませんが、「Makefile」なら解凍した中にあります・・・
ttp://search.cpan.org/~ihara/Statistics-Suggest-0.01/
ここに、「Makefile.PL」があったので、これを利用しようと思います
[LIBS='-L/where/to/find/libsuggest.a -lsuggest']はこのまま実行しないで
自分の環境に合わせて変更する必要があるんですね。ありがとうございます
最後に「libsuggest.a」は、通常何処にあるのでしょうか?よろしくお願いします。
0089nobodyさん
2009/09/19(土) 20:01:27ID:???Linuxなんだろ?
find /usr -name libsuggest.a
で探せるだろ。最近は一瞬で全ファイルシステム探せるから便利だよな。
昔はこんなことしたら怒られる上に何十分もかかった。
っていうか
http://glaros.dtc.umn.edu/gkhome/suggest/download
から
suggest-1.0-linux.tar.gz
をダウンロードしたら、その中にlibsuggest.aがあるじゃん。これインスコすれば
いいんじゃねーの?README読んだらテスト方法書いてあるからテストしろよ。
テストは大事だからな。インスコ先は/usr/local/lib/辺りでいーだろ、で、
perl Makefile.PL [LIBS='-L/usr/local/lib/libsuggest.a -lsuggest']
こーだろ。
0090nobodyさん
2009/09/20(日) 09:40:10ID:WC9uameU現在、初心者ながら、PerlでCSVファイルを使って簡易的なDBを作っています
その際、下記の方法でCSVファイルの部分修正していますが、うまくいきません><
申し訳ありませんが、お知恵をお借りできますでしょうか?
困っております(泣)
◆下記プログラム内容
CSVを読み込み、一致する部分があればそこを修正し、新たなCSVとして書き出す
◆マスターDB(カンマ区切りのCSVファイルにて作成)
・DBは横230×縦max2000程度(現行は横200×縦100程度)
・先頭、横20までは日本語で、最大でも全角50文字程度(改行、カンマは事前に除外(置き換え)しています)
・その後は「1 or 空白」。(フラグが立っているか、いないかだけ)
◆発生する不具合?
(1)修正箇所の後ろの2〜3行が、修正行の後ろにそのまま追加される(欠落する場合もあり)
(2)DBの一番最後の最後の行に不明なデータが追加される
例1:,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1
例2:,,,,
例3:0行目がコピーされる
例4:改行のみ
(3)上記、(1),(2)は基本的に同時発生
(4)上記、(1),(2)が毎回ではなく時々発生(と言うか、かなり頻繁に… 10回に8回程…)
〜長文のため、私のソースは↓に書きます〜
009290
2009/09/20(日) 09:45:53ID:WC9uameUopen (write_db,"+<db.csv");
flock write_db,2;
$i=0;
while(<write_db>){
@master = split(/,/, $_);
if( $master[0] == $data[0] ) {
$master[1] = $FORM{'textfield62'};
〜略〜
$master[15] = $FORM{'textfield5'};
#修正前の”1”のフラグ情報をクリア
for( $m = 21 ; $m <= $#master ; $m++ ){
$master[$m]=""; }
#修正情報の入っている@dataに基づいて@masterを変更(新しいフラグを立てる)
for( $k = 8 ; $k < $end_num ; $k++ ){
$master[$data[$k]] = 1; }
}
$write_data[$i] = join(',',@master);
$i++;
}
seek write_db,0,0;
close (write_db);
#書き出し操作
open (OUT,"+<db.csv");
flock OUT,2;
foreach my $ii ( @write_data ){
print OUT $write_data[$ii]; }
seek OUT,0,0;
close (OUT);
0093nobodyさん
2009/09/20(日) 10:11:43ID:???それ、DBD::CSVでできるから。CSVファイルに対して
SELECT * FROM table WHERE id > 1 ORDER BY id
とかできちゃうから。なんでそんなもの作ってるのか謎すぎる。
0094nobodyさん
2009/09/20(日) 10:36:14ID:???009590
2009/09/20(日) 10:49:27ID:WC9uameU理由があり、DBD::CSVは使えませんでした。
今後はそれも視野に入れ行っていきたいと思いますが、
まずはDBD::CSVを使わない場合での解決を目指しております。
>>94
実行時に修正前データ、修正後データ、書き込みデータの表示を行い
データ内容の確認を行っておりますが、その時点では問題はありません。
(CSVファイルとして書き出され、それをエディタ等で見た場合にデータがおかしくなっております)
上記に加え、確認する方法もご指摘頂けると幸いです。
0096nobodyさん
2009/09/20(日) 11:16:04ID:???>まずはDBD::CSVを使わない場合での解決を目指しております。
間違った判断だな。
理由って大した理由じゃないだろ。言ってみろ。自分でやってみたいとかそんなんだろ。
絶対これ直すよりDBI::CSVの方が早い。
このままじゃ無理。全面書き直し。
コードに定数が入れるな。機能をモジュールに分けろ。Test::Moreでテストを書きまくれ。
0097nobodyさん
2009/09/20(日) 12:09:18ID:???> 絶対これ直すよりDBI::CSVの方が早い。
自分でやることの大切さは早いとか遅いとか関係ない、分かってないな。
0098nobodyさん
2009/09/20(日) 13:11:31ID:???----------------------------------------------------------------------
0099nobodyさん
2009/09/20(日) 13:15:31ID:???一度検討したくらいだから早さが大事なんだろ。
まあ確かに最近の風潮として、大したコードでもないのに
useが10〜20行くらい並んでるの見ると萎えるな。
0100nobodyさん
2009/09/20(日) 13:19:29ID:???挿入しようとしても挿入にはなりません
上書きされるのが正常動作です
意味不明な文字が現れるのは、日本語
2バイトのうち1バイト分が上書き
されてしまうので
0101nobodyさん
2009/09/20(日) 17:35:24ID:???しかし、%FORMが謎。
とりあえず、Text::CSV_XSを使ってみて。
0102nobodyさん
2009/09/20(日) 18:40:24ID:???0103nobodyさん
2009/09/20(日) 23:49:07ID:???ていうか、わざわざ"+<"でopenしているのに書き込む前にcloseしたら意味ないし!
seek FH,0,0;をcloseの直前に書いても無駄だし!
以前のデータを置き換えるなら、書き込むときのopenは">"で開く。さもなくば、closeせず、truncateする。
でないと、書き込んだ@write_dataの各要素のバイト長の合計が、書き込む前の
db.csvのファイルサイズより少ないとき、その差のバイト長だけ、以前のデータの末尾が残る!
不具合ってそのせいじゃないの?
0104nobodyさん
2009/09/21(月) 00:29:33ID:???0105nobodyさん
2009/09/21(月) 00:43:00ID:???モジュールで済ませられるところはモジュールを使うと。
秘密が多すぎて、ダメかも分からんが。
で、釣りなの?
0106nobodyさん
2009/09/21(月) 00:47:23ID:???質問スレでそんなの気にするな。
0107nobodyさん
2009/09/21(月) 16:03:31ID:???以下の様に、Rスクリプトを一時的にファイルに落としてそれを実行すれば上手くRを呼び出せます。
ここで、一時ファイルを作らずに$r_script_strを直接使う方法はあるのでしょうか?
my $r_script_str = sprintf << 'EORS'
cat("Hello, world!")
EORS
;
open my $r_script_fh, '>', "./tmp_r_script.r";
print $r_script_fh $r_script_str;
close $r_script_fh;
system "R --vanilla --slave < ./tmp_r_script.r";
0110nobodyさん
2009/09/25(金) 09:36:36ID:wSkBdlIWperl+MySQLで
$table_data[0]の真偽で分岐後、else{}は期待通りの結果ですが、if(){}が接続エラーとなってしまいます。
ど素人のため完全にはまってしまって
$dbh = DBI -> connect ($dns, $username, $password)
or
&err;
$sth = $dbh->prepare( qq{ SELECT code FROM client WHERE so = "$so" });
$sth -> execute()
or &err;
@table_data = $sth -> fetchrow_array();
$sth -> finish();
if(!$table_data[0]){
$sth = $dbh->prepare( qq{ UPDATE client SET condition=1 WHERE so = "$so" });
$sth -> execute()
or &err;
}
else{ $sth = $dbh->prepare( qq{ UPDATE client INNER JOIN afdb2 ON afdb2.code = client.code
SET afdb2.fix=afdb2.fix+client.price*100,
afdb2.occur=afdb2.occur-client.price*100,
client.condition=1 WHERE client.so = "$so" });
$sth -> execute()
or &err;
}
$sth -> finish();
$dbh -> disconnect();
exit;
よろしくお願いします。
0111nobodyさん
2009/09/26(土) 11:16:39ID:???って何なの? &err となっている部分を
$dbh->errstr;
に変更して、エラーの中身をはれ。
> $sth = $dbh->prepare( qq{ SELECT code FROM client WHERE so = "$so" });
プレースホルダ使いな。
SQLインジェクションするよw
0112nobodyさん
2009/09/28(月) 04:42:47ID:???最新版のリファレンス的なものが置いてあるサイトとかブログないかな
0113nobodyさん
2009/09/28(月) 11:00:48ID:???0114nobodyさん
2009/09/28(月) 19:26:50ID:MFzb2dw4メールフォームを作ろうとしています。
form部品の、checkboxとradioとselectは、
textとかtextareaと違って、未選択の場合にキーを送信しないのですが、
これを未選択時にも、値が空のキー送信するようにすることはできますか?
cgi.pmのparam()メソッドでキーと値を受け取っているのですが、
上記が未選択時に受け取れないために、メールフォームの確認画面で、
つじつまが合わなくなってます(配列を使って自動的に生成しているため)。
どうかよろしくお願いします。
0115nobodyさん
2009/09/28(月) 19:51:52ID:???0116nobodyさん
2009/09/28(月) 20:04:40ID:???早速のレスありがとうございます。
キーは分かってるんですが、それを毎回(メールフォームの項目が変わるたびに)Perlに記述していくのは面倒なので、
自動的にできないかと思って、メールフォームを作り直してます。
しかし、未選択のradioとかcheckboxのキーが送信されないという、
思わぬところでつまづいてしまいました。
0117nobodyさん
2009/09/28(月) 20:16:08ID:???0118nobodyさん
2009/09/28(月) 20:42:32ID:???Perlとは直接関係ないけどさ、そうゆう場合はフォームのHTMLで、
全てのradioとかcheckboxにデフォルトの項目作って
checked="checked" とかしとくんじゃないのかな。
ただ、逆の使い方するほうが一般的な気がする。
例えば、必ず入れないといけないcheckやradioをあえて空にしといて、
そこをcheckしないと次のステップに進めないようにするとか、
"規約に同意「する」「しない」"で、「しない」にデフォルトでcheck入れとくとか。
これで、ある程度だけど自動スクリプトやロボットなんかの連投や、
一般ユーザーのボタン連打(いや、ほんとにいるんだって、極たまにだけど)
とかで、不意に高負荷になったりしないで済むし、なによりユーザーに
ちゃんとした入力を促すほうが大事かと思うが・・・。
0119nobodyさん
2009/09/28(月) 20:47:50ID:???どのように設定したらいいのでしょうか? サーバーはlolipopです。
0120114
2009/09/28(月) 20:52:28ID:???>>117
そうかもしれませんね。
>>118
おっしゃられることは分かります。
しかし、デフォルトでcheckedは設定してますが、checkboxやmultipleなselectは、
チェックを外すことができるんです(radioを除く)。
チェックを外すと、キー自体が送信されないので、
(キーをPerlに直接明示しない場合は)Perlでエラーを吐き出すことすらでません(JavaScriptでは可能ですが)。
PerlからメールフォームのHTMLを読み込んで、
nameを上から順に抽出して配列に代入する方法しかないかもしれませんね。
0121114
2009/09/28(月) 21:02:56ID:???HTMLを変えるだけでメールフォームが簡単に作れるものを作りたかったんです。
そのHTML内の項目を読み取って、自動的にエラー画面・確認画面・自動返信メールが生成される感じです。
必須項目とか再入力が必要な項目とかもHTMLのみの変更で完結できるものです。
0122nobodyさん
2009/09/28(月) 21:47:25ID:???普通はデータベースのテーブルからフォームを起こすと思うけど。
0123nobodyさん
2009/09/28(月) 22:09:35ID:Abs+b0wT海外からの書き込みを拒否にしたいです
多分このファイルがアクセスチェックのファイルだと思うのですが…
↓のプログラムで国内のみを通すにはどういじったら良いのでしょうか?
まだまだ勉強中なので指導していただけないでしょうか
よろしくお願いいたします
次レスにプログラムです
0124nobodyさん
2009/09/28(月) 22:11:47ID:???0125nobodyさん
2009/09/28(月) 22:13:49ID:Abs+b0wTttp://www1.axfc.net/uploader/File/so/31637
0126nobodyさん
2009/09/29(火) 00:16:08ID:???スレちの希ガス。
毎回記述が面倒といっても、毎回記述するしかないのでは。
条件設定をするファイルを外部txtデータに書いておくとか。コード本体は変えないで済むように。
HTML::Parserなどを使って、htmlを丸ごと読み込んで、どんな入力項目があるかを解析するプログラムを外部で作ったらいかが。
htmlの中に条件指定をすると、いくらでも改ざんできてしまう。PCに保存してソースを書き替えて送信するとかできる。HTTP_REFERRERで確認しようにもクライアント側でどうとでも名乗れる。
>>119
envelopeアドレスを指定したらよろしい。
sendmailコマンドなら-fアドレス、Net::SMTPなら$smtp->mail(アドレス);
Mail::Sendmailならsendmail(Sender=>アドレス)のキーを渡すとセットされるみたい。
0127nobodyさん
2009/09/29(火) 01:44:13ID:l3KIzeZ6>>118
チェックボックス外されたらアウトだし、
checkboxでF5回避できるとか、脳内で書いてるだろ。
> ちゃんとした入力を促すほうが大事かと思うが・・・。
チェックボックスのチェックを外すのはちゃんとした入力です。
で、キーは帰ってきません。
>>126
つYAML/JSON
パーサなんか使わなくても
perl -pe 's/</\n</g' foo.html | grep -i '\<input' | perl -ne '/<(?:input|select|textarea) [^>]*?\s+name=([^ >]+)/i; $M=$1 ; $M =~ tr/"//d ; print "$M\n";'
とかで充分じゃね?
渡された値のキーに依存するのは気持ち悪いというのは同意。
0128nobodyさん
2009/09/29(火) 01:47:48ID:???0129nobodyさん
2009/09/29(火) 01:50:43ID:???0130nobodyさん
2009/09/29(火) 02:05:25ID:???perl -ln074e '/(?:input|select|textarea) [^>]*?\s+name=([^ >]+)/i; $_=$1 ;tr/'\''"//d;print if $1' foo.html
0131nobodyさん
2009/09/29(火) 04:08:59ID:???0132nobodyさん
2009/09/29(火) 12:39:33ID:???$form = HTMLFrom->new('POST', './test.cgi');
$form->setfield('hidden', 'action', '1');
$form->setfield('checkbox', 'sel', '1000');
$form->setfield('checkbox', 'sel', '1500');
ってやって、
$form->printform;
で表示するとか。
で、受け取りのときには
$form にはキーが保存されてるようにして、それを見れば一目瞭然みたいな感じ。
HTML::From がそうなのかもしれないけどw
0133nobodyさん
2009/09/29(火) 19:44:30ID:AG6/8zJV$hogeにいろいろ含まれる<input type="text" name="iroiro" />のiroiroを
$q->param($1)に置換したいんですが可能でしょうか?($1はいろいろ変わります)
※$q->param($1)には、そのnameのvalueが入ってます。
while ($hoge =~ s/<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/$q->param($1)/s) {
}
こうやっても、当たり前ですが$q->param($1)が入ってるのでエラーになります。
でも、$value = $q->param($1)のようにしてから、その後の正規表現をどうすればいいのか分からないんです。
どうかお願いします。
0134nobodyさん
2009/09/29(火) 20:00:59ID:AG6/8zJVwhile ($form =~ /<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/s) {
$value = $q->param($1);
$form =~ s/<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/$value/s;
}
0135nobodyさん
2009/09/29(火) 20:09:10ID:???$hoge =~ s|(<input.*?type=\"text.*?name=\")(.*?)(\".*?/>)|$1.$q->param($2).$3|egs;
- e (Eval) 修飾子 (modifier) を付けると、その中が「式」として解釈されます。
- g (Global) 修飾子 を付けると、何度でもマッチを繰り返します。
0136nobodyさん
2009/09/30(水) 04:32:12ID:???0138nobodyさん
2009/09/30(水) 16:57:25ID:???$qがCGI.pmのオブジェクトだったら、XSS脆弱性に気をつけようってこと。
ただのお節介かも知れないけどさ。
0139nobodyさん
2009/09/30(水) 19:03:47ID:???-環境
winXP IE8
AN HTTPD + perl 5.8.8 (active perl)
-----------
my $str = 'テスト';
print "Content-type: text/plain\n\n";
print $str;
IEの「ダウンロード出来ません」とかいうエラー発生
-----------
my $str = 'テスト';
print "Content-type: text/html\n\n";
print $str;
問題なし
-----------
もしかしてIE8ってtext/plain表示出来ないんでしょうか?
0140nobodyさん
2009/09/30(水) 19:11:04ID:???IE のせいにすれば解決すると思ってる?
0141nobodyさん
2009/10/01(木) 04:28:26ID:???0142nobodyさん
2009/10/01(木) 09:22:24ID:???CoLinux立てて環境作れ。サービス&自動起動にしてしまえば遠くにLinuxマシンが
あるのと全く区別がつかん。パフォーマンスもそっちのがずっと高い。
そろそろいい加減にしないと時代に取り残されるぞ。
ちなみに>>139のようなことで騒いでるやつが居たから見てやったら
Content-Type: text/plane
になってた。飛ぶ気か。
0143nobodyさん
2009/10/01(木) 09:50:29ID:???0144nobodyさん
2009/10/01(木) 10:58:18ID:???ダウンロードしようとするのはIEの昔からの挙動だね。
確か512バイト未満はダウンロードするんじゃなかったかな。
リクエストするアドレスの最後にスラッシュをつければ回避できる。
IEは昔から問題を抱えてるブラウザだから、テストに使わない方がいい。
AN HTTPDも昔と変わってなければ問題を抱えてると思う。
設定が面倒だと思うだろうけど、Apache等で信頼性の高い環境を構築した方が
トータルで考えると楽だよ。
0145nobodyさん
2009/10/01(木) 12:25:45ID:???アドレスの最後にスラッシュ付けたら表示されました。
IEだと512バイト未満の不具合があるんですね。
Content-Type無視の方かなと思ってたんですが。
[無視できない]IEのContent-Type無視 − @IT
http://www.atmarkit.co.jp/fcoding/articles/webapp/02/webapp02a.html
2008/7/2 - Internet Explorer 8 のセキュリティ : 総合的な保護
http://msdn.microsoft.com/ja-jp/ie/dd218483.aspx
2008/9/3 - Internet Explorer 8 のセキュリティ Part VI: Beta 2 の更新項目
http://msdn.microsoft.com/ja-jp/ie/dd218497.aspx
AN HTTPDが古いっていうのも気になってたので
これを機にApache入れようと思います。
ありがとうございました。
0146nobodyさん
2009/10/01(木) 12:28:42ID:???バグがなかったっけか。あれの亜種かな?
0147nobodyさん
2009/10/01(木) 12:44:02ID:???で解決出来たりねw
0148nobodyさん
2009/10/01(木) 13:14:47ID:???$|=1;
my $str = 'テスト';
print "Content-type: text/plain\n\n";
print $str;
$|=0;
これで使い方合ってますか?
これでもIEのエラーは変わりません。
Firefoxだと問題なく表示されます。
0149nobodyさん
2009/10/01(木) 13:34:45ID:???0150nobodyさん
2009/10/01(木) 16:54:23ID:???my $str = 'テスト';
#print "Content-type: text/html\n\n"; #OK
#print "Content-type: text/plain\n\n"; #NG
#print "Content-type: text/plain;charset=Shift_JIS\n\n"; #NG
print "Content-type: text/plain;charset=EUC-JP\n\n"; #NG
print $str;
#print "a" x 512; #NG
#print "a" x 1024; #NG
print "a" x 10240; #NG
charset指定しても変わらずです。
ついでに512バイト以上出力してもNGでした。
FirefoxはいずれもOK。
うちのIE周りがおかしいだけなんでしょうか?
0151nobodyさん
2009/10/01(木) 18:10:20ID:???my $str = 'テスト';
print "Content-type: text/plain; charset=Shift_JIS\n";
print "X-Content-Type-Options: nosniff\n\n";
print $str;
http://msdn.microsoft.com/ja-jp/ie/dd218497.aspx
IE8で、Content-typeに従わない機能が高性能化してるみたいだね。
Microsoftの製品だから、今度からは製造元のMicrosoftに聞いて欲しい。
IEに関わると不幸になるから。
0152nobodyさん
2009/10/01(木) 18:27:00ID:???3とか0とかは気にしないように。改行コードはCRLFで保存してね一応。
----------
#!/usr/bin/perl
print <<EOF;
Date: Thu, 01 Oct 2009 00:00:00 GMT
Server: Apache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/plain
3
aaa
0
EOF
0153nobodyさん
2009/10/01(木) 19:30:54ID:???これで普通に表示出来ました。
ちょっとスレ違いになってしまって申し訳ないです。
皆さん、ありがとうございました。
0154nobodyさん
2009/10/02(金) 00:57:54ID:???>>123>>124はここではスレチなのでしょうか?
もしそうなら該当スレを教えていただけますでしょうか…
0155nobodyさん
2009/10/02(金) 01:08:41ID:???0157nobodyさん
2009/10/07(水) 14:00:07ID:???フォルダ内のファイルの、連番が最大のものを別フォルダにコピーしようと思っています。
ファイル名は「@」で各要素が区切られているので、
foreach my $file(@files){
my @fact = split /\@/,$file;
という風にして、連番=$fact[3]が最大のファイルを取得しようとしたのですが、
現在のコードはforeach{ max($fact[3]) }となっているので全く意味を為さず、
どこかで$fact[3]を配列に入れてやらないといけない事までは気付いたのですが、
その書き方がわかりません。
尚、$fact[0]と$fact[1]はキーボードからの入力で絞込み、$fact[2]に入る固有名詞は無視(というか、全て取得対象)でこの辺は上手く動いています。
よろしくお願いします。
0158nobodyさん
2009/10/07(水) 14:33:21ID:???有名なシュワルツ変換を使ってみてはどうでしょうか?
my @sorted_files =
map $_->[0],
sort { $b->[1] <=> $a->[1] }
map [$_, (split /@/, $_)[3]], @files;
my $target_file = $sorted_files[0];
0159nobodyさん
2009/10/07(水) 14:48:08ID:???別解
my $max=0;my $max_file;
foreach my $file(@files){
$file=~/\@(\d+)$/;
if($1>$max){$max_file=$file;$max=$1;}
}
0161nobodyさん
2009/10/09(金) 20:37:40ID:QHm3Fnkr0162nobodyさん
2009/10/09(金) 21:51:14ID:???0163nobodyさん
2009/10/09(金) 22:59:18ID:???Feed::Findモジュールをついさっきインストールして試しに
http://www.geekpage.jp/programming/perl-network/feed-find.php
のコードをコピペして実行してみたら
[error] [client 127.0.0.1] Premature end of script headers
が…
どなたか原因が思い当たる方いらっしゃいませんか?
0164nobodyさん
2009/10/10(土) 00:05:42ID:???コマンドラインからやってみ。
0165nobodyさん
2009/10/10(土) 07:05:07ID:???こういった URL で、最後のファイルは CGI であったり HTML だったりするなかで
最後のスラッシュ以降の文字列を取得したいのですが、正規表現でどう書けば
いいのでしょう?
どう書いても最初の / から行末にしかマッチするものしか書けず、
Split で対応してるとこです
0167nobodyさん
2009/10/10(土) 11:35:43ID:???/.*\/(.*)/
最長マッチ使って .*/ と書くといちばん最後の / までにマッチするからそれ以降全部を取得すればいい
0169nobodyさん
2009/10/10(土) 12:07:50ID:???Rate >>165 >>166 >>167
>>165 119048/s -- -53% -69%
>>166 253165/s 113% -- -35%
>>167 389105/s 227% 54% --
というわけで、167が偉いという結論になりました。
0170169
2009/10/10(土) 12:09:42ID:???僕も166のように書いてしまいがちです。
へぼコーダーです。
修行が足りない。
0171nobodyさん
2009/10/10(土) 12:12:10ID:???#!/usr/bin/local/perl
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;
my $results = timethese(1000000,
{'>>165'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; @_ = split("\/",$url); $_=$_[-1];',
'>>166'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; $url=~m{[^/]+$} ; $_=$&;',
'>>167'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; $url=~/.*\/(.*)/; $_=$1;',
},'none');
cmpthese($results);
1行が長くてごめんなさい。
0172161
2009/10/10(土) 13:58:31ID:viNfW09Kありがとうござます。
もう1つ聞きたいのですが、全部カタカナである文字列のマッチはどう書くのでしょうか?(文字コード:utf8)
0173nobodyさん
2009/10/10(土) 14:26:26ID:???追試。
#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese timethese);
my $url = $ARGV[0];
my $results = timethese(-5, {
split => sub { my $file = (split qr|/|, $url)[-1] },
match => sub { $url =~ m|^(?:.*/)?(.*)\z|s; my $file = $1 },
rmatch => sub { $url =~ m|([^/]*)\z|s; my $file = $1 },
replace => sub { (my $file = $url) =~ s|^.*/||s },
substr => sub { my $file = substr $url, rindex($url, '/') + 1 },
}); print "\n";
cmpthese($results);
__END__
> perl test.script "http://example.jp/path/to/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 725417.52/s (n=3843262)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 2177060.73/s (n=11292414)
rmatch: 6 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 95000.19/s (n=497326)
split: 4 wallclock secs ( 5.16 usr + 0.00 sys = 5.16 CPU) @ 175469.36/s (n=904720)
substr: 5 wallclock secs ( 5.08 usr + 0.00 sys = 5.08 CPU) @ 3129401.38/s (n=15897359)
Rate rmatch split match replace substr
rmatch 95000/s -- -46% -87% -96% -97%
split 175469/s 85% -- -76% -92% -94%
match 725418/s 664% 313% -- -67% -77%
replace 2177061/s 2192% 1141% 200% -- -30%
substr 3129401/s 3194% 1683% 331% 44% --
0174nobodyさん
2009/10/10(土) 14:28:02ID:???Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 720711.14/s (n=3862291)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 5086089.07/s (n=26381544)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 840637.43/s (n=4361227)
split: 6 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 285616.14/s (n=1503769)
substr: 4 wallclock secs ( 5.31 usr + 0.00 sys = 5.31 CPU) @ 3257009.79/s (n=17301236)
Rate split match rmatch substr replace
split 285616/s -- -60% -66% -91% -94%
match 720711/s 152% -- -14% -78% -86%
rmatch 840637/s 194% 17% -- -74% -83%
substr 3257010/s 1040% 352% 287% -- -36%
replace 5086089/s 1681% 606% 505% 56% --
> perl test.script "http://example.jp/l/o/n/g/l/o/n/g/l/o/n/g/p/a/t/h/t/o/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 5 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 714051.59/s (n=3737346)
replace: 4 wallclock secs ( 5.25 usr + 0.00 sys = 5.25 CPU) @ 2172917.32/s (n=11405643)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 63767.54/s (n=330826)
split: 4 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 85094.45/s (n=441470)
substr: 5 wallclock secs ( 5.03 usr + 0.00 sys = 5.03 CPU) @ 3018419.40/s (n=15185668)
Rate rmatch split match replace substr
rmatch 63768/s -- -25% -91% -97% -98%
split 85094/s 33% -- -88% -96% -97%
match 714052/s 1020% 739% -- -67% -76%
replace 2172917/s 3308% 2454% 204% -- -28%
substr 3018419/s 4633% 3447% 323% 39% --
0178165
2009/10/10(土) 17:18:28ID:ia/oAbqC>>167
>>176→(訂正っす) m{\z\/(.*)} ですよね?
ありがとうございます。
# 最長でマッチさせたあとに取得
$url =~ /.*\/(.*)/;
# / 以外が続く行末まで
$url =~ m{([^/]+$)};
# 最後に見つかった / より後ろ
# \z 文字列の最後にマッチする。(Perl5.005以降)
$url =~ m{\z\/(.*)};
/.*\/(.*)/ を使わせていただきます。
今思えば、正規表現が今より苦手なころは
「めんどくせーから、行頭から欲しい部分の直前までマッチさせて、その残りをマッチさせて得てた」
と思い出しましたw
個人的には \z もなかなかいい感じなので、\z の存在を覚えていきたいとこ・・・
0180nobodyさん
2009/10/10(土) 18:23:47ID:???ここ↓を見て本人が好きな範囲を選べばいいよね
http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF
0181nobodyさん
2009/10/10(土) 20:45:28ID:???0182nobodyさん
2009/10/10(土) 21:21:15ID:???■ このスレッドは過去ログ倉庫に格納されています