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

Perl コーディング初心者質問コーナー Part36

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/07/14 13:23ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0545nobodyさん04/08/11 18:53ID:???
@arrayに格納されている全部の要素の文字列を置換したい時はどうやればいいんですか?

foreach my $foo (@array){
$foo=~s/aaa/bbb/;
}
とすると@arrayに書き戻せないですよね?

for (my $i=0; $i >= @#array; ++$i){
$array[i]=~s/aaa/bbb/
}
これでいけると思うんですけど、ほかにシンプルな方法はありますか?
0546nobodyさん04/08/11 19:05ID:???
>>545
いや、最初のでOKだと思うが。試してみたか?
0547nobodyさん04/08/11 19:45ID:???
近頃はmap使えないバカが多いのか
0548nobodyさん04/08/11 19:47ID:???
>>545
思い込みで試してなかったんですが
やってみたらうまくいきました

ポケットリファレンスを見て書き戻せないのかなぁと勘違いしてて
今オライリーで見直したらこの書き方でいけるってのがわかりました
054952904/08/11 19:48ID:???
>>544
ありがとうございます。いろんなサイトのpack,unpackの解説をみてますがやっと少しだけ理解できました。
print unpack"C*","\x41";
これは10進の65に当てられている文字列Aを10進の65に変換して返してるんですね。なので
print unpack"C*","A";
と同じ。でその逆がprint pack "C*",65;ってわけですね。

でもchar値int値long値short値というのは具体的にどういうものかがわかりません。
char値とは16進2桁、2進で言うと8桁=8ビット???自分で言っててよくわかりませんorz
pack TEMPLATE,LIST;
LISTをTEMPLATEのフォーマットでパックするみたいに解説されてますが、例えばH型(16進文字列)なら
"\x41" eq pack "H",41  で、内部的な流れも理解できる気がします。
C型はLISTを10進数での文字列で捉える?それを16進文字列に変換して返すみたいな・・・
なんか違いますよね。char値があってそれを利用してpackで10進数から16進数文字列に変換できるだけで
元々char値をそんなためにあるわけでもないですよね?

ぐぐてもchar値とはみたいなサイトが見つからないんですよねorz



0550nobodyさん04/08/11 19:57ID:???
map {s/aaa/bbb/} @foo;
おおこれは便利
055152904/08/11 19:57ID:???
mysqlのデータ型読んでたら・・・
char値 符号付
10進で言えば -128〜127
int値 符号付
10進で言えば -2147483648〜2147483647
short値 符号付
10進で言えば 不明
long値 符号付
10進で言えば 不明

結局扱える大きさが違うだけですか?でもそうなるとpackの型のC等の意味と内部的な処理内容がよくわかんないんですよね。
だんだんスレ違いになってきたので、後は自分で色々なサイトを読んでみます。
親切に対応してくださってありがとうございました。失礼します。
0552nobodyさん04/08/11 20:04ID:???
>>542
blobToimageでやってみました。
なぜかRGBでblobToimageやるとうまくいかないので、
PPMでやってヘッダだけ付け足したらできました。
まともな速さになりました。ありがとうございました。
0553nobodyさん04/08/11 20:09ID:???
>>545-548
これって漏れも初めて知ったんだけど怖くない?
map s/kuroguro/hage/,@family;
妄想の中で家族が全員はげたところを創造してみたら、現実にみんなはげちゃったーーーーー

って冗談じゃなく怖いな。
0554nobodyさん04/08/11 21:10ID:???
フォームから送られてくるデータって
%83%7E%83P%83l%83R
みたいになってますが、これは何エンコードなのでしょうか?
同じ形式でエンコードしたいのですが

$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$str =~ tr/ /+/;

では同じ形式にはならないです。(URIエンコードで調べて見つけたサイトに乗ってたコードです)

ちなみに
$value = '%83%7E%83P%83l%83R';
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
print $value;
>ミケネコ
です。
0555nobodyさん04/08/11 21:16ID:???
>>550
<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
戻り値をただ単に捨ててしまうような void 文脈で、grep()やmap()、
`backticks` (訳注: `ls`のようにバッククォートで括った実行文の
こと)を使うことは避けましょう。そういった関数はすべて戻り値を
持っているのですから、それを使うべきです。戻り値に用がない
のであれば、代わりにforeach()を使ったループか system()関数
を使いましょう。
</q>

s/aaa/bbb/ for @foo;

