foreach と while
0-10000 の数字が 1000*1000 ある .csv を読み込んで全てを3桁ごとにカンマで区切って別ファイルに書き出す、などというのをやってみた。
foreach = 30312msec
while = 30437msec
メモリ上で計算して一気に書き出す foreach の方が速いかと思ったら変わんねーでやんの。
いまだにファイルを書き換える方法がよくわからん。
open(HOGE,'+<file.name') で開いて while してると変なことになる。
↓使ったソース
sub loopForeach { open(S, "<./sample.txt"); open(F, ">./foreach.txt"); my @tmps = <S>; my $count = 0; foreach $tmp (@tmps){ $tmp = &effect($tmp); $count ++; } print F @tmps; close(F); close(S); print '>>$count ='.$count.'<br>'; } sub loopWhile { open(S, "<./sample.txt"); open(W, ">./while.txt"); $count = 0; while(<S>){ $tmp = $_; $tmp = &effect($tmp); print W $tmp."\n"; $count ++; } close(W); close(S); print '>>$count ='.$count.'<br>'; } sub effect{ $line = shift; my @vv = split(/,\s/, $line); foreach $v (@vv){ 1 while $v =~ s/(.*\d)(\d\d\d)/$1,$2/; } return join('# ',@vv); }