【发布时间】:2021-02-14 14:01:12
【问题描述】:
这个问题经常以各种方式被问到,但是我要再问一次,因为我没有完全理解@ARGV的应用,因为我还没有找到这个问题的答案(或者,更有可能是我不明白已经提供的答案和解决方案)。
问题是,为什么命令行没有读取任何内容?另外,如何解密错误信息,
在连接 (.) 或字符串 ... 中使用未初始化的值 $name?
我了解@ARGV 是一个存储命令行参数(文件)的数组。我也明白它可以像任何其他数组一样被操作(记住索引$ARGV[0] 与文件名变量的命令行功能$0 不同)。我知道在while循环中,菱形运算符会自动将shift 的第一个元素@ARGV 作为$ARGV[ ],在输入处读取一行。
我不明白的是如何将@ARGV 的元素分配给标量变量,然后打印数据。例如(取自Learning Perl的代码概念),
my $name = shift @ARGV;
while (<>) {
print “The input was $name found at the start of $_\n”;
exit;
}
就代码而言,$name 的输出是空白的;如果我省略shift(),$name 将输出0,因为我相信它应该在标量上下文中,但它没有回答为什么命令行输入也不被接受的问题。我们将不胜感激您的见解。
谢谢。
【问题讨论】:
-
如果这是您的整个程序(以
use warnings;和use strict;开头)然后当您运行它时带有参数,例如prog.pl hello,它将等待输入,因为<>读取STDIN如果没有文件给程序。 (因为你shift-ed 来自@ARGV,它只有hello字,所以里面什么都没有,所以<>等待。)然后你按下回车键,它运行 print 语句,hello在变量$name。 (如果你在开始时什么都不给程序,那么$name是空的,但你似乎知道这一点。)我不明白它为什么/如何对你有不同的表现? -
在循环中
while (<>)从终端读取的任何输入都分配给$_- 你不打印它,所以没有办法看到它。但是,这仍然不能解释如何让$name为空(如果在启动程序时将参数传递给程序)。所以你的问题描述有问题?请注意,@ARGV中的内容被<>视为文件名,这些文件将逐行打开和读取。 -
太好了,所以很清楚,尤其是 ikegami 的回答:)。这是一个很好的问题,写得很仔细。请注意,我上面提到的,如果您向脚本提供参数,那么当执行到
<>时,这些参数将被视为文件(除非它们已经从@ARGV之前被删除),它们被打开并逐行读取线。这非常有用,因为您可以使用while (<>)或者逐行处理STDIN(提示并等待输入,或将输入“通过管道”读入程序)或 处理文件。灵活:)
标签: perl command-line-arguments argv string-interpolation