webprog板でgrepとmapだとgrepの方が早いという意見があり確認してみました。 for >= grep > mapって感じみたいなのですがなんでmapだけこんなに遅いのでしょう? ■テストコード use Benchmark qw/cmpthese/; use strict; use warnings; my $LOOP = 100; my @SEED = ('a'..'z','A'..'Z',0..9); my @DATA = map {$SEED[int rand @SEED]} 1..10000; my %TABLE = map {$_=>$SEED[int rand @SEED]} @SEED; cmpthese($LOOP, { #非破壊 'map1' => sub {my @hoge = map { $TABLE{$_} } @DATA; 1;}, 'grep1' => sub {my @hoge;grep push(@hoge,$TABLE{$_}),@DATA;1;}, 'for1' => sub {my @hoge;push(@hoge,$TABLE{$_}) for(@DATA);1;}, #破壊 'map2' => sub {map {$_=$TABLE{$_}} @DATA ;1;}, 'grep2' => sub {grep $_=$TABLE{$_},@DATA;1;}, 'for2' => sub {$_ = $TABLE{$_} for(@DATA);1;}, });
■結果 1回目 Rate map1 map2 for1 grep1 grep2 for2 map1 25.8/s -- -14% -32% -33% -66% -69% map2 30.1/s 17% -- -21% -22% -60% -64% for1 38.0/s 48% 26% -- -2% -50% -54% grep1 38.6/s 50% 28% 2% -- -49% -53% grep2 75.8/s 194% 152% 99% 96% -- -8% for2 82.6/s 221% 174% 117% 114% 9% -- ■結果 2回目 Rate map1 map2 grep1 for1 grep2 for2 map1 24.6/s -- -16% -33% -33% -71% -71% map2 29.2/s 19% -- -20% -21% -65% -66% grep1 36.6/s 49% 26% -- -1% -56% -57% for1 36.9/s 50% 27% 1% -- -56% -57% grep2 83.3/s 239% 186% 127% 126% -- -3% for2 85.5/s 248% 193% 133% 132% 3% -- ■結果 3回目 Rate map1 map2 grep1 for1 grep2 for2 map1 23.3/s -- -17% -33% -37% -72% -73% map2 27.9/s 20% -- -20% -25% -66% -67% grep1 35.0/s 50% 25% -- -6% -57% -59% for1 37.0/s 59% 33% 6% -- -55% -56% grep2 82.0/s 252% 193% 134% 121% -- -3% for2 84.7/s 264% 203% 142% 129% 3% --
map1が遅いのはでかいリスト返してるから。 一つだけ全く別のことやってりゃそりゃ遅い罠。 map2が遅いのはfor2grep2と違ってブロック評価してるからだと思う。 とりあえず 'map1' => sub { my @hoge; map { push @hoge, $TABLE{$_} } @DATA; 1; }, 'map2' => sub { map $_ = $TABLE{$_} , @DATA; 1; }, に書き換えたらグループごとの速度は大差なくなるはず。 関係ないけど最近のPerlのmapは 同じことやるforeachより速くなったりするのでびっくり。 古いバージョンなら戻り値使わない時は絶対forって言えたんだけどな。
一応貼っておく Rate grep1 for1 map1 grep2 map2 for2 grep1 19.8/s -- -1% -3% -64% -64% -65% for1 20.0/s 1% -- -2% -64% -64% -65% map1 20.4/s 3% 2% -- -63% -63% -64% grep2 55.2/s 179% 176% 171% -- -1% -3% map2 55.5/s 180% 177% 172% 1% -- -3% for2 57.0/s 188% 185% 180% 3% 3% --
その後の調べで
map2はsub {map {$_=$TABLE{$_};1;} @DATA ;1;}
とすると順位があがりました。余計なメモリコピーが発生してたみたいです。
さらに
>>780 さんの指摘を受けて
'map1' => sub {my @hoge;map push(@hoge,$TABLE{$_}),@DATA; 1;},
'map2' => sub {map $_=$TABLE{$_},@DATA ;1;},
に変更したところ若干forが優勢っぽいですがほとんど同じ結果になるようになりました。
組み込みの関数なのでperlのバージョンによって変わってくる部分もありそうですね。
テスト環境はperl v5.8.5でした。(書き忘れ)
大変わかりやすい説明ありがとうございました。
良くわからんがデータベース使え。
784 :
738 :2007/05/23(水) 21:51:32
あーの、恐縮ですが質問なんですけど、 Perlでは初めてオブジェクト指向のコードを書いているのですが、 下記のようなコードでアロー演算子と行入力演算子が併用できなくて困っています。 一度他のローカル変数にファイルハンドルを代入してやればうまくいくのですが、 もっとスマートに、オブジェクトが持つファイルハンドルから行入力する方法はあるのでしょうか。 use strict; sub parse { my $this = shift; my @data = <$this->{fh_lex}>; # 文法エラー # 下のコードなら成功 # my $fh = $this->{fh_lex}; # my @data = <$fh>; for (@data) { ;# 省略 } }
<>をファイル読み込みとして認識させるには、 括弧の中を $fh のような形をしたスカラ変数にしないとダメだから、 一時的に変数を作るしかないね。 my @data = sub{$_=shift;<$_>}->($this->{fh_lex}); とかw
ヒント:<()>
<()> はファイルグロブ。
<${this->{fh_lex}}> とかダメ? 試してないけど。
>>789 ダメだよ。やってみたw
<>を放棄した技だけどw
my @data = readline $$this{fh_lex} ;
普通に<>の内部関数のreadline使って、 my @data = readline $this->{fh_lex}; でよかろ。
>>785 別に無理に1行に書かなくても地味に$fhに代入した方がよっぽど明示的で
よいコードに見える。
どうしてもっていうんなら、$thisがオブジェクトならオーバーロードを使ってみては?
見た目すっきりするからついやっちゃうんだよね・・・
795 :
デフォルトの名無しさん :2007/05/25(金) 19:11:11
俺すごいだろって思ってついやっちゃうんだよな・・・
796 :
785 :2007/05/25(金) 22:27:59
>>786-792 みなさんどうもありがとうございます。
やはりPerlとはいえ表記上の制約はあるんですね。
にも関わらず他の方法がいくつもあると言うのはさすがですが。
どれを使おうか迷ったのですが、とりあえず今回は、readlineを使うのが一番綺麗に見えたので、それを使わせてもらおうと思います。
本当に勉強になりました。
長文にて失礼します。 以下の[data.csv]ようなカンマ区切りのデータがあるとします。 横軸がX座標、縦がY座、各格子の数値がZ座標(標高)を示しています。 このデータを、[out.csv]のように変換したいのですが、2次元配列でつまずいてしまい、途方に暮れてしまいました。 どなたかお知恵を授けて下さい。よろしくお願いします。 あと、入力データのうち行頭が"#"で始まる行は無視する、というのはどうすればできるのでしょうか。合わせてご教授いただけると助かります。よろしくお願いします。 [data.csv] , 1, 2, 3, 4 5, 12.63 , 33.82 , 31.71 , 29.73 4, 34.75 , 32.14 , 29.31 , 26.70 3, 33.55 , 30.27 , 27.17 , 23.43 2, 31.02 , 29.42 , 26.65 , 23.61 1, 28.00 , 27.04 , 25.39 , 22.60 [out.csv] X,Y,Z 1,1,28.00 1,2,27.04 1,3,25.39 1,4,22.60 2,1,31.02 2,1,27.04 (中略) 5,3,31.71 5,4,29.73
799 :
デフォルトの名無しさん :2007/05/26(土) 04:09:08
>>797 さてコレをどれくらい短くできるだろうか
use strict;
open FILE, "data.csv";
my @data;
my @index;
my @ys;
for my $line (<FILE>) {
chomp $line;
unless (@index) {
@index = split(/\s*,\s*/, $line);
shift @index;
next;
}
my($y, @d) = split(/\s*,\s*/, $line);
push(@ys, $y);
for (my $i=0; $i < @d; $i++) {
$data[ $index[$i] ][ $y ] = $d[$i];
}
}
close FILE;
open FILE, ">out.csv";
for my $x (@index) {
for my $y (@ys) {
print FILE "$x, $y, $data[$x][$y]\n";
}
}
>>799 use strict;
open FILE, "data.csv";
my(@data, @index, @ys);
while(<FILE>) {
chomp;
my($y, @d) = split /\s*,\s*/;
@index = @d, next unless @index;
push @ys, $y;
$data[ $index[$_] ][$y] = $d[$_] for 0..@d-1;
}
open FILE, ">", "out.csv";
for my $x (sort {$a <=> $b} @index) {
for my $y (sort {$a <=> $b} @ys) {
print FILE "$x, $y, $data[$x][$y]\n";
}
}
close FILE;
一応質問者の為に一行サービスしといたけど。本嫁本。 こんなの例題に出てくるだろが。 open IN, "data.csv" ; open OUT, ">", "out.csv" ; print OUT "X,Y,Z\n" ; (undef,my @index ) = split /,/, do{ $_ = <IN> ; s/\s+//g ; $_ } ; for ( reverse (<IN>) ){ s/\s+//g ; next if /^#/ ; my ( $index, @dat ) = split /,/ ; for my $i ( 0 .. $#dat ){ print OUT join "," ,$index,$index[$i],$dat[$i] . "\n" ; } } close IN ; close OUT ;
803 :
797 :2007/05/26(土) 13:30:30
>>799-801 皆さん、どうもありがとうございます。
教えていただいたコードを読んで勉強します。
ところで、私のような初心者向けの本にはどんなものがありますか?
現在手元には、「Perlの絵本」といわゆる「らくだ本」の2冊がありますが、前者はまったくの初心者向けで今回の質問の答えは見いだせません。
一方、後者は私には取っつきにくくて、ヒントが書いてあるのかも知れませんが、見つけられませんでした。
なお、Visual BASICとTurbo PASCALはある程度勉強しました。
近くに大きな本屋がないので、現物を手にとって見比べることができません。アドバイスをいただければ幸いです。よろしくお願いします。
リャマ本かクックブックあたり嫁
/(\b\w+)\1/ という正規表現が hogehogeにマッチして /(\b\w+\b)\1/ という正規表現が hoge hogeにマッチしないのは何故なんでしょうか?
* キャプチャされるのは、正規表現ではなくマッチした文字列 * \b は文字を消費しない。
>>803 時間をかけて、「らくだ本」じっくりと2回読めばいい。
1回目は、解らない部分には「?」印を付けて、深追いしない。
2回目は、「?」印を付けた部分を重点的に読む。
その過程がなければ、らくだ本を辞書のように使うことはできない。
リャマ本の第四版まだかなー 本家だと2005年に出てるんだよね ラクダさんも早く新しいの出して欲しいな
大変にスマソ ひょっとして use encoding でコード指定すると \w が日本語(文字)にもマッチする仕様?
811 :
803 :2007/05/26(土) 20:02:47
>>807 アドバイス、ありがとうございます。
昔やった受験勉強と同じことですね。腰を据えて勉強します。
>>810 perl + 日本語には興味無いんで調べたが、perlunicode にまんま書いてあるぞ。
o Character classes in regular expressions match characters instead
of bytes and match against the character properties specified in
the Unicode properties database. "\w" can be used to match a
Japanese ideograph, for instance.
>>810 基本的には空白や記号類ではないような文字にマッチする。
通常は全ての言語の文字にマッチするけど、
use locale;すればロカールである程度は制御できるね。
>>812-813 おお、すまそ。そしてありがd
今更だけど jcode.pl からの乗り換えに躓いてました
精進してきます
815 :
デフォルトの名無しさん :2007/05/26(土) 21:20:04
懐かしいな jcode.pl ってまだあったんだ cgiのもなんかライブラリあったな
cgi-lib.plナツカシス
817 :
デフォルトの名無しさん :2007/05/26(土) 23:38:11
>>816 ああ、それそれ!
名前忘れる位懐かしいw
…。perl…。 perl.といえば、perldl-command.が… !(-_Φ+){yes, So sexy.}
ログファイルを合成する処理で、困っています。 @log=("1.txt","2.txt","3.txt","4.txt"); foreach $filename(@log) { open(LOG,$filename) || &er_("Can't open $filename"); @lines = <LOG>; close(LOG); } @linesの中に、全てのテキスト内容を合成させた物が 入ってほしいのですが、最後に代入した4.txtの内容しか 入ってくれません。なぜでしょうか。 また、foreachで廻すのを条件として、 改造案を指南いただけると嬉しいです。
@lines = <LOG>; の部分を my @tmplines = <LOG>; push(@lines, @tmplines); の2行に置き換えてください。 千奈美に最後のやつしか残らないのは、 @lines = <LOG>; が上書きしてるからです。 だから最後の結果しか残らない。
cpanで >Are you ready for manual configuration? [yes] 毎回、noを答えるんですけど、これ抑制できないんですか?
>>822 > Are you ready for manual configuration?
俺は個人macもsolarisもyes選択してカスタマイズしたから、
最初にnoを選んだ時の挙動は分らんが、抑制もくそもこれって
最初の一回きりだろ?俺の環境だと出てこないんだけど。
何か変な事やってないか?
>>546 の
sub flatten(@) { map { ref $_ eq "ARRAY" ? flatten(@$_) : $_ } @_ }」
の
flatten(@)は配列以外を引数に取れないということでしょうか?
あと
@deff = grep{ !{map{$_,1}@FileA }->{$_}}@FileB;
のmap{$_,1}@FileAなのですが{$_,1}はどういう式なのでしょうか
>>824 1) プロトタイプの@は残りの引数をすべてリストとして取り込むという意味。
(@) にはあまり意味がないんだけど、perlsubでも読んどき。
2) map の引数のBLOCKはリストコンテキストで評価されるから、
$_, 1 は $_ と 1 からなるリスト。
はじめまして、 Perl 5.005_03 の世界から来ました。こんにちは。 最近の Perl でコマンドラインオプションの処理をする場合の標準を教えてください。
>>826 Getopt::StdかGetopt::Longを使うのがいいよ。どっちも標準モジュール。
Getopt::LongはGetopt::Stdの機能も含むからGetopt::Longのほうがおすすめ。
@_ で済まなかったっけか
>>828 自分でちまちまとオプション解析するならそれでいいけどな。
830 :
829 :2007/06/01(金) 12:01:08
いや、そんなことない。だまされるところだった。
>>827 早速 Getopt::Long 使ってみました。使いやすそうですね。
御回答ありがとうございます。
>>828 すみません、ちょっと私には意味わからなかったのでスルーさせてくださいー。
my $text = join '', <>; $text =~ s/\s*//g; を1行でする方法ないですか. 1行でなくとも見た目がよければいいです。 あとファイルの最初にmy宣言すると、その後のサブルーチン内でも 使えてしまうのですが、これは何か対策はありますでしょうか
(my $text = join '', <>) =~ s/\s*//g; とか出来んわけではないが分けて書いたほうが見た目はよいだろ。 > あとファイルの最初にmy宣言すると、その後のサブルーチン内でも > 使えてしまうのですが、これは何か対策はありますでしょうか ファイルスコープのmyはグローバル変数だから、そういうもの。 嫌なら中括弧で囲っとけばいい。
なるほど、ありがとうございました
my $text = join '', map {s/\s*//g; $_} (<>); このぐらいなら、まあいい?
$/使った方が速いと思うけど、2文にならざるを得ないな。
my $text = do{ local $/ ; $_ = <> ; s/\s*//g ; $_ } ; 実質4行w
s/\s*//g, $text.=$_ for <>;
ああ、my付けなきゃいけないのか my $text = join "", map { s/\s*//;$_} <>;
(my $text = do {local $/; <>}) =~ s/\s+//g;
ぶっちゃけ遊びとしても「1行で書く」っていうのは意味ないと思うw
844 :
デフォルトの名無しさん :2007/06/01(金) 23:14:33
>>844 >826 名前:デフォルトの名無しさん:2007/06/01(金) 10:44:52
>はじめまして、 Perl 5.005_03 の世界から来ました。こんにちは。
>
>最近の Perl でコマンドラインオプションの処理をする場合の標準を教えてください。
>コマンドラインオプションの処理をする
>コマンドラインオプションの処理をする
>コマンドラインオプションの処理をする
おまんこライン
847 :
デフォルトの名無しさん :2007/06/02(土) 01:45:09
単純にコマンドライン引数を見たいなら@ARGVを順番に見ていけばいいけど、
>>826 は -Rrt -l --color=auto とかのコマンドラインオプションをパースしたいってことだろ。
学習目的ならいざ知らずそんなもんいちいち自前で処理する奴はマゾ。
そうそう、Perl 5.005_03が先端だった頃の、 use Getopt::Stdするだけでプラス0.4秒 という時代とは違うんだから。
文字列の全角英数→半角変換って $j =~ tr/0-9a-zA-Z/0-9a-zA-Z/; じゃダメなん? 5.8.4で文字列はutf-8なんだけど。
>>850 use utf8 した上でなら、それでいいんじゃね? 確かめてないけど。
852 :
850 :2007/06/03(日) 19:02:08
化けてるってのはどうやって確認してるの?
日本語のマルチバイトはsjis、euc-jp、utf-8(他にもいろいろ)あるわけで、 スクリプトのソースや$jに入っているcharsetが何かがわかんないと答えようがないわな。
855 :
850 :2007/06/03(日) 19:28:12
853>> 入力と出力をprintして見比べてるけどマズかった?
それは大いにマズい。 $jの文字コード/UTFフラグの有無で挙動が変わってくる。
857 :
850 :2007/06/03(日) 19:37:59
>>854 入力、ソースはutf-8(のつもり)。
もしかしたら違うかもしれないから、入力のエンコード方式の調べ方があるなら教えてくれ。
>>856 マズいのか。
use Devel::Peek; Dump $j;
859 :
850 :2007/06/03(日) 20:02:10
>>858 dumpの出力の読み方は?
ググってみたけど、どう読んでいいのかサッパリ。
なんか要領がつかめないんだけど、 入力ソースはなんなわけ?
861 :
850 :2007/06/03(日) 20:13:48
binmodeでストリームに適当なレイヤをかぶせるか、 Encode::decodeに通して適切にutf-8フラグが立つようにせにゃならん。
863 :
850 :2007/06/03(日) 22:06:39
>>862 $j = decode('utf-8', $j);
の1行通したらうまくいった。ありがと。
ねえ。これから態度の悪い質問者には答えない様にしろよ。 付け上がって調子乗ってくるのがオチなんだからさ。
俺が正規表現でボコボコにしてやんよ ∧_∧ ( ・ω・)=つ≡つ (っ ≡つ=つ / ) s/.*/ババババ/g ( / ̄∪
866 :
デフォルトの名無しさん :2007/06/04(月) 14:35:29
>>864 付け上がっているのはどっちですか?
ここは質問箱でしょ?
質問してください、というスレなんでしょ?
質問者あってのスレなんですよ。
そんな逆切れ見たいなことを言っていないで、
質問してもらったら「質問してくださってありがとう」くらい言ったらどうですか!
これは酷い釣り糸
869 :
デフォルトの名無しさん :2007/06/04(月) 17:02:53
>>868 質問があったら質問しますよ。
自分の至らなさを指摘されたからって、急に喧嘩腰にならないでください。
頭の悪い人はいちいち無駄な書き込みをしなくていいです。
>>866 何が質問者あってだよ。回答者があってだろ。
回答者が居ないと何も出来ない癖に。
後
>>1 にも書いてあるけどここは "Perlの奥深さについて皆で語り合い、追求する"スレ。
低レベルな質問と会話はwebprog板でお願いします。
>>869 無いんなら今すぐ作れや
俺は無職で一日中暇なんじゃアホ
872 :
デフォルトの名無しさん :2007/06/04(月) 17:15:39
「
>>1 にも書いてあるけど」などという書き出しで
あたかも「みんなの意見」であるように強調しておきながら、
結局はラスト1行で単なる頭の悪い煽り屋さんであることをばらしてしまっていますね。
何だかんだいいつつ、自分の「低レベルな会話」は全面的に許してしまっている時点で、
説得力はゼロですね。修行を積んで出直しましょう。
873 :
デフォルトの名無しさん :2007/06/04(月) 17:19:05
>>871 暇なら自分で質問を作って自分で回答していればいいじゃないですか。
内容によっては決して無意味ではありませんよ。
高度な質問と高度な回答をセットで提供するぶんには、結構喜ばれると思います。
とはいえ、無職の能無しがそういう問答を自演するのは難しいでしょうが…。
皆の意見として言ったつもりは無いな。建前のような物。 ついでに俺は許してないよ? WebProgに案内してるだけ。 お前も個人叩きをするタダの頭の悪い煽り屋にしか 見えないんだが、本文に対する反論は結局ナシなのかな?
875 :
デフォルトの名無しさん :2007/06/04(月) 17:28:38
>>874 なるほど、自分で自分を許していないのですね。
ではあなたが黙れば解決です。あなたにできる最大の「低レベルな会話の排除」ですね!
あと、「本文」というのは面白い言い方だと思います。
相手に突っ込まれて、いかに馬鹿なことを言っていたかが自覚できた途端に
そこを蜥蜴の尻尾みたいに切り捨てて、「ノーダメージだよーん」ということにするのですね。
どうでもいい議論はよそでやれよ。
定期的に沸いてる奴だろw ほっとけ
>>875 んーそうじゃないな。あくまでwebprog板でやれと希望してるだけだ。
本文って言い方そんなに面白いかな? お前に言われた事は自覚した、
とする。その次の段階の話だ。その次の話が出来なければただの
煽り合いで終わってしまうだろう? 後俺は120%黙る気は無いので宜しく。
>>878 低レベルな質問と会話はwebprog板でお願いします。
881 :
デフォルトの名無しさん :2007/06/04(月) 18:07:51
まぁ、こんなもんでしょう。 「ここは "Perlの奥深さについて皆で語り合い、追求する"スレ」であるという理由で 「低レベルな質問と会話はwebprog板でお願い」していた人間も、 つまらないプライドをちょっと傷つけられたら、Perlの奥深さとまるで関係のない低レベルな会話だと自覚しつつも 「120%黙る気は無い」とまで言い切ってしまうのですよ。 俺はやっていいけどお前はダメ、の精神で物事を動かせると思ってるボクちゃんってこんな感じなんです。
スーパーキチガイタイム
なんか、ここぞとばかりに言い負かそうとしてるが、それも違う。 俺は毎回このスレで変な奴が出る度に相手してやってるし、 俺自身もwebprogに行く気なんかハナから無い訳で。本音と建前ってやつだな。 ついでに言うとさっさと僕の"本文"に反論してくれませんか。
webprog板じゃなくてもいいから議論なら他スレでやれよ
> 俺は毎回このスレで変な奴が出る度に相手してやってるし、 やめてください。
>>883 > 俺は毎回このスレで変な奴が出る度に相手してやってるし、
かんべんして(><;)
自分が一番変な奴だという自覚が無いんだなw こんだけ嫌われまくってもきづかないほうに賭ける
殆ど一人でやってるように見えるんだけど。
バレたか・・・
バロスw
さすがにそこまでストーキングっぽいことしなくてもいいのに・・・
>>894 どっちもImage-Magi'c'になっててワラタ
借りてる鯖はlolipopかな?
質問します! 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__だけでも 同じ結果が返ってくるのではないかと思って悩んでいます。 よろしかった教えて頂けないでしょうか?
%hoge; $age = {%hoge}; というコードがあった場合、最後の代入で行われているのは 無名ハッシュコンストラクタの中でハッシュを評価することで、ハッシュのキーと値 からなるリストが生成され、それらを要素とする無名ハッシュが生成されて、そのリファレンスが $ageに代入される。つまり%hogeのコピーのリファレンスを代入しているという考えでいいんでしょうか?
>>897 Perl 正規表現でググればウンザリするほど答えが見つかると思います
>>898 そうです
900 :
デフォルトの名無しさん :2007/06/04(月) 23:47:18
なるほど、自分で自分を許していないのですね。 ではあなたが黙れば解決です。あなたにできる最大の「低レベルな会話の排除」ですね! あと、「本文」というのは面白い言い方だと思います。 相手に突っ込まれて、いかに馬鹿なことを言っていたかが自覚できた途端に そこを蜥蜴の尻尾みたいに切り捨てて、「ノーダメージだよーん」ということにするのですね。
>>897 なんかすごい無駄だらけなソースだなあ・・・
ノーダメージだよーん
>>900 なんかすごい無駄だらけな文だなあ・・・
なんかすごい無駄だらけなスレだなあ・・・
905 :
デフォルトの名無しさん :2007/06/05(火) 00:48:01
粘着荒らし酷いな
粘着した方が勝ち!
ノーダメージだよーん
908 :
デフォルトの名無しさん :2007/06/05(火) 01:34:33
荒らしはやめてー><
変な奴が現れたら一人も漏らさず全部相手するように それがこのスレのお約束
次スレのテンプレのことについて、次の提案があるのだが、どうだろうか?
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);
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。
あれ?過去スレ保管所みたいなのなかったっけ?
913 :
デフォルトの名無しさん :2007/06/06(水) 12:20:20
podやpod2htmlとかで検索していたら、クロスリファレンスという言葉が出てきたのですが クロスリファレンスで検索してもよくわかりませんでした。 このことに関することが書かれているウェブサイトや文献があったら教えてほしいです。 よろしくお願いします。
podでクロスリファレンス言うたら L<> のことちゃうのん?
orz...
質問〜 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を再利用しています。 上のやつと下のやつはどっちのほうが処理早いですか?
どっちもどっち 好きに使え
>>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);
}
};
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)
924 :
914 :2007/06/06(水) 22:51:21
>>915-917 L<> のところをしっかり読んでみたらクロスリファレンスってのがありました。
ハイパーリンクのようなものと見て問題ないでしょうか?
pod2htmlの解説でクロスリファレンスという言葉が出てきたときは、なにかこう
クロスリファレンスというものを記述すれば関連するpodがまとめて変換されたり
という、うれしい事が起こるのかななんて妄想してしまいました。(汗
(もともとそういうことができないかなと思って検索していたので・・・)
単純に文書間のリンクであるならば、簡単に理解できそうです。
どうもありがとうございました。
>>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; }
は同じ程度の速度だから、 .. が遅くなるのかな。
リファレンスというか、値を格納する番地を確保する時間の差じゃないかな? 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も番地の数は同じ。) 新しく配列作るより、使わなくなった配列を再利用したほうがスピード上がるってことかな〜と。 再利用したほうがメモリ効率も良さ気。
>>926 921 は「 op2 の方が遅い」って話しだぞ
922のせいに違いない
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 後者のほうがちょっとだけ速いな
930 :
921 :2007/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)
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)って
どっちが早いの??
実行環境によるって事じゃないのか
>>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 なのか知らないけど。
>>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回実行できた
どっちが速いかわかるよな?
>>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、ほとんど差が無くて実行するたびに結果が逆転してますた。
ベンチマーク便利だぬ
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キモい
普通じゃん
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) 時間がかかるのは .. (範囲演算子)。 メモリの領域確保は誤差範囲。 メモリコピーは、まあそれなりのコスト。
というか、メモリコピーが一番の時間コスト要因だな。
流れの中すみませんが、printf で質問です。 何番目の引数を使う、という様な引数の交換はできるでしょうか? PHP でゆうところの次のものです。 > printf( "答えは%2$d" , 10, 11, 12 ); > 結果: 答えは11
つperldoc -f sprintf 試せばいいのに $ perl -e 'printf( q{答えは%2$d} , 10, 11, 12 );' 答えは11
943 :
941 :2007/06/07(木) 12:29:51
>>942 早速ありがとうございます。
うっ、できた…。 そうか "" の中では$が変数判定されるんだった :Drz。
944 :
925 :2007/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回発生してるような速度になってる。
範囲リストをよそに作ってからコピーしてるんだろうな
>>944 test0とtest1がなぜこんなに差が出るのか謎だな。
参考 # 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)
今北産業
my@a = 1..100; なら@aを確保して直に1..100で初期化するように最適化されるけど、 my@a;@a=1..100; だと、@aを確保してから(1..100)を生成して、@aにコピーしてるんだろうな。
ベンチマーク厨乙
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)
速いCPUの自慢しやがって!
C2Dとmacの結果も見たいです><
954 :
デフォルトの名無しさん :2007/06/08(金) 12:17:03
質問です gtk2-perl使ってるのですが、なんかいい開発環境ありますか? 今はgeditとlv使いながらやってますが関数追いかけるのが大変で…。 eclipseがいいのであれば使ってみようと思います。他におすすめなのがあればぜひ。 guiはglade使ってて不満はないです。
男は黙ってvim
WineでEmEditor
エディタをここで聞くなよ Linux板のエディタスレでやれ
粘着君sage覚えたんだ
もちろんそうよ
Intel(R) Core(TM)2 CPU T7200 @ 2.00GHz This is perl, v5.8.8 built for i386-freebsd-64int Benchmark: running test0, test1, test2, test3 for at least 3 CPU seconds... test0: 3 wallclock secs ( 3.22 usr + 0.00 sys = 3.22 CPU) @ 873.63/s (n=2812) test1: 4 wallclock secs ( 3.17 usr + 0.00 sys = 3.17 CPU) @ 886.54/s (n=2812) test2: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 482.34/s (n=1545) test3: 3 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 444.37/s (n=1406)
Pentium(R) M processor 2.00GHz This is perl, v5.8.8 built for i386-freebsd-64int Benchmark: running test0, test1, test2, test3 for at least 3 CPU seconds... test0: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 792.04/s (n=2537) test1: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 792.04/s (n=2537) test2: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 415.30/s (n=1327) test3: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 395.86/s (n=1268) AMD Athlon(tm) 64 Processor 3200+ This is perl, v5.8.8 built for i386-netbsd-thread-multi Benchmark: running test0, test1, test2, test3 for at least 3 CPU seconds... test0: 4 wallclock secs ( 3.36 usr + -0.02 sys = 3.34 CPU) @ 744.91/s (n=2488) test1: 3 wallclock secs ( 3.01 usr + -0.01 sys = 3.00 CPU) @ 744.67/s (n=2234) test2: 3 wallclock secs ( 3.21 usr + 0.00 sys = 3.21 CPU) @ 395.64/s (n=1270) test3: 3 wallclock secs ( 3.21 usr + 0.00 sys = 3.21 CPU) @ 361.68/s (n=1161) AMD Athlon(tm) 64 Processor 3200+ This is perl, v5.8.8 built for i386-freebsd-64int Benchmark: running test0, test1, test2, test3 for at least 3 CPU seconds... test0: 3 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 517.96/s (n=1651) test1: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 515.43/s (n=1651) test2: 4 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 267.72/s (n=845) test3: 4 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 252.86/s (n=806) 何故か同じマザー使ってるのに、FreeBSD だと遅い…
もうみんあ飽きてるというのに・・・
ベンチマーク厨うざ
qwとqqの違いってなんなんでしょうか?
qq/foo bar baz/ #=> "foo bar baz" qw/foo bar baz/ #=> ("foo","bar","baz")
訂正 qq/foo bar baz/ #=> "foo bar baz" qw/foo bar baz/ #=> ('foo','bar','baz')
>>965 わかりました、ありがとうございます。
q//やqq/がラクダ本に載ってないということは、これらは最近追加された演算子という
ことなんでしょうか?
なんと的外れな煽り
金持ちは黙ってろ
人を指して貧乏人とか行ってる時点でレベルの低いやつだとまるわかり。 恥ずかしくないの?
牛丼にたまごとお新香付けるオレはかなり貴族
Perlの話をしろ糞ども
>>972 本当にレベルが高いやつはスルーするので、
あなたもレベルが低いようですね。
そういうあなたもw
そういうあなたもw
アイスのフタの裏を舐めないオレはかなり貴族
フタ付きのアイスくうのは庶民
フタの裏のアイスだけ食べるのが真の貴族。
変なのがいつくようになっちまった
open FH1, "hoge.txt" はふつーにOKなのですが my $FH2 open $FH2, "hoge.txt" とかやると、エラーと言われます。ところが open my $FH3, "hoge.txt" これだとエラーとは言われません。なんででしょう? 5.6の環境でやっててヘンだなーと思ってたんだが 5.8だとFH2のパターンでも何にも言われない うーん、、、
openの第一引数に変数を与えた場合の挙動はたびたび変更されてるから、 perlfuncの古いの引っ張ってきて読んどくといいよ。
>>983 なるほど、そういうことですか
まあ普通にFH1のように使えばいいんでしょうが
関係ないけど $# って廃止されるんですね
scalar(@array) とかで代替できるから問題ないんでしょうが
廃止しようとする意図がよくわからない
>>972 「本当に○○な奴はそれを言わない」というたぐいの思い込みを前提に物を言うほうが、
よっぽど恥ずかしいと思います :-)
そういう前提を持つと、「言った時点でそいつは○○ではないことになる」から、
「言われたくないことを言われたくない人に言われる」ことが絶対無くなって、凄く気が楽になる、
それはわかりますが、かっこ悪い逃げ方にもほどがあります :-)
>>982 solaris の 5.6.0 にてやってみたが、エラー出ないぞ。
5.6.0 叩いているつもりで、5.005 呼んでるとかないか?
>>984 Perlも6でいよいよ終わりっぽいな。
要素数と最大の添え字番号じゃPerlとRubyくらい違うだろうに。
マターリ
ちんこ
993 :
デフォルトの名無しさん :2007/06/15(金) 02:00:51
まずはここを使い切ろう
\
\
__END__
=head1 NAME pc11::tech - bbs for programers
print '9' x 3;
die "all is forgotten";
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。