我有一个文件句柄FILE在Perl,我想迭代文件中的所有行。下面有什么区别?
while (<FILE>) { # do something }
和
foreach (<FILE>) { # do something }
解决方法
对于大多数用途,您可能不会注意到差异。然而,foreach在逐行前读取每行到列表(
not an array),而while一次读取一行。由于foreach将使用更多的内存并且需要预处理时间,因此一般建议使用while来遍历文件的行。
编辑(通过Schwern):foreach循环相当于:
my @lines = <$fh>; for my $line (@lines) { ... }
不幸的是,Perl没有优化这种特殊情况,因为它与范围运算符(1..10)。
例如,如果我使用for循环和while循环读取/ usr / share / dict / words,并在完成后让它们休眠,我可以使用ps来查看进程占用了多少内存。作为一个控件,我包括一个程序,打开文件,但什么也没有。
USER PID %cpu %MEM VSZ RSS TT STAT STARTED TIME COMMAND schwern 73019 0.0 1.6 625552 33688 s000 S 2:47PM 0:00.24 perl -wle open my $fh,shift; for(<$fh>) { 1 } print "Done"; sleep 999 /usr/share/dict/words schwern 73018 0.0 0.1 601096 1236 s000 S 2:46PM 0:00.09 perl -wle open my $fh,shift; while(<$fh>) { 1 } print "Done"; sleep 999 /usr/share/dict/words schwern 73081 0.0 0.1 601096 1168 s000 S 2:55PM 0:00.00 perl -wle open my $fh,shift; print "Done"; sleep 999 /usr/share/dict/words
for程序消耗了近32兆的实内存(RSS列)来存储我的2.4兆/ usr / share / dict /字的内容。 while循环只存储一行,耗时仅为70k,用于行缓冲。