代码之家  ›  专栏  ›  技术社区  ›  Jimmeh

如何在Perl中混合命令行参数和<>的文件名?

  •  6
  • Jimmeh  · 技术社区  · 15 年前

    考虑以下愚蠢的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.
    

    你知道为什么吗?当它到达<gt;时,它是否试图从(不存在的)文件中读取“sample\u参数”或其他内容?为什么?

    3 回复  |  直到 14 年前
        1
  •  12
  •   mob    15 年前

    <> 是“从中指定的文件读取”的简写 @ARGV ,或者,如果 @ ARGV 为空,然后从中读取 STDIN “。在你的计划中, @ ARGV 包含值 ("sample_argument") ,因此Perl在使用 <> 操作员。

    你可以通过清理来修复它 @ ARGV 在你到达之前 <> 线:

    $firstarg = shift @ARGV;
    print $firstarg;
    $input = <>;       # now @ARGV is empty, so read from STDIN
    print $input;
    
        2
  •  8
  •   Sean    15 年前

    请参见Perlio手册页,其中部分内容如下:

    空文件句柄是特殊的:它可以用来模拟sed的行为 和AWK。来自<gt;的输入要么来自标准输入,要么来自列出的每个文件 在命令行上。这里是它的工作原理:第一次评估时, @argv数组被选中,如果它为空,$argv[0]被设置为“-”,当 “打开”为您提供标准输入。然后将@argv数组作为 文件名。

    如果你想要stdin,使用stdin,而不是 <> .

        3
  •  1
  •   Paul Tomblin    15 年前

    默认情况下,Perl使用命令行参数作为 <> . 使用完后,你应该自己用 shift;