トップページ⇒tech
1001コメント305KB

Perlについての質問箱 30箱目

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2007/03/14(水) 22:54:12
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

http://www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3

前スレ
Perlについての質問箱 29箱目
http://pc11.2ch.net/test/read.cgi/tech/1166708139/

リンク集は>>2-3
過去スレは>>4
08558502007/06/03(日) 19:28:12
853>>
入力と出力をprintして見比べてるけどマズかった?
0856デフォルトの名無しさん2007/06/03(日) 19:31:18
それは大いにマズい。
$jの文字コード/UTFフラグの有無で挙動が変わってくる。
08578502007/06/03(日) 19:37:59
>>854
入力、ソースはutf-8(のつもり)。
もしかしたら違うかもしれないから、入力のエンコード方式の調べ方があるなら教えてくれ。

>>856
マズいのか。
0858デフォルトの名無しさん2007/06/03(日) 19:49:23
use Devel::Peek;
Dump $j;
08598502007/06/03(日) 20:02:10
>>858
dumpの出力の読み方は?
ググってみたけど、どう読んでいいのかサッパリ。
0860デフォルトの名無しさん2007/06/03(日) 20:06:37
なんか要領がつかめないんだけど、
入力ソースはなんなわけ?
08618502007/06/03(日) 20:13:48
>>860
適当なサイトから拾ってきたフィード。
0862デフォルトの名無しさん2007/06/03(日) 20:18:46
binmodeでストリームに適当なレイヤをかぶせるか、
Encode::decodeに通して適切にutf-8フラグが立つようにせにゃならん。
08638502007/06/03(日) 22:06:39
>>862
$j = decode('utf-8', $j);
の1行通したらうまくいった。ありがと。
0864デフォルトの名無しさん2007/06/04(月) 13:51:27

