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);
}