在foreach或while在Perl中迭代文件有什么区别?

前端之家收集整理的这篇文章主要介绍了在foreach或while在Perl中迭代文件有什么区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个文件句柄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,用于行缓冲。

原文链接:https://www.f2er.com/Perl/173386.html

猜你在找的Perl相关文章