什么是<>的用途在Perl?

时间:2012-09-05 06:09:13

标签: perl

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

<>;

while(<>)

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

6 个答案:

答案 0 :(得分:30)

上面的答案都是正确的,但如果你了解一般的UNIX命令行用法,它可能会更清楚地说明。希望命令处理多个文件是非常共同的。 E.g。

ls -l *.c

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

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

echo *

你会注意到你没有得到*。

所以,如果shell给你一堆文件名,你想依次查看每个文件的数据,perl的&lt;&gt;运算符为你提供了一个很好的方法...它将下一个文件的下一行(或stdin,如果没有文件命名)放入$ _(默认标量)。

这是一个穷人的grep:

while(<>) {
   print if m/pattern/;
}

运行此脚本:

./t.pl *

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

cat /etc/passwd | ./t.pl

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

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

答案 1 :(得分:10)

 <>;

是一种简短的写作方式

 readline();

或者如果你添加默认参数

 readline(*ARGV);

readline是一个从指定文件句柄中读取一行的运算符。如果STDIN为空,则从特殊文件句柄ARGV读取将从@ARGV读取,如果不是,则从@ARGV命名的文件的串联读取。


至于

while (<>)

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

while (<>) { ... }

它被重写为

while (defined($_ = <>)) { ... }

如前所述,这意味着与

相同
while (defined($_ = readline(*ARGV))) { ... }

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

答案 2 :(得分:5)

引用perldoc perlop

  

null文件句柄&lt;&gt;很特别:它可以用来模仿   sed和awk的行为,以及任何其他需要的Unix过滤器程序   一个文件名列表,对所有输入的每一行做同样的事情   他们。来自&lt;&gt;的输入来自标准输入,或来自每个   命令行中列出的文件。

答案 3 :(得分:5)

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:2)

它采用STDIN标准输入:

> cat temp.pl
#!/usr/bin/perl

use strict;

use warnings;
my $count=<>;
print "$count"."\n";
>

以下是执行:

> temp.pl
3
3

>

因此,只要您执行脚本,它就会等到用户提供一些输入。 在3作为输入后,它将该值存储在$count中,并在下一个语句中打印该值。