当从STDIN读书时,与foreach相比

Cha*_*hak 6 perl foreach loops while-loop

可能重复:
使用foreach或在Perl中迭代文件有什么区别?

在while循环中,Perl读取一行输入,将其放入变量,并运行循环体.然后,它返回找到另一行输入.但是在foreach循环中,行输入操作符正在列表上下文中使用(因为foreach需要一个列表来迭代).所以它必须在循环开始运行之前读取所有输入.当输入来自您的400 MB Web服务器日志文件时,这种差异将变得明显!通常最好使用像while循环的快捷方式这样的代码,它会尽可能地一次处理输入行.来源 - 骆驼书

while每次都应该使用吗?foreach循环将占主导地位的可能情况是什么?

Dav*_*idO 7

正如您所指出的那样,foreach在循环开始之前迭代文件并将文件篡改到内存中.

虽然Perl的一个信条确实是"有多种方式可以做到这一点",但是存在一些方法可以做一些其他方式没有实际好处的事情. foreach循环文件可能是一个不好的选择.如果你要逐行迭代文件,你通常会使用while().如果你要将整个文件一次性打入内存,你可以一步完成并完成它.

啜饮整个文件有时会有好处.例如,其中之一是最小化必须打开文件的时间.通常情况下,它是为了方便处理不一致的数据或按记录模型记录的数据.foreach()会篡改文件,但实际上并没有提供立即关闭它的好机会,因此效益消失了.如果您的数据必须被视为一个块,那么使用foreach循环遍历该文件对您没有多大帮助.所以这个理由也消失了.最后,你得到了诋毁文件的负面影响,没有任何积极的诽谤文件.

总会有人提出一个其他人没有考虑的聪明理由.但我还没有看到它.(通常当我说某人发布"it"之类的东西时,所以建议它绝对没有任何优点总是危险的.)让我们这样说:直到你发现使用foreach迭代的极少数好理由之一文件,不要担心.当你确实做出这个发现时,你会知道现在是时候了.


mu *_*ort 6

一般的经验法则是,while如果你正在使用它的东西在你使用它的时候正在改变:

while(my $line = <>)
while(my ($k, $v) = each %h)
Run Code Online (Sandbox Code Playgroud)

forforeach以其他方式:

foreach my $line (@lines)
for my $k (keys %h)
for(my $i = 0; $i < $pancakes; ++$i)
Run Code Online (Sandbox Code Playgroud)

在文件的情况下,使用while是有意义的,因为你(可能)不想将整个事物啜饮到内存中(当然,除非你想要).但是,如果你已经将数据存储在内存中,那么for/ foreach将是迭代它的更自然的选择.