在foreach或while在Perl中迭代文件有什么区别?
发布时间:2020-12-15 21:25:26 所属栏目:大数据 来源:网络整理
导读:我有一个文件句柄FILE在Perl,我想迭代文件中的所有行。下面有什么区别? while (FILE) { # do something} 和 foreach (FILE) { # do something} 解决方法 对于大多数用途,您可能不会注意到差异。然而,foreach在逐行前读取每行到列表( not an array),而wh
我有一个文件句柄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,用于行缓冲。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |