【问题标题】:How do you use shell I/O redirection to pass in arguments into Perl scripts?如何使用 shell I/O 重定向将参数传入 Perl 脚本?
【发布时间】:2020-10-14 20:57:20
【问题描述】:

对不起,如果这是一个非常基本的问题,因为我对 Perl 还很陌生。

如何使用 I/O 重定向符号(><)将实现参数添加到 Perl 脚本中?

例如

./program.pl file.txt

这适用于在 Perl 脚本中使用 $ARGV[0]$ARGV[1] 等,但我想使用这样传入的参数:

./program.pl < file.txt

【问题讨论】:

  • 也许做个小总结会很有用——在命令行中传递的程序名称后面是参数@ARGV 中的程序可以使用。但是,如果您使用 shell 的重定向 &lt;,那么程序的 STDIN 将来自文件名后面的行。那么你必须阅读&lt;STDIN&gt;。相反,最好使用“神奇的”&lt;&gt; 阅读,如果打开它会读取 STDIN(因此它将与 prog.pl &lt; file 一起使用),它会从所有提交的文件中读取行,所以它也适用于prog.pl file1 file2...

标签: perl arguments parameter-passing


【解决方案1】:

这不会将&lt;file.txt 传递给Perl。这告诉 shell 重定向 perl 的标准输入。

要从标准输入读取,请使用STDIN

while (<STDIN>) {
   chomp;
   print "Got: $_\n";
}

但是,这种情况很少发生。大多数情况下,您希望改为从特殊句柄 ARGV 中读取。

当您从ARGV 读取时,程序参数命名的所有文件(@ARGV 中的所有文件)都被视为一个大文件。如果没有参数传递给程序(@ARGV 为空),则从 ARGV 读取将改为从 STDIN 读取。这为您提供了所有精心设计的 unix 工具(catgrep 等)中的灵活性。

假设你有这个程序 (./a):

while (<>) {   # Same as <ARGV>
   chomp;
   say "Got: $_";
}
$ ./a file1.txt file2.txt
Got: Line 1 from file1.txt
Got: Line 2 from file1.txt
Got: Line 1 from file2.txt
Got: Line 2 from file2.txt

$ ./a <file1.txt
Got: Line 1 from file1.txt
Got: Line 2 from file1.txt

$ grep -h 'Line 1' file1.txt file2.txt | ./a
Got: Line 1 from file1.txt
Got: Line 1 from file2.txt

如果您使用STDIN,则只有最后两个有效。

【讨论】:

    【解决方案2】:

    当您运行 ./program.pl &lt; file.txt 时,shell 不会将 &lt;file.txt 传递给 Perl。文件的内容可以从标准输入中读取。你很有可能会使用:

    while (<>)
    {
        …
    }
    

    在 Perl 脚本中处理输入。如果没有指定名称,它将读取每个指定的文件名或标准输入。如果需要,有一些技巧可以检测文件何时更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-08
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多