在Perl中使用<>有什么用?

bub*_*ble 30 perl

在Perl中使用<>有什么用.如何使用它 ?如果我们只是写

<>;
Run Code Online (Sandbox Code Playgroud)

while(<>)
Run Code Online (Sandbox Code Playgroud)

程序在两种情况下都做了什么?

Ton*_* K. 33

上面的答案都是正确的,但如果你了解一般的UNIX命令行用法,它可能会更清楚地说明.想要一个命令来处理多个文件是常见的.例如

ls -l *.c
Run Code Online (Sandbox Code Playgroud)

命令行shell(bash等)将其转换为:

ls -l a.c b.c c.c ...
Run Code Online (Sandbox Code Playgroud)

换句话说,除非模式不匹配,否则ls永远不会看到'*.c'.在命令提示符处(而不是perl)尝试此操作:

echo *
Run Code Online (Sandbox Code Playgroud)

你会注意到你没有获得*.

所以,如果shell给你一堆文件名,并且你想依次查看每个文件的数据,那么perl的<>运算符会为你提供一个很好的方法...它将下一行放在$ _(默认标量)中的下一个文件(或stdin,如果没有文件被命名).

这是一个穷人的grep:

while(<>) {
   print if m/pattern/;
}
Run Code Online (Sandbox Code Playgroud)

运行此脚本:

./t.pl *
Run Code Online (Sandbox Code Playgroud)

将打印出与给定模式匹配的所有文件的所有行.

cat /etc/passwd | ./t.pl
Run Code Online (Sandbox Code Playgroud)

将使用cat生成一些文本行,然后通过perl中的循环检查该模式.

所以你看,虽然(<>)为你提供了一个非常标准的UNIX命令行行为...处理我给你的所有文件,或处理我传送给你的东西.


ike*_*ami 11

 <>;
Run Code Online (Sandbox Code Playgroud)

是一种简短的写作方式

 readline();
Run Code Online (Sandbox Code Playgroud)

或者如果你添加默认参数,

 readline(*ARGV);
Run Code Online (Sandbox Code Playgroud)

readline是一个从指定的文件句柄中读取一行的运算符.从特殊文件句柄ARGV读取将读取STDINif是否@ARGV为空或者是否来自命名的文件的串联(@ARGV如果不是).


至于

while (<>)
Run Code Online (Sandbox Code Playgroud)

这是一个语法错误.如果你有

while (<>) { ... }
Run Code Online (Sandbox Code Playgroud)

它被重写为

while (defined($_ = <>)) { ... }
Run Code Online (Sandbox Code Playgroud)

而如前所述,这意味着相同

while (defined($_ = readline(*ARGV))) { ... }
Run Code Online (Sandbox Code Playgroud)

这意味着它将从(先前已解释的)读取行,ARGV直到没有更多行要读取.


小智 6

它被称为菱形运算符,如果ARGV为空,则从stdin提供数据,或者从ARGV中命名的文件中提取每行.这个网页http://docstore.mik.ua/orelly/perl/learn/ch06_02.htm解释得非常好.


小智 5

引用perldoc perlop:

null filehandle <>是特殊的:它可以用来模拟sed和awk的行为,以及任何其他带有文件名列表的Unix过滤器程序,对来自所有文件名的每行输入执行相同操作.来自<>的输入来自标准输入,或来自命令行中列出的每个文件.

  • [Unix](http://en.wikipedia.org/wiki/Sed) [tools/languages](http://en.wikipedia.org/wiki/AWK).谷歌是你的朋友. (2认同)

mem*_*owe 5

在用这样的语法糖编程的许多情况下,DeparseØ有助于找出发生了什么:

$ perl -MO=Deparse -e 'while(<>){print 42}'
while (defined($_ = <ARGV>)) {
    print 42;
}
-e syntax OK
Run Code Online (Sandbox Code Playgroud)