|
前面学习过行输入操作:<STDIN>,在不同的上下文环境中返回不同的值。像早先描述的那样<STDIN>在标量context 中返
回输入的下一行。在列表context 中,它将返回这个输入文件的所有剩余部分。而每一行将作为一个独立的元素,如下所示:
@lines = <STDIN>; #将输入读入列表context 中
当输入来源于一个文件时,它将读入文件的剩余部分。但如果输入来源于键盘,那文件结束符(end-of-file)是怎样输入的呢?
在Unix 或者类似的系统中,包括linux, Mac OS X,通常可以输入CTRL +D◆来表明输入已经结束。Perl 会忽略这个字符,
因此它将在屏幕上显示出来。在DOS/WINDOWS 系统中,使用CTRL +Z◆。如果你的实际情况和上述不同,查看你系统
的文档或者询问你附近的专家。
◆这仅仅是默认值,可以使用stty 来改变它。但通常是使用它;我们还没有看见某台Unix 系统不是使用CTRL+D 来表明end-of-file 的。
◆在Perl 的某些DOS/WINDOWS 版本中可能存在bug,在第一行中使入CTRL+Z 可能存在问题。在这样的系统中,可以使用在输入的结
束处加上“\n”来解决。
如果某人运行一个程序,输入了三行,并且使用了恰当的end-of-file,那其数组将含有3 个元素。每一个元素为一个由换行
符结束的字符串,对应于由3 个换行符结束的输入。
如果在输入时,能一次去掉(chomp)所有的换行符,岂不是很好?如果将chomp 应用于一个包含字符串的数组中,他将把这
个数组中每一个元素的换行符去掉,如下例所示:
@lines = <STDIN>; #读入所有的行
chomp = (@lines); #去掉所有的换行符
但更常见的做法是:
chomp (@lines = <STDIN>); #读入所有的行,不包括换行符
当写你自己的程序时,可以采用任意种方法,大多数Perl 程序员使用第二种,更加紧凑些。
你可能已经意识到这些输入一旦读过,就不能重新读了◆。到了文件的结尾,就没有更多的数据可以读入。
◆如果是从某个源(source,如文件,译者注)输入,那你可以返回去重新读一次。但这不是这里讨论的问题。
当输入的文件为一个400MB 的log 文件时,将发生怎样的情况?行输入操作符读入所有的行,这将占去大量的内存◆。Perl
不会限制你那样做,但你系统的用户(更别提系统管理员)将很可能阻止你。当输入的内容特别大时,应当避免一次将所
有的内容都读入内存。
◆一般,实际占去的内存要比文件要大。也就是说,一个400MB 的文件读入数组时将至少占去1G 的内存空间。这是因为Perl 为了节约时
间而浪费了些内存。这是一个好的交易。如果内存不够,可以去买一些;但时间不够,那就很难办了。 |
|