38

Perl 中的 <> 有什么用。如何使用它 ?如果我们简单地写

<>;

while(<>)

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

4

6 回答 6

36

上面的答案都是正确的,但是如果您了解一般的 UNIX 命令行用法,它可能会更清楚。希望一个命令处理多个文件是很常见的。例如

ls -l *.c

命令行 shell (bash et al) 把它变成:

ls -l a.c b.c c.c ...

换句话说,除非模式不匹配,否则 ls 永远不会看到 '*.c'。在命令提示符下(不是 perl)试试这个:

echo *

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

所以,如果 shell 给你一堆文件名,而你想依次浏览每个文件的数据,perl 的 <> 运算符为你提供了一个很好的方法......它将下一行放在下一个文件(如果没有命名文件,则为标准输入)到 $_ (默认标量)。

这是一个穷人的 grep:

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

运行此脚本:

./t.pl *

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

cat /etc/passwd | ./t.pl

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

所以你看,while(<>) 为你提供了一个非常标准的 UNIX 命令行行为……处理我给你的所有文件,或者处理我通过管道传送给你的东西。

于 2012-09-05T06:41:36.617 回答
18
 <>;

是一种简短的写作方式

 readline();

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

 readline(*ARGV);

readline是从指定文件句柄中读取一行的运算符。从特殊文件句柄ARGV中读取将从STDINif为空或从if 它不是@ARGV命名的文件的串联中读取。@ARGV


至于

while (<>)

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

while (<>) { ... }

它被重写为

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

如前所述,这意味着与

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

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

于 2012-09-05T06:17:35.090 回答
7

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

于 2012-09-05T06:18:24.027 回答
5

报价perldoc perlop

空文件句柄 <> 是特殊的:它可以用来模拟 sed 和 awk 的行为,以及任何其他接受文件名列表的 Unix 过滤程序,对来自所有文件名的每一行输入执行相同的操作。<> 的输入要么来自标准输入,要么来自命令行中列出的每个文件。

于 2012-09-05T06:11:36.213 回答
5

在许多使用这样的语法糖进行编程的情况下,DeparseO有助于找出正在发生的事情:

$ perl -MO=Deparse -e 'while(<>){print 42}'
while (defined($_ = <ARGV>)) {
    print 42;
}
-e syntax OK
于 2012-09-05T09:51:00.590 回答
2

它采用 STDIN 标准输入:

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

use strict;

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

下面是执行:

> temp.pl
3
3

>

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

于 2012-09-05T06:15:16.630 回答