Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45161
  • 博文数量: 43
  • 博客积分: 1161
  • 博客等级: 少尉
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-24 11:14
文章分类
文章存档

2011年(40)

2010年(3)

分类: Python/Ruby

2011-04-26 00:48:34

"行输入"默认的输入设备是键盘,用IO重定向可以从文件中输入内容.
在标量上下文中,返回标准输入中的一行
在列表上下文中,返回一个列表,其中包含所有的输入行,直到文件结束符(C+z)
  1. #1.txt
  2. aaaaaaaa
  3. bbbbbbbb
  4. cccccccc
  5. dddddddd
  1. #!/usr/bin/perl
  2. use strict;
  3. while(<STDIN>) {
  4.   print "Get:$_";
  5. }

  1. #!/usr/bin/perl
  2. use strict;
  3. foreach(<STDIN>) {
  4.   print "Get:$_";
  5. }
以1.txt为输入文件,分别在while和foreach中使用,得到的输出结果是一样的,但实际的运行过程并不相同.
在while()中,由于是标量上下文,程序每次从输入读取一行,进入循环,如果发现输入的是文件结束符,则退出循环.
在foreach()中,由于是列表上下文,程序会一直等待输入,并将输入的所有行构建为一个匿名列表,直到遇到文件结束符,然后再开始循环处理.

以while处理,直接用键盘输入的运行结果.每次输入一行回车后,马上进入循环处理,直到输入文件结束符.

以foreach处理,直接用键盘输入的运行结果.一直到输入C+z后,再进入循环处理.

所以,两者的不同之处是,在while循环里,Perl会读取一行输入,把它存入某个变量并执行循环主体.接下来,它会回头去寻找其他的输入行.
但在foreach循环里,"行输入"操作符会在列表上下文中执行(因为foreach需要逐项处理列表的内容),为此,在循环能够开始之前,它必须先将输入全部读进来.
假如输入来自400MB的日志文件,差异就非常明显了.
通常尽量使用while,让它每次处理一行.
阅读(695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~