"行输入"默认的输入设备是键盘,用IO重定向可以从文件中输入内容.在标量上下文中,返回标准输入中的一行
在列表上下文中,返回一个列表,其中包含所有的输入行,直到文件结束符(C+z)
- #1.txt
-
aaaaaaaa
-
bbbbbbbb
-
cccccccc
-
dddddddd
- #!/usr/bin/perl
-
use strict;
-
while(<STDIN>) {
-
print "Get:$_";
-
}
- #!/usr/bin/perl
-
use strict;
-
foreach(<STDIN>) {
-
print "Get:$_";
-
}
以1.txt为输入文件,分别在while和foreach中使用,得到的输出结果是一样的,但实际的运行过程并不相同.
在while()中,由于是标量上下文,程序每次从输入读取一行,进入循环,如果发现输入的是文件结束符,则退出循环.
在foreach()中,由于是列表上下文,程序会一直等待输入,并将输入的所有行构建为一个匿名列表,直到遇到文件结束符,然后再开始循环处理.
以while处理,直接用键盘输入的运行结果.每次输入一行回车后,马上进入循环处理,直到输入文件结束符.
以foreach处理,直接用键盘输入的运行结果.一直到输入C+z后,再进入循环处理.
所以,两者的不同之处是,在while循环里,Perl会读取一行输入,把它存入某个变量并执行循环主体.接下来,它会回头去寻找其他的输入行.
但在foreach循环里,"行输入"操作符会在列表上下文中执行(因为foreach需要逐项处理列表的内容),为此,在循环能够开始之前,它必须先将输入全部读进来.
假如输入来自400MB的日志文件,差异就非常明显了.
通常尽量使用while,让它每次处理一行.
阅读(741) | 评论(0) | 转发(0) |