【问题标题】:What's the use of <> in Perl?Perl 中的 <> 有什么用?
【发布时间】:2015-03-13 08:41:22
【问题描述】:

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

<>;

while(<>)

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

【问题讨论】:

  • 我会说 表示“STDIN”,从提示输入。
  • &lt;&gt;while(&lt;&gt;)perlop 中进行了解释(后者也在perlvar 中进行了解释)。 &lt;&gt; 被称为“空文件句柄”。这是一个特殊结构仅仅意味着&lt;STDIN&gt;
  • @pst, &lt;&gt; 不是文件句柄,“null”或其他。是运营商。具体来说,readline 运算符。在 perlvar 中有一个将其称为“角度运算符”的引用,尽管实际上没有任何这样的运算符。尖括号由两个运算符使用:readlineglob。运算符取决于括号的内容。
  • @ikegami 我认为“null”在这种情况下不是一个好词,因为它带有一些 perl 中不存在的其他语言的含义。后者更好。
  • @ikegami 这很奇怪。恐怕我不记得了。

标签: perl


【解决方案1】:

上面的答案都是正确的,但是如果您了解一般的 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 命令行行为......处理我给你的所有文件,或者处理我通过管道传送给你的东西。

【讨论】:

    【解决方案2】:
     <>;
    

    是一种简写方式

     readline();
    

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

     readline(*ARGV);
    

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


    至于

    while (<>)
    

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

    while (<>) { ... }
    

    它被重写为

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

    如前所述,这意味着与

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          引用perldoc perlop:

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

          【讨论】:

          【解决方案6】:

          它采用 STDIN 标准输入:

          > cat temp.pl
          #!/usr/bin/perl
          
          use strict;
          
          use warnings;
          my $count=<>;
          print "$count"."\n";
          >
          

          下面是执行:

          > temp.pl
          3
          3
          
          >
          

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

          【讨论】:

          • 如果您现在购买,我们将提供终身 CPAN 订阅,无需额外费用!
          猜你喜欢
          • 1970-01-01
          • 2011-06-22
          • 1970-01-01
          • 2010-09-22
          • 2011-09-04
          • 1970-01-01
          • 2023-02-20
          • 2020-10-15
          • 1970-01-01
          相关资源
          最近更新 更多