加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在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,用于行缓冲。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读