>>554
http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape
0556nobodyさん04/08/11 21:16ID:???
map {s/aaa/bbb/} @foo;
は戻値のためにバッファ用意されんのが無駄。
戻値いらんのなら、
s/aaa/bbb/ for @foo;
でええやろ。
055755604/08/11 21:17ID:???
かぶったorz
0558nobodyさん04/08/12 00:05ID:???
>>555-556
ベンチマークとってみた?
055955404/08/12 00:07ID:???
>>555
そのサイトを見て自分でやってみましたが、
$str = "ミケネコ";
$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$str =~ tr/ /+/;
では
%83%7E%83P%83l%83R
になりませんがどうすればよいですか?
0560nobodyさん04/08/12 00:18ID:???
>>554
文字コード
0561nobodyさん04/08/12 00:19ID:???
つーか、なりませんって言うならどうなったかぐらい書けよな
0562nobodyさん04/08/12 00:22ID:???
%83%7e%83%50%83%6c%83%52
ではヤダ、って話じゃないのかしら?
0563nobodyさん04/08/12 00:34ID:???
>>558
ベンチマークってメモリ消費量も分かるの?
0564nobodyさん04/08/12 00:57ID:???
>>556
map使っても無効コンテキストなら戻り値作らないはず。
0565nobodyさん04/08/12 01:02ID:???
%a5%df%a5%b1%a5%cd%a5%b3
になってしまう。という話かもしれん。
0566nobodyさん04/08/12 01:59ID:???
ソースの可読性まで考えてコーディングする人間には
map s/aaa/bbb/, @foo;
は生理的に気持ち悪いんだよ。
そんなこと気にも止めんorそこまで手の回らん奴には
分からん感覚さね。
速度が欲しけりゃCで書け。
0567nobodyさん04/08/12 02:03ID:???
>>566
お前が生理的に気持ち悪いだけだろ?
オレはそれは一種のイディオムだと思ってるので
別に読みにくいとは思わんし気持ち悪くもないよ。
0568nobodyさん04/08/12 02:10ID:???
>>566
可読性まで考えてっておかしくないか?
map { ブロック } リスト は普通の書き方だろ。
単にmapを使い慣れていないから見慣れないものを
気持ち悪いことにしてるとしか思えない。
0569nobodyさん04/08/12 02:25ID:???
{} ブロックをなるべく使わないようにする。
つーのもあるわな。(非効率)
0570nobodyさん04/08/12 02:37ID:???
>>566
禿同
0571nobodyさん04/08/12 02:43ID:???
可読性というより読解力が足りねーだけじゃんw
0572nobodyさん04/08/12 02:47ID:???
map って基本的に使う必要のない関数だったから今調べて見たんだけど、リストを返せる?

今回の問題でmapを使うのは変わった書き方と言われてるぞ(ゲラ
0573nobodyさん04/08/12 02:50ID:???
>>572
ふーん、普段もmap使わないの?
grepは?
まあどっちもリストを返せないわけがないけど。
0574nobodyさん04/08/12 02:54ID:???
>>572
変わった書き方というより使い方を知らないから使ってなかっただけでは?
057556604/08/12 04:08ID:???
>>568
書き方の問題じゃねえっての。理由は555に書いてあんだろ。
mapにはmapの使いどころってもんがあんの。
何でもmap使えばいいってもんじゃねえのよ。
仕事で人のコード読んだりコードレビューだのが増えてくると
自然と身につくんだよ。そういう感覚が。
0576nobodyさん04/08/12 07:52ID:???
Perlで仕事だって(プゲラ
057755404/08/12 10:02ID:???
%83%7E%83P%83l%83R
これはshift_jisだったんですね;すみませんでした。
ところでShift_JISの「ケ」は83Pになるみたいですが、これはどういうことでしょうか?
文字コード表を見てみたら、0x83,0x4Fの「グ」の一つ右側にあるので
0x83,0x4F+1で0x50?になるのかと思ってたんですが、0x83Pなんですね。

$str =~ s/([0-9a-fA-F][0-9a-fA-F])/pack("C",hex $1)/eg;
これでデコードするときにPは置換されませんよね?0x83で返してくる値にPを付けると
shift_jisではケになるんですか?ケの2バイト目は他とは違う扱い方がされてるんでしょうか?
057855404/08/12 10:04ID:???
$str =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex $1)/eg;
パーセントが抜けててごめんなさい。
0579nobodyさん04/08/12 10:05ID:???
P==0x50です。
つーかアスキーコード表読めよ
0580nobodyさん04/08/12 10:06ID:???
>>576
通説しか知らん素人の藻前には分からんだろうが、mod_perlを含め
Perl使ってるとこはまだまだ多い。
0581nobodyさん04/08/12 10:07ID:???
よっぽど小規模な仕事してんだろうね(プゲラ
0582nobodyさん04/08/12 10:15ID:???
別に100%PurePerlなわけじゃないだろうに・・・
Perlは大規模開発に向かないって誰が言ったんだろうね?
Perlの言語仕様なら何の問題も無いと思うんだけど。
0583nobodyさん04/08/12 10:25ID:???
Perlのまともにカプセル化もできないウンコOOで大規模開発ですか(プゲラ
0584nobodyさん04/08/12 10:35ID:???
変数の自動生成を抑制できないPHPより100倍マシな言語、それがPerl
0585nobodyさん04/08/12 10:37ID:???
mapとmoduloの2つの演算子から同じ匂いがする
0586nobodyさん04/08/12 10:39ID:???
>>584
えっと中規模以上の開発はPHPとかPerlじゃなくてJ2EEでやるんですよ(ワラ
0587nobodyさん04/08/12 10:40ID:???
>>583
カプセル化という名の強制隠蔽は、技術者のレベルと意識の低さを
言語仕様で補おうというもの。
決められたルールに厳重に従ってコーディングされるならば、
カプセル化は必要ない。
0588nobodyさん04/08/12 10:49ID:???
俺はPerlより開発効率のよい言語を知らない。
だから仕事でもPerlを使ってる。
さっさと作って儲けるのが第一なんで。
0589nobodyさん04/08/12 10:51ID:???
そりゃ一人開発ならPerlで十分だろ(プ
0590nobodyさん04/08/12 11:05ID:???
576=581=583=586=589
必死だなw
藻前らもうPerlのスレには来んでええぞ
0591nobodyさん04/08/12 11:35ID:???
>>587
それはさすがにいいすぎ。
効率よく手を抜く手段、くらいにしとこうよ。
059255404/08/12 11:38ID:???
>>579
ありがとうございます。しかしそれだと何故に
%83%7E%83P%83l%83R
が
%83%7E%83%P%83%l%83%R
にならないんでしょうか?「ミ」の文字はちゃんとバイトの前に%が付いているのに。


0593nobodyさん04/08/12 12:10ID:???
>>592
URLエンコーディングについて理解して下さい。
自分で何も出来ないんですか?
http://www.mars.dti.ne.jp/~torao/rfc/rfc1738-ja.txt
059455404/08/12 13:43ID:???
>>593
ありがとうございます。読んでみましたが、

>付加的に、8ビット文字は文字 "%" に続く 8ビット文字の 16進数値となる 2
>つの 16進数 ("0123456789ABCDEF") の 3文字により符号化される。(文字
>"abcdef" も 16進数符号化で使われるだろう。)

やはり%が付くと思うんですが、どうして%83%Pにでなく%83Pなのか理解できません
もしかして、元々shift_jisの「ケ」は"\x83","\x50"ですが、エンコード処理中に
先に"\x83"だけ置換されて、次は"\x50"になる。そしてその時に"\x50"=Pなので
/(\W)/単語構成文字以外に一致
Pは単語構成文字なので一致せずに処理が行われない。だから%もつかない。

そしてデコードでも処理はされないけど
"\x80","\x50"をshift_jisで読むと「ケ」と解釈する。

!?これで正解ですよね?
0595nobodyさん04/08/12 14:43ID:???
>>594
8ビット文字は、もしそれらが US-ASCII コード文字セット内の印字可能な文
字でない場合、その文字の使用が安全でない場合、もしくはそれが特殊な URL
スキーム内で何か別の処理のために予約されている場合に符号化されなければ
ならない。

印字可能な文字でないとは:

URL は US-ASCII コード文字セットの印字可能な文字でのみ記述される。8
ビット文字の 80-FF は US-ASCII で使われていない。そして 8ビット文字
00-1F と 7F は制御文字に相当する。これらは符号化されなければならない。

さっきの所のコピペ
059655404/08/12 15:01ID:???
>>595
要はPは印字可能な文字なので符号化する必要がないってことですね。
0597nobodyさん04/08/12 16:05ID:???
DBIなんだけど

$dbh = DBI->connect ($dsn,$user,$password,{ AutoCommit => 0 , RaiseError => 1 });
$sth = $dbh->prepare(
qq|select * from test|
);
$sth->execute;
@a = $sth->fetchrow_array;
jcode::convert(\$_ , "euc" ) foreach @a;
print $_,"<br>" foreach @a;
$dbh->disconnect;

みたいにしてtestテーブルから全レコードを引き出そうと思ったんだけど、何故か1行しか取り出せない。
一気に全レコード取り出すにはどうやればいいの?
0598nobodyさん04/08/12 16:12ID:???
$all= $dbh->selectall_arrayref(qq|select * from test|);
0599nobodyさん04/08/12 16:26ID:???
>>597
fetchrow_array は、
DBの1レコードを1つの array にして取り出すメソッドで、
array の各要素には1レコード中の各フィールドが入る

全レコードを取り出すときには >>598 のようにやるか
あるいは while で回すか
060059704/08/12 17:02ID:???
>>598
selectall_arrayrefがレコード全部をスカラで返してくるのかな?
でもこれSQL文を引数にしるんだな。なんかprepareしたいけど。
>>599
そういうことね。わかりやすい説明thx

ところでprepareって元々何のためあるの?XSS対策にサニタイジングしてくれるわけではないでしょ?
なんかprepareしておいたほうが安全だよって話をよく聞くんだけど。
0601nobodyさん04/08/12 17:06ID:???
>>600
prepareしたければfetchall_arrayrefってのもあるよ。
060259704/08/12 17:29ID:???
>>601
ありがととりあえず
$a = $sth->fetchall_arrayref;
から試したけど、この子はリファレンスの中にリファレンスでさらにリファレンス(これがfeachrow_arrayかな)が入ってるのね。
MySQLの中身がShift_JISで、perlはeucで出力はShift_JISだからちょっと面倒;

とにかくthx!
0603nobodyさん04/08/12 17:36ID:???
>>602
暇だからコーディングしちゃった^^
for ( $i=0 ; $i<$#{$a} ; $i++ ){
jcode::convert( \$_ , "euc" ) foreach @{$a->[$i]};
}
0604nobodyさん04/08/12 17:39ID:???
$i<=$#{$a}
か
$i<@$a
じゃない?
0605nobodyさん04/08/12 17:40ID:???
おまいらレン鯖にシェルでつないで
shell>perl -e "@array=qw/1 2 3 4 5/;
while(@array){print}"

とかしたことある?
060660304/08/12 17:42ID:???
>>604
フォローサンキュ!
0607nobodyさん04/08/12 17:46ID:???
>>603
この場合インデックスはいらないと思うので、

foreach (@$a) {
foreach (@$_) {
Jcode::convert(\$_, 'euc');
}
}

でいいんでねーの?
060859704/08/12 17:56ID:???
ものすごいことが起きたよ・・・・
せっかくだから遣わしてもらおうと思ったら
for ( $i=0 ; $i<=@{$a} ; $i++ ){
                jcode::convert( \$_ , "euc" ) foreach @{$a->[$i]};
}
多分こう書いた。

ループから抜けられず延々HDDがガリガリ(表現悪いけど、処理してる音);
なんとか再起動できたけど、よくエラーにならなかったなとceleron2.7GHz/xp
のすごさを確認したよw

ていうかなんでループから抜けられなかったんだ?もしかしたら
$i=@{$a}
って書いちゃったのかも;
0609nobodyさん04/08/12 18:02ID:???
>>608
もし本当にそう書いたのなら$iは常に最後の要素の次の添字に
なるから、無限に配列が拡張されていきそうだな....
061059704/08/12 18:04ID:???
>>607
それの方が安全そうwと思って試したけどできんかったよ?
それの後に
print $a;
で何も表示されず(リファレンスが表示されると思ったけど)
print @{$a};
でも何も表示なし・・・(リファレンスの配列が・・・)
print @[$a->[0]};
やっぱりだめで何も表示されず・・・・(実際のレコードの中身が・・・・)

603のやつではちゃんと表示されるけど、デリファレンスの方法が違うん?
061159704/08/12 18:07ID:???
>>609
というか$iの中に要素数が代入され、代入成功時の真を返し続ける・・・・・・・
0612nobodyさん04/08/12 18:15ID:???
>>609
その配列無限拡張って何かに使えないかな。
もちろんブロックの中に
last if @$a == 20;
みたいな制限をつけて。
0613nobodyさん04/08/12 18:32ID:???
そんなもんいっぺんに拡張した方が速いから使えない
0614nobodyさん04/08/12 18:36ID:???
>>613
いくつ拡張するかが未定な時には?
一応最大長は決めるが最小長は決めないみたいな場合なんかにつかえるかなと・・・;
駄目か。ごめんよ。
0615nobodyさん04/08/12 19:45ID:???
>>600-601
確か
selectall_arrayref()
ってちゃんとprepareされてるよ。自分でやるか自動でやるかの違い。
http://ash.jp/db/dbi_dbd.htm

でも配列よりハッシュで取り出したいよね。columns_nameをハッシュのキーにして。
$sth->fetchrow_hashref()
みたいなのがあると便利なんだけどしゃ。
0616nobodyさん04/08/12 19:58ID:???
>>615
http://search.cpan.org/~timb/DBI-1.43/DBI.pm#fetchrow_hashref
0617nobodyさん04/08/12 21:16ID:???
mapを知らなくてキレ、カプセル化が出来ないアフォな香具師が居るスレはここですか?
0618nobodyさん04/08/12 23:02ID:???
>>617
しつこいよ君。ここはそうやって他人を罵倒するスレじゃないんだよ。
0619nobodyさん04/08/12 23:04ID:???
今までずっと気になってたけど、fetchってなんて発音すればいいの?
フェッチ?フィーチ?なんかの略だよね?
0620nobodyさん04/08/12 23:06ID:???
>>619
fetch で辞書に載ってますよ。略語でなく。
たぶんフェッチが一般的だけど、読み方は好みで可。

スレ違っててごめんなさい...orz
0621nobodyさん04/08/12 23:12ID:???
map 知らないとかじゃなくて、ここでの論点は副作用を利用してることの方だろ?
>>566,567だけみるとそういう風に誤解されやすそうだけど。
ちゃんと元の投稿>>545 から関連する部分を読んでみよう。
0622nobodyさん04/08/12 23:25ID:???
@foo = map s/aaa/bbb/, @foo;
0623nobodyさん04/08/12 23:30ID:???
>>621
釣り乙
0624nobodyさん04/08/12 23:35ID:???
>>622
だからそこでmapを使うべきじゃないんだってば。
must notじゃなくてshould notね。
0625nobodyさん04/08/12 23:49ID:???
ちょっと乗り遅れたがPerlで大規模なシステムも使われてる
http://d.hatena.ne.jp/keyword/perl
あとどっかの記事によると国内のBlogレンタルサービスはほとんどスクリプト言語で書かれてるんだそうで
0626nobodyさん04/08/12 23:51ID:???
>>624
べきとかって、StrictHTMLじゃないんだから処理効率を最優先させることを非難してもしょうがないよ。
とりあえずもういいんじゃなかなこの話題は。自分の環境にあわせて好きにしようってことでさ。

一応俺の個人的な意見は、「どっちでもいい」だね。まあforeachの処理速度がmapより遅いからね。おやすみ
0627nobodyさん04/08/13 00:17ID:???
いちいち処理速度とか言っている人って気持ち悪い
個人で遊んでるんだから好きにさせて
0628nobodyさん04/08/13 00:23ID:???
>>626
>処理効率を最優先させることを非難してもしょうがないよ。
Perl使っときながら処理効率?はぁ?
んなこと言ってる奴のコードには必ずと言っていいほど
他に見直すべき部分があるんだよな。

>>622
>@foo = map s/aaa/bbb/, @foo;
mapによって@fooは置換済みなのに何で入れ直すの?
mapの動作理解してるか?
062957004/08/13 00:29ID:???
あの一般的にいってmapのvoid.contextより、forの方が早いんですけど。。。
なんか可読性だけで遅いってことになっているような。

use Benchmark;

timethese(-3,
{
map => sub{
my @list = 1..1000;
map { $_ *= 2 } @list;
},
for => sub{
my @list = 1..1000;
$_ *= 2 for @list;
},
}
);
__END__
Benchmark: running for, map for at least 3 CPU seconds...
for: 4 wallclock secs ( 3.13 usr + 0.01 sys = 3.14 CPU) @ 1504.78/s (n=4725)
map: 3 wallclock secs ( 3.00 usr + 0.01 sys = 3.02 CPU) @ 745.27/s (n=2247)

0630nobodyさん04/08/13 00:35ID:???
>>628
いるんだよな、まともなアルゴリズムも組めないくせに
最適化とか言って部分的な高速化にこだわる奴。
ま、素人相手にムキになりなさんな。
063157004/08/13 00:38ID:???
ちなみにmapをvoid.contextでつかってもlistは作られないようだ。perl 5.8.1から(英語は苦手だが。。。)


What's wrong with using grep in a void context?
The problem is that grep builds a return list, regardless of the
context. This means you're making Perl go to the trouble of building a
list that you then just throw away. If the list is large, you waste both
time and space. If your intent is to iterate over the list, then use a
for loop for this purpose.

In perls older than 5.8.1, map suffers from this problem as well. But
since 5.8.1, this has been fixed, and map is context aware - in void
context, no lists are constructed.
0632nobodyさん04/08/13 00:50ID:???
>>629
同じ事を書こうとして先越されたので、ヴァージョンでの差異も含めて追試。

#--- test.p ---
use Benchmark;
@Str = ((qw(aaa bbb ccc aaabbb cccaaa)) x 100);

timethese(-5, {
  for => sub { my @str = @Str; s/aaa/bbb/ for @str },
  grep => sub { my @str = @Str; grep s/aaa/bbb/, @str },
  map => sub { my @str = @Str; map s/aaa/bbb/, @str },
});
__END__

・ActivePerl 5.8.4 Build 810
for: 6 wallclock secs ( 5.71 usr + 0.00 sys = 5.71 CPU) @ 660.25/s (n=3770)
grep: 6 wallclock secs ( 5.65 usr + 0.00 sys = 5.65 CPU) @ 667.26/s (n=3770)
map: 6 wallclock secs ( 5.49 usr + 0.00 sys = 5.49 CPU) @ 656.83/s (n=3606)

・ActivePerl 5.005_03 Build 522
for: 5 wallclock secs ( 5.06 usr + 0.00 sys = 5.06 CPU) @ 782.81/s (n=3961)
grep: 5 wallclock secs ( 5.00 usr + 0.00 sys = 5.00 CPU) @ 808.60/s (n=4043)
map: 6 wallclock secs ( 5.38 usr + 0.00 sys = 5.38 CPU) @ 440.33/s (n=2369)

わざわざ副作用を使おうとするひねくれた子には grep を勧める。
「grep より map の方が読み易い」というのは当然無しだよ。:p
0633nobodyさん04/08/13 01:06ID:???
>>632
追加ということで。(Vine 3.0)

This is perl, v5.8.2 built for i386-linux-thread-multi
Benchmark: running for, grep, map for at least 5 CPU seconds...
  for: 5 wallclock secs ( 5.28 usr + 0.01 sys = 5.29 CPU) @ 848.77/s (n=4490)
 grep: 5 wallclock secs ( 5.29 usr + 0.00 sys = 5.29 CPU) @ 808.32/s (n=4276)
  map: 21 wallclock secs ( 5.44 usr + 0.02 sys = 5.46 CPU) @ 744.69/s (n=4066)

This is perl, v5.8.5 built for i686-linux
Benchmark: running for, grep, map for at least 5 CPU seconds...
  for: 6 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 1241.79/s (n=6656)
 grep: 5 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 1261.10/s (n=6646)
  map: 5 wallclock secs ( 5.35 usr + 0.01 sys = 5.36 CPU) @ 1216.98/s (n=6523)
0634nobodyさん04/08/13 01:10ID:???
速度でごちゃごちゃうるさいな
perl使ってる時点で速度とか捨てろよ
何か反論できなくなるとすぐベンチ厨だもんな
これだからまいるよ
0635nobodyさん04/08/13 01:20ID:???
コーディングセンスけなされて、速度でも負けちゃあ
そらまいるわなw
0636nobodyさん04/08/13 01:27ID:???
>>596
自分でも書いているように、
正確には「印字可能」だからではなく、
単に \W にヒットしないからそのままPなだけ。

逆に、符号化する必要のない - とかまで符号化されちゃうけどね。
判って使う分には\Wで手抜きするのもOKなり。
0637nobodyさん04/08/13 02:22ID:???
まあ俺はどっちでもいいがな
0638nobodyさん04/08/13 03:48ID:???
可読性の話じゃなかったのか。
戻り値やパフォーマンス、効率、map/forに限らず
副作用を期待したコードは出来るだけ避けた方が良いと思うんだけど。

>>628
>>622はmapの副作用の有無に関わらず、
@fooが変更されたと言うのがコードから読みとれる。
そもそも、そう言った用途にmapを使うなって話なら同意だけど、
もしmapを使うとしたら配列が変更されたのを明示するって例だと思う。

perl以外の言語を使っている立場から見ると、
mapが勝手に配列の要素を変更するのが気持ち悪いんじゃないかな?
例えば次のコード例で、barの引数 @data にはどんな値を期待するか。

foo(map s/A/B/, @data);
bar(@data);
0639nobodyさん04/08/13 04:15ID:???
例えが悪かった
map{s/A/B/; $_}@data としないと期待通りにならないね。 >>622
0640nobodyさん04/08/13 04:23ID:???
いちいち処理速度とか言っている人って気持ち悪い
藻前はTemplate::HTMLとか使わないで全部自分でHTML printするのかと。
0641nobodyさん04/08/13 05:03ID:???
>>638
可読性の話だよ。>>555 にあるように Perl コミュニティ的には、
何をしているのか分かり易くする為、副作用のみを利用する
ようなコーディングを奨めていない。

しかし (Perl スクリプトという手段の中で) 速度の為に可読性
を犠牲にしなければならない場面というのは確かにある。でも
そういう時でさえ map でやる意味が無い、という事をベンチ
マークが示している。それを理解できない子が吠えてるだけ。

>>640
HTML::Template の仕様が気持ち悪いから必要充分なものを
再発明、というのはありじゃないかな。
0642nobodyさん04/08/13 05:18ID:???
>>629
1.関数の一番最後の式は戻り値になるのでvoid contextじゃない。
2.mapの方だけブロックにするのは不公平。

use Benchmark;

timethese(-3,
{
map => sub{
my @list = 1..1000;
map $_ *= 2, @list;
1;
},
for => sub{
my @list = 1..1000;
$_ *= 2 for @list;
1;
},
}
);

Benchmark: running for, map for at least 3 CPU seconds...
for: 4 wallclock secs ( 3.23 usr + 0.00 sys = 3.23 CPU) @ 1535.91/s (n=4961)
map: 4 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 1577.47/s (n=5111)
064357004/08/13 05:33ID:ZD4WTWGN
>>642
確かにね。投稿してからきずいたよ。
ただ、ベンチとったら633と同じような結果だったからどうでもいいと思ったんだ。
その2点に注意して、
Benchmark: running for, map for at least 5 CPU seconds...
for: 6 wallclock secs ( 5.42 usr + 0.00 sys = 5.42 CPU) @ 1520.10/s (n=8242)
map: 5 wallclock secs ( 5.03 usr + 0.00 sys = 5.03 CPU) @ 1534.68/s (n=7721)

C:\home\tenho\lavoratory\form>3.pl
Benchmark: running for, map for at least 5 CPU seconds...
for: 5 wallclock secs ( 5.42 usr + 0.00 sys = 5.42 CPU) @ 1520.10/s (n=8242)
map: 6 wallclock secs ( 5.50 usr + 0.02 sys = 5.52 CPU) @ 1486.58/s (n=8200)

C:\home\tenho\lavoratory\form>3.pl
Benchmark: running for, map for at least 5 CPU seconds...
for: 5 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 1529.42/s (n=8005)
map: 5 wallclock secs ( 5.48 usr + 0.00 sys = 5.48 CPU) @ 1495.26/s (n=8200)

C:\home\tenho\lavoratory\form>3.pl
Benchmark: running for, map for at least 5 CPU seconds...
for: 6 wallclock secs ( 5.50 usr + 0.00 sys = 5.50 CPU) @ 1502.36/s (n=8263)
map: 6 wallclock secs ( 5.53 usr + 0.00 sys = 5.53 CPU) @ 1482.28/s (n=8200)
0644nobodyさん04/08/13 05:44ID:JjTi/TTm
perlの掲示板スクリプトで、書き込みを終えた後ブラウザの「戻る」でバックした時に「クッキーの有効期限が〜」と出てさらに更新すると二重書き込みになってしまうのですがこれを防ぐ方法を御教授いただけませんでしょうか。
まったくの暗中模索状態なので検索ワードだけでもお教えいただければ幸いです。
よろしくおねがいします。
■ このスレッドは過去ログ倉庫に格納されています