Perl 中的钻石操作符
经常会遇到需要读取某些文件的内容的时候,在 Perl 中,可以用 <STDIN> 开启一个输入流,比如下面的代码
while(<STDIN>){
print "$_";
}
运行它,将会开启一个标准输入流,按下回车后,就会打印输入流中的信息。
while 的作用是不断的读取标准输入流中的数据并打印。在没有确认之前,标准输入流始终是开启的,在按下回车之后,才会执行下一次的循环。
这里稍微说一下一个有意思的地方,假如把 while 换成 foreach,结果就会相当不同了。
foreach(<STDIN>){
print "$_";
}
你会发现每次按完回车之后,它不会立即打印你想要的东西,当你按下 ctrl + D
的时候,它会把刚才输入的所有数据全部打印出来。
这是因为 foreach 会预先加载目标的所有数据,因为标准输入流始终没关闭,所以,它会认为还有数据,循环体始终进不去,当按下ctrl + D
的时候,才开始执行,它实际上只执行了一次循环体。
来实现一个 cat
在 Unix 系统中,有个特别好用的工具叫 cat,这个工具能窥探文件的内容
cat helloworld
这句命令会将 helloworld
文件中的内容输出到标准输出流中。
下面来用 perl 来实现一个 cat (只是简单的窥探文件内容的功能)
print <>;
what ?? 就一行代码,不是在逗我吧?
上面的 <>
叫做钻石操作符,这是 perl 特有的东西,它逐行读取命令行参数指定的文件,然后返回读取的内容,于是如果使用 print <>
,就能直接打印参数列表指定的文件的内容了
perl cat.perl helloworld
这样会打印 helloworld
的文件内容,如果参数列表有不止一个参数,会首先读取第一个参数,处理完毕后再读取第二个。
介入读取
如果想介入读取过程的话,比如想在每行读取过后追加一个换行符,那么可以用 while 进行处理
while(<>){
print "$_\n";
}