gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:47:09 27 4
gpt4 key购买 nike

我在 Perl 中有一个文件句柄 FILE,我想迭代文件中的所有行。以下有区别吗?

while (<FILE>) {
# do something
}

foreach (<FILE>) {
# do something
}

最佳答案

对于大多数用途,您可能不会注意到差异。然而,foreach 将每一行读取到 list ( not an array ) 中,然后逐行进行遍历,而 while 则按行读取一行。时间。由于 foreach 将使用更多内存并需要预先处理时间,因此通常建议使用 while 来迭代文件的行。

编辑(通过 Schwern):foreach 循环相当于:

my @lines = <$fh>;
for my $line (@lines) {
...
}

不幸的是,Perl 没有像对范围运算符 (1..10) 那样优化这种特殊情况。

例如,如果我使用 for 循环和 while 循环读取/usr/share/dict/words 并让它们在完成后 sleep ,我可以使用 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/words 的内容。 while 循环一次仅存储一行,仅消耗 70k 的行缓冲时间。

关于perl - 在 Perl 中使用 foreach 或 while 迭代文件有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/585341/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com