读取标准输入
用<STDIN>进行标准输入:chomp($line=<STDIN>);
如果读到文件尾,行输入操作符就会返回undef。便可利用这一性质跳出循环。
while(defined ($line=<STDIN>)){
print "I saw $line";
}
简写为:
while(<STDIN>){
print "I saw $_ .";
}
注意:这个简写只在最早的写法中才能正常运行,如果将行输入操作符放在其他的任何地方(特别是自成一行),他并不会读取行输入并自动保存入默认变量$_。唯独在while循环中条件表达式里只有行输入操作符的前提下这个简写才起作用。
同样foreach也有这样的用法:
foreach (<STDIN>){
print "I saw $_";
}
不同之处在于:while每读入一行就处理一行,foreach需要一次性读完再处理。
#!/usr/bin/perl use strict; use warnings; while (<STDIN>) { print "I saw $_ \n"; } foreach (<STDIN>) { print "I saw $_ \n"; }
来自钻石操作符(<>)的输入
可以用钻石操作符编写类似cat、sed、awk、sort、grep、lpr等工具程序。
程序调用参数:$./my_program fred barney betty
如果比提供任何调用参数的话,程序会从标准输入流中采集数据。此外:如果用连字符(-)当作参数,则表示要从标准输入中读入数据。所以假如调用参数fred - betty,那么程序应该先处理文件fred,然后处理标准输入流提供的的数据,最后是betty。
钻石操作符就是行输入操作符的特例。不过他并不是从键盘中读取输入,而是从用户指定的位置读取:
while(defined($line =<>)){
chomp($line);
print "It was $line that I saw!\n";
}
如果现在输入的是调用参数是fred、barney、betty那么,输出结果就会是"It was [从文件中读取的一行内容] line that I saw!"等,直到遇到文件尾结束。注意:<>在读完一个文件后会接着读新的文件,然后在逐行输出内容。应为使用钻石操作符时已经报这些文件合并成一个很大的文件一样,钻石操作符只有碰到所有的输入的结尾时才会返回undef然后跳出while循环。
上面代码简写:
while (<>){
chomp;
print "It was $_ that I saw!\n";
}
注意:钻石操作符一般会处理所有的输入,所以在程序中如果看到多个钻石操作符那么通常是错误的。
#!/usr/bin/perl while (<>){ chomp; print "$_ \n"; }//注意代码中下面执行指令中添加了-,并从grep的输出管道中读入