ねえ。これから態度の悪い質問者には答えない様にしろよ。
付け上がって調子乗ってくるのがオチなんだからさ。
0865デフォルトの名無しさん2007/06/04(月) 14:05:21
俺が正規表現でボコボコにしてやんよ
 ∧_∧
 ( ・ω・)=つ≡つ
 (っ ≡つ=つ
 /   ) s/.*/ババババ/g
 ( / ̄∪
0866デフォルトの名無しさん2007/06/04(月) 14:35:29
>>864
付け上がっているのはどっちですか?
ここは質問箱でしょ?
質問してください、というスレなんでしょ?
質問者あってのスレなんですよ。
そんな逆切れ見たいなことを言っていないで、
質問してもらったら「質問してくださってありがとう」くらい言ったらどうですか!
0867デフォルトの名無しさん2007/06/04(月) 15:48:30
これは酷い釣り糸
0868デフォルトの名無しさん2007/06/04(月) 16:27:29
>>866
とっとと質問せんかボケ
0869デフォルトの名無しさん2007/06/04(月) 17:02:53
>>868
質問があったら質問しますよ。
自分の至らなさを指摘されたからって、急に喧嘩腰にならないでください。
頭の悪い人はいちいち無駄な書き込みをしなくていいです。
0870デフォルトの名無しさん2007/06/04(月) 17:07:09
>>866
何が質問者あってだよ。回答者があってだろ。
回答者が居ないと何も出来ない癖に。
後 >>1 にも書いてあるけどここは "Perlの奥深さについて皆で語り合い、追求する"スレ。
低レベルな質問と会話はwebprog板でお願いします。
0871デフォルトの名無しさん2007/06/04(月) 17:14:03
>>869
無いんなら今すぐ作れや
俺は無職で一日中暇なんじゃアホ
0872デフォルトの名無しさん2007/06/04(月) 17:15:39
「>>1 にも書いてあるけど」などという書き出しで
あたかも「みんなの意見」であるように強調しておきながら、
結局はラスト1行で単なる頭の悪い煽り屋さんであることをばらしてしまっていますね。

何だかんだいいつつ、自分の「低レベルな会話」は全面的に許してしまっている時点で、
説得力はゼロですね。修行を積んで出直しましょう。
0873デフォルトの名無しさん2007/06/04(月) 17:19:05
>>871
暇なら自分で質問を作って自分で回答していればいいじゃないですか。
内容によっては決して無意味ではありませんよ。
高度な質問と高度な回答をセットで提供するぶんには、結構喜ばれると思います。

とはいえ、無職の能無しがそういう問答を自演するのは難しいでしょうが…。
0874デフォルトの名無しさん2007/06/04(月) 17:21:42

皆の意見として言ったつもりは無いな。建前のような物。
ついでに俺は許してないよ? WebProgに案内してるだけ。
お前も個人叩きをするタダの頭の悪い煽り屋にしか
見えないんだが、本文に対する反論は結局ナシなのかな?
0875デフォルトの名無しさん2007/06/04(月) 17:28:38
>>874
なるほど、自分で自分を許していないのですね。
ではあなたが黙れば解決です。あなたにできる最大の「低レベルな会話の排除」ですね!

あと、「本文」というのは面白い言い方だと思います。
相手に突っ込まれて、いかに馬鹿なことを言っていたかが自覚できた途端に
そこを蜥蜴の尻尾みたいに切り捨てて、「ノーダメージだよーん」ということにするのですね。
0876デフォルトの名無しさん2007/06/04(月) 17:34:27
どうでもいい議論はよそでやれよ。
0877デフォルトの名無しさん2007/06/04(月) 17:40:23
定期的に沸いてる奴だろw
ほっとけ
0878デフォルトの名無しさん2007/06/04(月) 17:53:57
>>875
んーそうじゃないな。あくまでwebprog板でやれと希望してるだけだ。
本文って言い方そんなに面白いかな? お前に言われた事は自覚した、
とする。その次の段階の話だ。その次の話が出来なければただの
煽り合いで終わってしまうだろう? 後俺は120%黙る気は無いので宜しく。
0879デフォルトの名無しさん2007/06/04(月) 17:55:19
>>864-878
お前らまとめて詞ね
0880デフォルトの名無しさん2007/06/04(月) 18:01:04
>>878
低レベルな質問と会話はwebprog板でお願いします。
0881デフォルトの名無しさん2007/06/04(月) 18:07:51
まぁ、こんなもんでしょう。
「ここは "Perlの奥深さについて皆で語り合い、追求する"スレ」であるという理由で
「低レベルな質問と会話はwebprog板でお願い」していた人間も、
つまらないプライドをちょっと傷つけられたら、Perlの奥深さとまるで関係のない低レベルな会話だと自覚しつつも
「120%黙る気は無い」とまで言い切ってしまうのですよ。

俺はやっていいけどお前はダメ、の精神で物事を動かせると思ってるボクちゃんってこんな感じなんです。
0882デフォルトの名無しさん2007/06/04(月) 18:14:12
スーパーキチガイタイム
0883デフォルトの名無しさん2007/06/04(月) 18:14:54

なんか、ここぞとばかりに言い負かそうとしてるが、それも違う。
俺は毎回このスレで変な奴が出る度に相手してやってるし、
俺自身もwebprogに行く気なんかハナから無い訳で。本音と建前ってやつだな。
ついでに言うとさっさと僕の"本文"に反論してくれませんか。
0884デフォルトの名無しさん2007/06/04(月) 18:17:40
webprog板じゃなくてもいいから議論なら他スレでやれよ
0885デフォルトの名無しさん2007/06/04(月) 18:18:35
>>883
相手すんないっとるんじゃボケ。
0886デフォルトの名無しさん2007/06/04(月) 18:34:14
> 俺は毎回このスレで変な奴が出る度に相手してやってるし、

やめてください。
0887デフォルトの名無しさん2007/06/04(月) 18:43:06
>>883
> 俺は毎回このスレで変な奴が出る度に相手してやってるし、

かんべんして(><;)
0888デフォルトの名無しさん2007/06/04(月) 19:08:39
これだな。
ttp://www.so-net.ne.jp/vivre/kokoro/psyqa1087.html
0889デフォルトの名無しさん2007/06/04(月) 19:33:07
自分が一番変な奴だという自覚が無いんだなw

こんだけ嫌われまくってもきづかないほうに賭ける
0890デフォルトの名無しさん2007/06/04(月) 20:04:26
殆ど一人でやってるように見えるんだけど。
0891デフォルトの名無しさん2007/06/04(月) 20:18:16
>>890
ということにしたいわけですね。
0892デフォルトの名無しさん2007/06/04(月) 20:22:43
バレたか・・・
0893デフォルトの名無しさん2007/06/04(月) 21:33:09
バロスw
0894デフォルトの名無しさん2007/06/04(月) 21:50:35
自演荒らしのImageMagick君ってこれと同一人物っぽいなw
http://www.gac.jp/article/index.php?stats=question&category=12&id=20208&command=msg
2chなんかに来ずにここで教えてクン続けてればよかったのに
0895デフォルトの名無しさん2007/06/04(月) 21:59:04
さすがにそこまでストーキングっぽいことしなくてもいいのに・・・
0896デフォルトの名無しさん2007/06/04(月) 22:45:50
>>894
どっちもImage-Magi'c'になっててワラタ
借りてる鯖はlolipopかな?
0897デフォルトの名無しさん2007/06/04(月) 23:15:20
質問します!

open FH,"/hoge/hoge.txt" #hoge.txtを開く
while (<FH>) { #FHファイルを行単位で読み込んでいく
   $Str = $_; #変数Strにデフォルトで入力やパターンマッチになる特殊変数を代入
if( $Str =~ /__\w+__/g ){ #�@???
if( $Str =~ /__KEYWORD__/ ){ #�A???
$Str =~ s/__KEYWORD__/KEY/; #__KEYWORD__をKEYに置換する
}
}
print $str;
}
close FH;

コメントの部分の�@と�Aの説明がうまくできません。
�@は=~の部分がわからず、�Aは/と/で挟まなくて__KEYWORD__だけでも
同じ結果が返ってくるのではないかと思って悩んでいます。
よろしかった教えて頂けないでしょうか?
0898デフォルトの名無しさん2007/06/04(月) 23:24:58
%hoge;

$age = {%hoge};

というコードがあった場合、最後の代入で行われているのは
無名ハッシュコンストラクタの中でハッシュを評価することで、ハッシュのキーと値
からなるリストが生成され、それらを要素とする無名ハッシュが生成されて、そのリファレンスが
$ageに代入される。つまり%hogeのコピーのリファレンスを代入しているという考えでいいんでしょうか?
0899デフォルトの名無しさん2007/06/04(月) 23:46:46
>>897
Perl 正規表現でググればウンザリするほど答えが見つかると思います

>>898
そうです
0900デフォルトの名無しさん2007/06/04(月) 23:47:18
なるほど、自分で自分を許していないのですね。
ではあなたが黙れば解決です。あなたにできる最大の「低レベルな会話の排除」ですね!

あと、「本文」というのは面白い言い方だと思います。
相手に突っ込まれて、いかに馬鹿なことを言っていたかが自覚できた途端に
そこを蜥蜴の尻尾みたいに切り捨てて、「ノーダメージだよーん」ということにするのですね。
0901デフォルトの名無しさん2007/06/05(火) 00:05:57
>>897
なんかすごい無駄だらけなソースだなあ・・・
0902デフォルトの名無しさん2007/06/05(火) 00:31:50
ノーダメージだよーん
0903デフォルトの名無しさん2007/06/05(火) 00:33:23
>>900
なんかすごい無駄だらけな文だなあ・・・
0904デフォルトの名無しさん2007/06/05(火) 00:42:53
なんかすごい無駄だらけなスレだなあ・・・
0905デフォルトの名無しさん2007/06/05(火) 00:48:01
粘着荒らし酷いな
0906デフォルトの名無しさん2007/06/05(火) 00:52:00
粘着した方が勝ち!
0907デフォルトの名無しさん2007/06/05(火) 01:14:38
ノーダメージだよーん
0908デフォルトの名無しさん2007/06/05(火) 01:34:33
荒らしはやめてー><
0909デフォルトの名無しさん2007/06/05(火) 04:03:09
変な奴が現れたら一人も漏らさず全部相手するように
それがこのスレのお約束
0910デフォルトの名無しさん2007/06/05(火) 09:34:09
>>909
お前、もう帰っていいぞ。
0911デフォルトの名無しさん2007/06/05(火) 10:21:08
次スレのテンプレのことについて、次の提案があるのだが、どうだろうか?

1.過去スレを入れるのはやめる。(前スレだけがあればよいと思う)
2.「エラーなどの問題への対処の相談には、問題が再現する完全かつ最短のソースを
  作成して下さい。作成する過程で問題が解決する場合も多いです。」
との注意書きを >>1 に入れる。
(質問者が必要な情報を小出しにするのを防ぐため)
3.>>10をテンプレを入れる(但し、内容は、以下のように少し変更する)。
---------------------------------------------------------
#  【Perl 日本語処理の基礎の基礎】
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。
# 入出力ともシフトJIS形式のファイルまたはDOS窓を想定しています。
# まず、以下の行を先頭に入れて下さい。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
# 次に、あなたが実行したい処理の内容を入れて下さい。
print "SJISには、「十表貼申予暴」のようなダメ文字がある。\n";
sleep(1);
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。
0912デフォルトの名無しさん2007/06/05(火) 11:44:29
あれ?過去スレ保管所みたいなのなかったっけ?
0913デフォルトの名無しさん2007/06/06(水) 12:20:20
ttp://namahage.dip.jp/blog/archive/2007/06/06/98399.aspx
0914デフォルトの名無しさん2007/06/06(水) 19:43:33
podやpod2htmlとかで検索していたら、クロスリファレンスという言葉が出てきたのですが
クロスリファレンスで検索してもよくわかりませんでした。
このことに関することが書かれているウェブサイトや文献があったら教えてほしいです。
よろしくお願いします。
0915デフォルトの名無しさん2007/06/06(水) 20:07:20
>>914
naoya さんとこの循環参照の解説嫁ば?

ttp://d.hatena.ne.jp/naoya/20051012/1129115986
cross reference って日本語にすれば相互参照で、現実のプログラム中では
ぐるぐる回っちまうから、、、てことで
相互参照、循環参照あたりでググるのもありって事で。
0916デフォルトの名無しさん2007/06/06(水) 20:24:49
podでクロスリファレンス言うたら L<> のことちゃうのん?
0917デフォルトの名無しさん2007/06/06(水) 20:38:18
orz...
0918デフォルトの名無しさん2007/06/06(水) 21:11:42
質問〜

print my@aaa=(5,5,5,5,5);
print my@bbb=(3,3,3,8,8,8);
↑
これと、
↓
print my@aaa=(5,5,5,5,5);
print @aaa=(3,3,3,8,8,8);

↑

下のほうは使い終わった(もう処理しない予定の)@aaaを再利用しています。
上のやつと下のやつはどっちのほうが処理早いですか?
0919デフォルトの名無しさん2007/06/06(水) 21:23:16
どっちもどっち
好きに使え
0920デフォルトの名無しさん2007/06/06(水) 21:26:15
>>918
use Benchmark;

timethese 1000000, {
test1 => sub {
my@aaa=(5,5,5,5,5);
my@bbb=(3,3,3,8,8,8);
},
test2 => sub {
my@aaa=(5,5,5,5,5);
@aaa=(3,3,3,8,8,8);
}
};
0921デフォルトの名無しさん2007/06/06(水) 21:26:27
print による時間ロスは等価だとして

use Benchmark qw(timethese) ;
sub op1 { my @one = 0 .. 10_000 ; my @two = 0 .. 10_000 ; }
sub op2 { my @one = 0 .. 10_000 ; @one = 0 .. 10_000 ; }
timethese( 1000, { op1 => 'op1', op2 => 'op2' } ) ;

Benchmark: timing 1000 iterations of op1, op2...
op1: 15 wallclock secs (13.92 usr + 0.26 sys = 14.18 CPU) @ 70.52/s (n=1000)
op2: 22 wallclock secs (19.87 usr + 0.38 sys = 20.25 CPU) @ 49.38/s (n=1000)
0922デフォルトの名無しさん2007/06/06(水) 21:32:11
>>920
後者のほうがちょっとだけ速いな
0923デフォルトの名無しさん2007/06/06(水) 21:35:42
>>919-922
�dクス
ベンチマークの方法示してくれて更にトンクス
09249142007/06/06(水) 22:51:21
>>915-917
L<> のところをしっかり読んでみたらクロスリファレンスってのがありました。
ハイパーリンクのようなものと見て問題ないでしょうか?

pod2htmlの解説でクロスリファレンスという言葉が出てきたときは、なにかこう
クロスリファレンスというものを記述すれば関連するpodがまとめて変換されたり
という、うれしい事が起こるのかななんて妄想してしまいました。(汗
(もともとそういうことができないかなと思って検索していたので・・・)

単純に文書間のリンクであるならば、簡単に理解できそうです。

どうもありがとうございました。
0925デフォルトの名無しさん2007/06/06(水) 23:53:10
>>921
これは面白いね。
sub op3 { my @one; @one = 0 .. 10_000; my @two; @two = 0 .. 10_000; }
を試したら更に遅くなった。

my @array = 0 .. 10_000;
sub op4 { my @one = @array; my @two = @array; }
sub op5 { my @one; @one = @array; my @two; @two = @array; }

は同じ程度の速度だから、 .. が遅くなるのかな。
0926デフォルトの名無しさん2007/06/07(木) 00:20:49
リファレンスというか、値を格納する番地を確保する時間の差じゃないかな?
sub op1 { my @one = 0 .. 10_000 ; my @two = 0 .. 10_000 ; }
sub op2 { my @one = 0 .. 10_000 ; @one = 0 .. 10_000 ; }
op2のほうの@oneの書き換え時には、既に値を格納する10000個の番地が出来てるから早くなる。
op1のほうは@oneの番地10000個の他に@twoの番地10000個を作ってるから遅くなるのかなと。

それならば、
my @array = 0 .. 10_000;
sub op4 { my @one = @array; my @two = @array; }
sub op5 { my @one; @one = @array; my @two; @two = @array; }
のop4とop5がほぼ同じスピードってのも納得できそう。(4も5も番地の数は同じ。)

新しく配列作るより、使わなくなった配列を再利用したほうがスピード上がるってことかな〜と。
再利用したほうがメモリ効率も良さ気。
0927デフォルトの名無しさん2007/06/07(木) 06:17:52
>>926
921 は「 op2 の方が遅い」って話しだぞ
0928デフォルトの名無しさん2007/06/07(木) 07:28:18
922のせいに違いない
0929デフォルトの名無しさん2007/06/07(木) 07:41:27
921 デフォルトの名無しさん sage 2007/06/06(水) 21:26:27
print による時間ロスは等価だとして

use Benchmark qw(timethese) ;
sub op1 { my @one = 0 .. 10_000 ; my @two = 0 .. 10_000 ; }
sub op2 { my @one = 0 .. 10_000 ; @one = 0 .. 10_000 ; }
timethese( 1000, { op1 => 'op1', op2 => 'op2' } ) ;

Benchmark: timing 1000 iterations of op1, op2...
op1: 15 wallclock secs (13.92 usr + 0.26 sys = 14.18 CPU) @ 70.52/s (n=1000)
op2: 22 wallclock secs (19.87 usr + 0.38 sys = 20.25 CPU) @ 49.38/s (n=1000)


922 デフォルトの名無しさん sage 2007/06/06(水) 21:32:11
>>920
後者のほうがちょっとだけ速いな
09309212007/06/07(木) 08:03:09
本要件で誤解を招くまねをした俺を晒すのは分るんだが、
920 の結果を 922 は正しくレスしてる。晒す意味が分らん。

% perl --
use Benchmark;
timethese 1000000, {
 test1 => sub { my@aaa=(5,5,5,5,5); my@bbb=(3,3,3,8,8,8); },
 test2 => sub { my@aaa=(5,5,5,5,5); @aaa=(3,3,3,8,8,8); }
};
^D
Benchmark: timing 1000000 iterations of test1, test2...
test1: 2 wallclock secs ( 1.47 usr + 0.00 sys = 1.47 CPU) @ 680272.11/s (n=1000000)
test2: 0 wallclock secs ( 1.37 usr + -0.01 sys = 1.36 CPU) @ 735294.12/s (n=1000000)
0931デフォルトの名無しさん2007/06/07(木) 09:13:36
>>930
ベンチマーク結果の見方が正しくわからんけど、
>>927-929が間違ってて、他のレスは正しい、でok?
0932デフォルトの名無しさん2007/06/07(木) 09:24:16
use Benchmark qw(timethese) ;
sub op1 { my @one = 0 .. 10_000 ; my @two = 0 .. 10_000 ; }
sub op2 { my @one = 0 .. 10_000 ; @one = 0 .. 10_000 ; }
timethese( 1000, { op1 => 'op1', op2 => 'op2' } ) ;

Benchmark: timing 1000 iterations of op1, op2...
op1: 4 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 312.21/s (n=1000000)
op2: 6 wallclock secs ( 4.89 usr + 0.00 sys = 4.89 CPU) @ 204.46/s (n=1000000)

>>930と逆の結果っぽいんだけどなんで??
つか最後の
@ 312.21/s (n=1000000)と
@ 204.46/s (n=1000000)って
どっちが早いの??
0933デフォルトの名無しさん2007/06/07(木) 09:39:36
実行環境によるって事じゃないのか
0934デフォルトの名無しさん2007/06/07(木) 10:05:22
>>932が回したのは>>921のコードで
>>930は>>921が回した>>920のコードだから。

>>932
op1: 1000 iterations / 3.20 CPU (sec.) = 312.21/s
op2: 1000 iterations / 4.89 CPU (sec.) = 204.46/s
な感じ。なんで n=1000000 なのか知らないけど。
0935デフォルトの名無しさん2007/06/07(木) 10:07:37
>>932
> op1: 4 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 312.21/s (n=1000000)
> op2: 6 wallclock secs ( 4.89 usr + 0.00 sys = 4.89 CPU) @ 204.46/s (n=1000000)

実時間で4秒かかった。ユーザ時間3.2秒、システム時間0秒=合計3.2秒。1秒で(1000回のループを)312.21回実行できた
実時間で6秒かかった。ユーザ時間4.89秒、システム時間0秒=合計4.89秒。1秒で(1000回のループを)204.46回実行できた

どっちが速いかわかるよな?
0936デフォルトの名無しさん2007/06/07(木) 10:41:11
>>935
理解しますた。
use Benchmark qw(timethese) ;
timethese( 10000, { op1 => 'op1', op2 => 'op2' } ) ;
sub op1 {for(0..100){my@aa=(5 x 50)}}
sub op2 {map{my@aa=(5 x 50)}(0..100)}

↑
forとmap、ほとんど差が無くて実行するたびに結果が逆転してますた。

ベンチマーク便利だぬ
0937デフォルトの名無しさん2007/06/07(木) 10:56:10
perl -de0 にて
x map { $_ => $_*$_ } 1..3 # OK: 1 1 2 4 3 9
x map { "a$_" => $_*$_ } 1..3 # NG: syntax error
x map { "a$_" , $_*$_ } 1..3 # NG: syntax error
x map { ("a$_" , $_*$_) } 1..3 # OK: a1 1 a2 4 a3 9
x map { +"a$_" => $_*$_ } 1..3 # OK: a1 1 a2 4 a3 9
x map ("a$_" => $_*$_), 1..3 # NG: a0 1 2 3
x map +("a$_" => $_*$_), 1..3 # OK: a1 1 a2 4 a3 9
x map +{ $_ => $_*$_ }, 1..3 # ??: {1=>1} {2=>4} {3=>9}

やっぱりPerlキモい
0938デフォルトの名無しさん2007/06/07(木) 11:24:34
普通じゃん
0939デフォルトの名無しさん2007/06/07(木) 11:59:55
my @one;
$one[10001] = undef;
my @s = 0..10000;
sub op1 { my @two = @s ; }
sub op2 { @one = @s ; }
sub op3 { @one = 0..10000; }
sub op4 { my @two; $two[10001] = undef; }

Benchmark: timing 1000 iterations of op1, op2, op3, op4...
op1: 2 wallclock secs ( 1.87 usr + 0.00 sys = 1.87 CPU) @ 534.19/s (n=1000)
op2: 2 wallclock secs ( 1.86 usr + 0.00 sys = 1.86 CPU) @ 536.77/s (n=1000)
op3: 3 wallclock secs ( 3.55 usr + 0.00 sys = 3.55 CPU) @ 282.09/s (n=1000)
op4: 1 wallclock secs ( 0.15 usr + 0.00 sys = 0.15 CPU) @ 6666.67/s (n=1000)
(warning: too few iterations for a reliable count)

時間がかかるのは .. (範囲演算子)。
メモリの領域確保は誤差範囲。
メモリコピーは、まあそれなりのコスト。
0940デフォルトの名無しさん2007/06/07(木) 12:02:42
というか、メモリコピーが一番の時間コスト要因だな。
0941デフォルトの名無しさん2007/06/07(木) 12:19:48
流れの中すみませんが、printf で質問です。
何番目の引数を使う、という様な引数の交換はできるでしょうか?

PHP でゆうところの次のものです。
> printf( "答えは%2$d" , 10, 11, 12 );
> 結果: 答えは11
0942デフォルトの名無しさん2007/06/07(木) 12:23:16
つperldoc -f sprintf

試せばいいのに
$ perl -e 'printf( q{答えは%2$d} , 10, 11, 12 );'
答えは11
09439412007/06/07(木) 12:29:51
>>942
早速ありがとうございます。
うっ、できた…。 そうか "" の中では$が変数判定されるんだった :Drz。
09449252007/06/07(木) 17:22:41
誤解を招きやすいレスを付けて悪かった。
>>921を面白いと感じたのは、op1の方がop2よりも4割も速かったから。

以下のコードで確認したところ、範囲演算子の速度が違っているみたい。

use Benchmark;
timethese undef, {
test0 => sub { my @aaa=0..10_000; },
test1 => sub { my @aaa; my @bbb=0..10_000; },
test2 => sub { my @aaa; @aaa=0..10_000; },
test3 => sub { my @aaa=0..10_000; my @bbb=@aaa; }
};

Benchmark: running test0, test1, test2 for at least 3 CPU seconds...
test0: 3 wallclock secs ( 3.02 usr + 0.00 sys = 3.02 CPU) @ 194.37/s (n=587)
test1: 3 wallclock secs ( 3.46 usr + 0.00 sys = 3.46 CPU) @ 187.57/s (n=649)
test2: 3 wallclock secs ( 3.35 usr + 0.00 sys = 3.35 CPU) @ 88.06/s (n=295)
test3: 4 wallclock secs ( 3.41 usr + 0.00 sys = 3.41 CPU) @ 86.51/s (n=295)

左辺にmyが付かないと内部で配列のコピーが余分に1回発生してるような速度になってる。
0945デフォルトの名無しさん2007/06/07(木) 18:14:18
範囲リストをよそに作ってからコピーしてるんだろうな
0946デフォルトの名無しさん2007/06/07(木) 18:27:25
>>944
test0とtest1がなぜこんなに差が出るのか謎だな。
0947デフォルトの名無しさん2007/06/07(木) 19:05:01
参考

# pen4 2.4 colinux This is perl, v5.8.8 built for i386-linux-thread-multi
Benchmark: running test0, test1, test2, test3 for at least 3 CPU seconds...
test0: 3 wallclock secs ( 2.09 usr + 0.98 sys = 3.07 CPU) @ 447.56/s (n=1374)
test1: 3 wallclock secs ( 2.94 usr + 0.28 sys = 3.22 CPU) @ 445.03/s (n=1433)
test2: 3 wallclock secs ( 3.12 usr + 0.11 sys = 3.23 CPU) @ 234.37/s (n=757)
test3: 3 wallclock secs ( 3.03 usr + 0.13 sys = 3.16 CPU) @ 220.89/s (n=698)

pen4 3.0 This is perl, v5.8.4 built for i386-freebsd-64int
Benchmark: running test0, test1, test2, test3 for at least 3 CPU seconds...
test0: 5 wallclock secs ( 3.22 usr + 0.00 sys = 3.22 CPU) @ 538.41/s (n=1733)
test1: 3 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 531.81/s (n=1691)
test2: 5 wallclock secs ( 3.23 usr + 0.01 sys = 3.23 CPU) @ 255.69/s (n=827)
test3: 4 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 260.74/s (n=825)

# セロリンD 2.8 This is perl, v5.8.8 built for i386-linux-thread-multi
Benchmark: running test0, test1, test2, test3 for at least 3 CPU seconds...
test0: 4 wallclock secs ( 3.23 usr + 0.00 sys = 3.23 CPU) @ 645.82/s (n=2086)
test1: 3 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 640.13/s (n=2042)
test2: 3 wallclock secs ( 3.15 usr + 0.00 sys = 3.15 CPU) @ 331.11/s (n=1043)
test3: 3 wallclock secs ( 3.15 usr + 0.00 sys = 3.15 CPU) @ 320.95/s (n=1011)
0948デフォルトの名無しさん2007/06/07(木) 19:43:32
今北産業
0949デフォルトの名無しさん2007/06/07(木) 19:46:26
my@a = 1..100; なら@aを確保して直に1..100で初期化するように最適化されるけど、
my@a;@a=1..100; だと、@aを確保してから(1..100)を生成して、@aにコピーしてるんだろうな。
0950デフォルトの名無しさん2007/06/07(木) 19:56:19
ベンチマーク厨乙
0951デフォルトの名無しさん2007/06/07(木) 20:49:53
XEON 3G This is perl, v5.8.8 built for i686-linux
test0: 3 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 801.88/s (n=2558)
test1: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 796.88/s (n=2550)
test2: 3 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 414.78/s (n=1319)
test3: 3 wallclock secs ( 3.17 usr + 0.00 sys = 3.17 CPU) @ 400.63/s (n=1270)
0952デフォルトの名無しさん2007/06/07(木) 21:43:01
速いCPUの自慢しやがって!
0953デフォルトの名無しさん2007/06/07(木) 21:56:39
C2Dとmacの結果も見たいです><
0954デフォルトの名無しさん2007/06/08(金) 12:17:03
質問です
gtk2-perl使ってるのですが、なんかいい開発環境ありますか?
今はgeditとlv使いながらやってますが関数追いかけるのが大変で…。
eclipseがいいのであれば使ってみようと思います。他におすすめなのがあればぜひ。
guiはglade使ってて不満はないです。
レス数が950を超えています。1000を超えると書き込みができなくなります。