【问题标题】:How can I mix command line arguments and filenames for <> in Perl?如何在 Perl 中混合 <> 的命令行参数和文件名?
【发布时间】:2010-02-26 21:25:40
【问题描述】:

考虑以下愚蠢的 Perl 程序:

$firstarg = $ARGV[0];

print $firstarg;

$input = <>;

print $input;

我从如下终端运行它:

perl myprog.pl sample_argument

并得到这个错误:

Can't open sample_argument: No such file or directory at myprog.pl line 5.

有什么想法吗?当它到达 时,它是否试图从(不存在的)文件“sample_argument”或其他内容中读取?为什么?

【问题讨论】:

    标签: perl input arguments


    【解决方案1】:

    &lt;&gt; 是“从@ARGV 中指定的文件读取,或者如果@ARGV 为空,则从STDIN 读取”的简写。在您的程序中,@ARGV 包含值 ("sample_argument"),因此当您使用 &lt;&gt; 运算符时,Perl 会尝试从该文件中读取。

    您可以通过在到达&lt;&gt; 行之前清除@ARGV 来修复它:

    $firstarg = shift @ARGV;
    print $firstarg;
    $input = <>;       # now @ARGV is empty, so read from STDIN
    print $input;
    

    【讨论】:

      【解决方案2】:

      请参阅 perlio 手册页,其中部分内容如下:

      空文件句柄 很特殊:它可以用来模拟 sed 的行为 和 awk。 的输入来自标准输入,或来自列出的每个文件 在命令行上。下面是它的工作原理:第一次评估 时, 检查@ARGV 数组,如果它为空,则 $ARGV[0] 设置为“-”,当 打开给你标准输入。然后将@ARGV 数组作为一个列表处理 文件名。

      如果您想要 STDIN,请使用 STDIN,而不是 &lt;&gt;

      【讨论】:

        【解决方案3】:

        默认情况下,perl 使用命令行参数作为&lt;&gt; 的输入文件。用完后,你应该自己用shift;

        【讨论】:

        • 你倒退了。 Perl 默认不对@ARGV 做任何事情。 &lt;&gt; 的行为很特别。
        • 我就是这么说的。该 使用 @ARGV 除非您自己使用 shift 来使用它们。
        猜你喜欢
        • 2021-12-13
        • 2016-07-26
        • 2017-12-04
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 2020-01-23
        • 1970-01-01
        • 2020-01-09
        相关资源
        最近更新 更多