Perl 初心者コーナー Part24
■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ
03/06/07 22:30ID:GbQKLcPE【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0220nobodyさん
03/06/12 01:31ID:???0221nobodyさん
03/06/12 01:31ID:WFfieXIn0222nobodyさん
03/06/12 01:37ID:???0223君のBodyはNobody
03/06/12 01:38ID:???こういう説明で十分なのか不安なのですが
&jcode'convert(*form,'sjis');
というようなコードを使っています。
0224nobodyさん
03/06/12 01:57ID:???ちなみに俺は素人さんです。
・腹の立つほど複雑な処理を数日考えて作りました。
・記述の量はかなり多いです。
・強引に作ったので処理はめちゃめちゃで見れた物じゃないです。
・多分半年後の自分は、解読出来ません。
・さらに、メンテしにくくバグが出たら大変そうな仕組みです。
・ついでにデータファイル(txt)の書き換えもめんどくさそうです。
しかし!
上記のダメダメな処理が出来た直後に。。。
もっと効率が良くて、見やすくて、メンテしやすくて、スマートな処理を思いつきました。
・でも、ハッキリ言って書き換えるのめんどいです。
・データ(txt)も全部書き換えです。
・データの書き換えも含むと1日では出来なさそうです。
・しかも苦労して作ったダメの処理を破棄するのは抵抗があります。
普通はそんな時どうするんですか?
ダメな処理を強引に使いますか?
プログラムは苦労するものなのだと割り切って作り直しますか?
多分、処理は使い捨てではなく、ちょくちょく直しながらそれなりに使うと思います。
・そこら辺の常識を玄人さんに聞きたいです。
0225nobodyさん
03/06/12 01:58ID:???0226nobodyさん
03/06/12 02:03ID:???0227君のBodyはNobody
03/06/12 02:15ID:???ちなみに、Print文で空のファイルに書き込みをしています。
print FILE $data;
みたいにです。
0229nobodyさん
03/06/12 02:34ID:???良いと思う処理方法が見つかったなら、ソースは書き換えるべき。
データファイルは、Perlで新しいフォーマットに書き換えるスクリプトを作ればいい。
俺は、そうしてる。
いや、そうするべき。
0230nobodyさん
03/06/12 02:49ID:???スパッと気分を変えて書き直したいと思います。
って言うか、もう始めてます。
綺麗な記述&処理のほうが後々イライラせずにすみそうだし。。。
データはperlに直接埋め込む方式に変更したので書き換えスクリプトは作れなさそうです。
まったく変な構造を持ったデータでして…。
では、ありがとうございました。
0232nobodyさん
03/06/12 03:47ID:???作ったのかい?
ま、書きかえってのはそのうちやらないといけない時がくるわな。
0233nobodyさん
03/06/12 04:07ID:???0234224,230
03/06/12 04:13ID:???実は俺、以前にもここに来た事があったりして…
モンスターデータが当初の予定より複雑になった(量も多くなった)ので他の記述との折り合いが悪く、
強引に組み込んだらぐっちゃぐちゃになってしまった次第です。
素人な俺は、なぜか強引に作ってしまいスグぐっちゃに。。。恥
0235nobodyさん
03/06/12 09:54ID:???たぶん処理系に激しく依存すると思うが、おそらくディレクトリエントリに格納されている
そのままの順番(ファイルを作った順番)ではないかと。
0236188
03/06/12 11:13ID:???>>214
「直しても」ってどういうことですか?、
unlink(<tmp*>);って直しようないかと思うのですが・・・
Perlのバージョンとプラットフォームは必ず書くこと。
そのエラーはglob()したときにシェルを子プロセスを起動したが、その子プロセスが正常終了しなかった、といっている。
何故かはそのエラーからは分からない。
File::Globも試すこと。
>>237
unlink(<...>)でも全く問題ないよ。間違った解答をするのはやめてほしい。
0239nobodyさん
03/06/12 13:16ID:???それ以外でやってみてから言え。
0241nobodyさん
03/06/12 14:32ID:???(実行されていない部分は翻訳されていない?)
それとも一旦スクリプト全体が翻訳されて実行されるんでしょうか?
require するライブラリなどはどの時点で翻訳されるんでしょうか?
(翻訳ってのは機械語に解釈って意味で使ってます)
処理の分岐がたくさんある場合にそれぞれサブルーチン化するんですが
これは外部にライブラリとして出した方がいいんでしょうか?
0242nobodyさん
03/06/12 15:57ID:F+7kv9WZverは5.xだったと思います。よろしくお願いします。
0243236
03/06/12 16:58ID:???ちょっと今そとなので、Perlのバージョンは5.*ということしかわからないのですが、
(プラットホームはコバルト)、
そういえば、lsコマンドをperlから実行できない設定になってました。
きっと、それと同じ理屈ですよね?
セキュリティポリシー的に、シェルコマンドをperlから実行できないようになってるという。
0244nobodyさん
03/06/12 17:10ID:???巨大テキストから一部分を一つのCSVとして出力しています
ieで実行するとダウンロードダイアログが開くのですが
その時ファイル名が「〜.cgi」になってしまいます
この「〜.cgi」を任意に変えられないでしょうか?
具体的には
1.getcsv.cgi にアクセス
2.ダウンロードダイアログが開く
3.ダウンロードファイル名が「data.csv」になっている
のような事がしたいのです
0246nobodyさん
03/06/12 18:50ID:???0249nobodyさん
03/06/12 19:08ID:OAyD+tHP動作させていましたが、このたびWindowsXP+ActivePerl5.6.1-635
で動作させようとしましたが、いまいち変な動作で頭を抱えています。
スクリプトはTrees↓です。
http://www.rescue.ne.jp/cgi/trees/
変というのは、一見動作はするのですが、「新しい話題」で新規書き込み
をしようとすると、
「.は削除されていますので、コメントの投稿はできません. 」
というメッセージでエラーになります。
調べてみると、1340行付近の
if ($in{'resp_number'} ne '' && -s $in{'resp_number'}==0) { &error("File Not Found","$in{'resp_number'}は削除されていますので、コメントの投稿はできません."); }
の&&の後の条件でひっかかってしまうようです。
ちなみに、新規書き込みの時には$in{'resp_number'}の中には「.」のみが入っています。
ふつーのif文なのに、linuxで動作してActivePerlでNGなのです。
0250nobodyさん
03/06/12 19:17ID:???perl -M-ops=system,open -e 'open(IN, "<hoge"); system("ls")'
man Safe
man Opcode
man ops
0253188
03/06/12 19:46ID:???Pelrのバージョンは、5.00503で、
Apache/1.3.26 (Unix) でした。
>>243で自分が言ったことで、間違いないでしょうか?
0254nobodyさん
03/06/12 20:26ID:???>>248を補足。
Perlは疑似インタプリタ言語。
実行の度にコンパイルして実行すると言う手順を踏む。
従って、先にコンパイルしておく全ての言語と比較して低速になる。
0256nobodyさん
03/06/12 20:29ID:???意味がわからない。
openもsystemも使いたくなければ使わなければいい。
もし、>>242が鯖管だったとしたら、
その程度の能力しかなくて鯖なんか扱うなとマジで忠告する。
0258nobodyさん
03/06/12 20:38ID:???読みました。
$message =~ s/\n/<br>/g;
みたいな簡単な構文じゃ無理なんですね。
私にはまだ理解できそうにないです。
0259nobodyさん
03/06/12 20:43ID:???少々逆説的だが、
あれを読んで理解できないと匙を投げるくらいの動機しかないなら、
むしろはじめからやらない方がいい。
よって、やらないでいるのは結果的に正解。
0260nobodyさん
03/06/12 20:51ID:???さじを投げたのではなくて、もっと勉強しなければいけないな、と思ったという意味だったんですけどね。
なんかマイナスに解釈されたようですが、お気を悪くさせたようですみません。
0263nobodyさん
03/06/12 21:37ID:xj4xPJ4f-s 消しても同じ結果なんですが…。
0264nobodyさん
03/06/12 22:01ID:???>return($newls2[0]); # 最高番号検出
さすがレスキュー・・・・
0265nobodyさん
03/06/12 22:27ID:???何個か数字があってその中から最高値を取り出せって言われたら
オレもソートさせちゃうけど・・・楽だし。
自分で、一個ずつ比較させる処理書いてもいいけど・・・
0266nobodyさん
03/06/12 23:27ID:???0267nobodyさん
03/06/12 23:47ID:xj4xPJ4fActivePerl5.8.0最新版でもNGでした。
誰か、暇な方、試して頂けないですかね…
0268nobodyさん
03/06/12 23:53ID:???0269nobodyさん
03/06/12 23:54ID:???FlashCGIつかっているのですが、こっちと、トリプが合いません。
新サバではないとおもいます。。。
はじめの2文字って「H.」から何かに変わったんでしょうか?
0274nobodyさん
03/06/13 00:28ID:???A > B ←これはAが大きいと真をかえすのだ
0275nobodyさん
03/06/13 00:35ID:nrl/A00ghttp://www.k-514.com/
0276nobodyさん
03/06/13 00:41ID:???実際のところは計測しなきゃわからないが。
0277nobodyさん
03/06/13 00:44ID:???0278nobodyさん
03/06/13 00:58ID:???0280nobodyさん
03/06/13 01:49ID:???$max = $_ if($_ > $max);
}
これが一番早くてメモリも使わず?
0281nobodyさん
03/06/13 01:57ID:???0282nobodyさん
03/06/13 02:08ID:???0283nobodyさん
03/06/13 02:12ID:???はて? perlgutsにもperlembedにもinterpreterと書いてあるが何か?
>>279
こういう恣意的なデータも取れるんだよ。
use Benchmark;
@ar = (1 .. 5);
timethese(10000, {
sort => '@br = sort { $b <=> $a; } @ar',
loop => '$max = $ar[0]; for (@ar[1..$#ar]) { $max = $_ if ($_ > $max);}'
});
Benchmark: timing 10000 iterations of loop, sort...
loop: 2 wallclock secs ( 2.23 usr + 0.01 sys = 2.24 CPU)
sort: 3 wallclock secs ( 1.98 usr + 0.00 sys = 1.98 CPU)
0284nobodyさん
03/06/13 02:19ID:???0285
03/06/13 08:01ID:???0286nobodyさん
03/06/13 08:01ID:???0287nobodyさん
03/06/13 09:29ID:???外部ファイルにして、requireするにせよ、useするにせよ、
perlは、皆コンパイルするということなんですが、
以下のようにするより、
use Hoge;
if (...) {
kore; # koreはmainの関数
} else {
are; # areはHoge.pmの関数
}
以下のようにした方が負担が減るということでしょうか。
if (...) {
kore;
} else {
use Hoge;
are;
}
0288287
03/06/13 10:01ID:???前提です。そして、ifになる確率が50%はあるとして。
0289nobodyさん
03/06/13 10:19ID:???useの場合は一緒じゃない?
requireなら、そうやったほうがいい。(require文が実行された時点で読み込むから)
0290287
03/06/13 10:31ID:???うん、こういうの書いた覚えあるんで、正しい判断だったんだと
わかってほっとしますた。
0291nobodyさん
03/06/13 11:18ID:???-----BEGIN PGP MESSAGE-----
Version: PGP 6.5.8ckt - ja http://www.hizlab.net/pgp/
qANQR1DDDQQDAwKzdZAaYlhVL2DJvuMRq1Krlrlnei+qaIGlODje1KRbdRDVTD1/
h7dQ6RfnS3GkGv2RNdvpZgVvgQqkSXcM3N8o9AkvtrmRtO3BsJJ1id5RArQwjmEE
kVXhF6Y5HdeQfOOTRjTMV2kS0i27sza8Gv+g+uFFTozzmsJ2ffbmrUi/K4MjsNnN
yh/mrKF/MkenFZqjnQobAHmjqzYxj8VMyx31Ar1GM4g/2UiEtAErfz//cJCJ0zsB
akVGj67i/wWnQoZgYVxe1sSyT/0=
=+BHl
-----END PGP MESSAGE-----
0292nobodyさん
03/06/13 11:41ID:???Namazuの仕組みを調べればいいんでしょうが、もっと簡単に
モジュール組み込んで、テキストファイル検索するみたいに、
バリバリ、正規表現検索がしたいのれす。
なにか情報の載っているサイトでもいいですから教えてくらはい。
0293nobodyさん
03/06/13 12:41ID:1CoOWAYzCGI.pmはmultipart/form-dataで送られたきたデータを受け取ると、
即座に一時フィルを作成するようなんですが、
このファイルを削除するか、ファイルを作成しないようにする方法はないですか?
0294nobodyさん
03/06/13 12:50ID:???Wordファイルの仕組みを調べれば、簡単じゃないことが分かるよ。
とりあえずバイナリエディタで開いてみ。
Namazuを使いたいってことなら、wordファイルからテキスト部分を抜き出して
インデックス作ればいいからそっちのやり方だと簡単かも。
>>293
全然CGI.pmの中身も見ずに反応するけど、
最後にファイル削除されないの?
ファイルを作成しないってことはメモリに全部蓄えるつもり?
予測可能なファイル名になっちゃうのなら問題だろうけど、
予測不可能なファイル名になってない?
0295nobodyさん
03/06/13 13:24ID:???use Benchmark;
$count= 100;
@array= (0 .. 5000);
timethese($count, {
'code1'=> q{
$max= $array[0];
for (1 .. $#array){
$max < $array[$_] and $max= $array[$_];
}
},
'code2'=> q{
@array2= sort {$b <=> $a} @array;
$max= $array2[0];
},
'code3'=> q{
$max= (sort {$b <=> $a} @array)[0];
},
'code4'=> q{
($max)= sort {$b <=> $a} @array;
}});
0296nobodyさん
03/06/13 13:43ID:U7lWej0Vhttp://endou.kir.jp/moe/linkvp.html
0297nobodyさん
03/06/13 14:45ID:???ActivePerlならWin32::OLEで、WordファイルをCOMオブジェクトとして開けば、
Wordオブジェクトのメソッドを呼び出せる。
ActivePerlじゃないならOLE::Storageで頑張る。
0298292
03/06/13 16:14ID:???wordファイルをバイナリエディタで開いて解析しようとしたが、
ちょっと漏れには無理だと悟って聞いたのです。大分前の話。
word2txtでwebを漁ってもぱっとしなかったし・・・
Namazuは、wordファイルも検索するって知ってる?つまり、
テキスト部分を抜き出すエンジンを備えているんじゃないかなぁ。
調べてみます。
>>297
うーん、ちょっとOLE::Storage見てみたけど、難しそうです。
Win32::OLEとかこれ使って、川合さんや極悪さんがExcelファイルを
簡単に扱えるモジュール書いてくれているんですが、やはり、word
は難しいんでしょうね。
0299nobodyさん
03/06/13 17:49ID:???> >>293
> 全然CGI.pmの中身も見ずに反応するけど、
> 最後にファイル削除されないの?
> ファイルを作成しないってことはメモリに全部蓄えるつもり?
> 予測可能なファイル名になっちゃうのなら問題だろうけど、
> 予測不可能なファイル名になってない?
それが、削除されないんですよ。
new CGIした時点で一時ファイルが作られて、
exit(0) or dieしても消えないんですよ。
どんどんファイルが増えていくのはちと問題ありかと。
0301nobodyさん
03/06/13 18:18ID:???その現象Windowsではなるよね
アップした際のファイルのファイルハンドルが開きっぱなしなのが原因
$q = new CGI;
$upfile = $q->param('upfile');
$tmpfile = $q->tmpFileName($upfile);#一時ファイル名取得CGItemp12345みたいな
〜処理〜
eval{close($upfile);}; #一応ファイルハンドル閉じる
unlink($tmpfile); #一時ファイル削除
0302nobodyさん
03/06/13 18:27ID:???保険として残ってたら削除ってことで。
ちなみにclose()をevalで囲っておかないと添付ファイルがない場合
特定のPerlのVerではエラーするよ
0303nobodyさん
03/06/13 18:29ID:???Linuxだが、
man: ??????????????????????
Failed to open the message catalog man on the path NLSPATH=<none>
No manual entry for CGI
0304299,293
03/06/13 18:31ID:???>>301
> >>299
> その現象Windowsではなるよね
> アップした際のファイルのファイルハンドルが開きっぱなしなのが原因
> $q = new CGI;
> $upfile = $q->param('upfile');
> $tmpfile = $q->tmpFileName($upfile);#一時ファイル名取得CGItemp12345みたいな
> 〜処理〜
> eval{close($upfile);}; #一応ファイルハンドル閉じる
> unlink($tmpfile); #一時ファイル削除
Thanks、解決しますた。
無料鯖なんで詳しく知らないけど、
環境変数見る限りではApache/1.3.27 (Unix) らしい。
でもunlink($tmpfile);しないと消えないんだよな・・・
0306nobodyさん
03/06/13 19:35ID:???わからないのですが。わかる方います?
0307nobodyさん
03/06/13 19:36ID:???0309nobodyさん
03/06/13 19:45ID:???#そのまま・・・
Benchmark: timing 500 iterations of code1, code2, code3, code4...
code1: 4 wallclock secs ( 3.98 usr + 0.00 sys = 3.98 CPU) @ 125.63/s (n=500)
code2: 5 wallclock secs ( 5.05 usr + 0.00 sys = 5.05 CPU) @ 98.97/s (n=500)
code3: 2 wallclock secs ( 1.37 usr + 0.00 sys = 1.37 CPU) @ 364.70/s (n=500)
code4: 1 wallclock secs ( 1.36 usr + 0.00 sys = 1.36 CPU) @ 367.65/s (n=500)
#@arrayをランダムに
Benchmark: timing 500 iterations of code1, code2, code3, code4...
code1: 2 wallclock secs ( 2.60 usr + 0.00 sys = 2.60 CPU) @ 192.23/s (n=500)
code2: 8 wallclock secs ( 7.98 usr + 0.00 sys = 7.98 CPU) @ 62.64/s (n=500)
code3: 4 wallclock secs ( 3.95 usr + 0.00 sys = 3.95 CPU) @ 126.71/s (n=500)
code4: 4 wallclock secs ( 3.93 usr + 0.00 sys = 3.93 CPU) @ 127.13/s (n=500)
#code1 を $max= $array[0]; for (@array){ $max < $_ and $max= $_ } に修正
Benchmark: timing 500 iterations of code1, code2, code3, code4...
code1: 1 wallclock secs ( 1.73 usr + 0.00 sys = 1.73 CPU) @ 289.02/s (n=500)
code2: 8 wallclock secs ( 8.03 usr + 0.00 sys = 8.03 CPU) @ 62.29/s (n=500)
code3: 4 wallclock secs ( 3.92 usr + 0.00 sys = 3.92 CPU) @ 127.62/s (n=500)
code4: 4 wallclock secs ( 3.90 usr + 0.00 sys = 3.90 CPU) @ 128.11/s (n=500)
0310nobodyさん
03/06/13 20:24ID:???いまさら言うのもアレだが、2chみたいにPATH_INFOを使って
hoge.cgi/fuga.jpgのようにすれば、IEなどを騙せ・・・たと思うけども。
0311188
03/06/13 21:06ID:???で、glob使わないで、
unlink(<tmp*>);と同じことする方法ってないですか?
0313nobodyさん
03/06/13 21:29ID:???普通に考えて、配列にはforeachが最速なんじゃないの?
$max = $array[0];
foreach my $array (@array) {
$max < $array and $max = $array;
}
0314nobodyさん
03/06/13 21:29ID:???0315nobodyさん
03/06/13 21:37ID:???$path = ".";
opendir(DIR, $path) or die;
unlink grep { /^tmp.*/ and -f "$path/$_" } readdir(DIR);
closedir(DIR);
0317315
03/06/13 22:02ID:???書いてから気が付いた。ごめん、適当に修正してくれ。
0318315
03/06/13 22:10ID:???unlink map { "$path/$_" } grep { /^tmp.*/ and -f "$path/$_" } readdir(DIR);
0319nobodyさん
03/06/13 22:14ID:???■ このスレッドは過去ログ倉庫に格納されています