Perl 如何将@ARGV元素分配给$variable,然后打印它?

Perl 如何将@ARGV元素分配给$variable,然后打印它?,perl,command-line-arguments,argv,string-interpolation,Perl,Command Line Arguments,Argv,String Interpolation,人们经常以各种方式问这个问题,但是,我要再次问,因为我没有完全理解@ARGV的应用,并且因为我没有找到这个问题的答案(或者,更可能的是,我不理解已经提供的答案和解决方案) 问题是,为什么没有从命令行读取任何内容?另外,如何解密错误消息 在连接(.)或字符串中使用未初始化的值$name 我知道@ARGV是一个存储命令行参数(文件)的数组。我还了解到,它可以像任何其他数组一样进行操作(请记住索引$ARGV[0]与文件名变量$0的命令行功能不同)。我知道,在while循环中,菱形操作符将自动将@ARG

人们经常以各种方式问这个问题,但是,我要再次问,因为我没有完全理解
@ARGV
的应用,并且因为我没有找到这个问题的答案(或者,更可能的是,我不理解已经提供的答案和解决方案)

问题是,为什么没有从命令行读取任何内容?另外,如何解密错误消息

在连接(.)或字符串中使用未初始化的值$name

我知道
@ARGV
是一个存储命令行参数(文件)的数组。我还了解到,它可以像任何其他数组一样进行操作(请记住索引
$ARGV[0]
与文件名变量
$0
的命令行功能不同)。我知道,在while循环中,菱形操作符将自动
@ARGV
的第一个元素移位为
$ARGV[]
,并在输入时读取一行

我不明白的是如何将
@ARGV
的元素分配给标量变量,然后打印数据。例如(代码概念取自学习Perl)

my$name=shift@ARGV;
而(){
打印“输入是在$\n开头找到的$name”;
出口
}
代码显示时,
$name
的输出为空;如果我省略了
shift()
$name
将输出
0
,我认为它应该是在标量上下文中输出的,但它不能回答为什么命令行的输入不被接受的问题。您的见解将不胜感激


谢谢。

我的$name=shift@ARGV
确实指定了程序的第一个参数。如果在连接(.)中使用未初始化的值$name,或者在…
处使用字符串,那是因为您没有向程序提供任何参数

$perl-we'my$name=shift(@ARGV);打印“我的名字是$name.\n”
在-e第1行的串联(.)或字符串中使用未初始化的值$name。
我的名字是。
$perl-we'my$name=shift(@ARGV);打印“我的名字是$name.\n”'ikegami
我的名字叫ikegami。
事后使用
绝对没有问题

$cat foo
foo1
食物2
$cat酒吧
bar1
bar2
$perl-我们正在
打印“(\@ARGV现在是@ARGV)\n”;
my$prefix=shift(@ARGV);
打印“(\@ARGV现在是@ARGV)\n”;
而(){
打印“$prefix$”;
打印“(\@ARGV现在是@ARGV)\n”;
}
''>>>'富吧
(@ARGV现在是>>>foobar)
(@ARGV现在是foo-bar)
>>>foo1
(@ARGV现在是bar)
>>>食物2
(@ARGV现在是bar)
>>>bar1
(@ARGV现在是)
>>>bar2
(@ARGV现在是)

如果这是您的整个程序(在开始时带有
使用警告;
使用严格;
),那么当您使用参数运行它时,如
prog.pl hello
,它将等待输入,因为
读取
STDIN
,如果没有向程序提供文件。(由于您从
@ARGV
(它只有
hello
单词)执行
shift
-ed操作,因此
中没有任何内容,因此
会等待。)然后您点击enter,它会运行print语句,变量
$name
中有
hello
。(如果您在开始时没有给程序任何东西,那么
$name
是空的,但您似乎知道这一点。)我不明白它为什么/如何对您有不同的行为?在一个循环中
while()
从终端读取的任何输入都被分配给
$\uu
——您不打印它,因此无法看到它。但是,这仍然不能解释如何将
$name
设置为空(如果在启动程序时向程序传递参数)。所以你的问题描述中有些不对劲?注意,
@ARGV
中的内容视为文件名,并逐行打开和读取这些文件。请在第页中查找Perl的特殊变量。在第页中找到错误消息的简要说明。很好,所以它得到了澄清,特别是ikegami的回答:)。这是一个很好的问题,写得很仔细。请注意,我上面提到的是,如果您向脚本提供参数,那么当执行到
时,这些参数将被视为文件(除非之前已从
@ARGV
中删除),并逐行打开和读取。这非常有用,因为您可以使用
while()
逐行处理
STDIN
或处理文件(提示并等待输入,或读取“管道”到程序中的输入)。Flexible:)感谢您详细说明脚本的正确性,以及我没有按照脚本的预期在命令行中提供输入的疏忽。我不熟悉您从命令行编写和运行脚本的方法,但我将阅读您的示例。三个尖括号
>
用于什么?我在命令行上提供程序的事实与此无关。如果程序在文件中,也会发生同样的情况。所以只要假设
perl-we'.'
perl foo.pl
/foo.pl
///这就是参数。使用一个名字并没有真正的意义sense@Den当您从命令行
perl-e'…'
运行时,
'
之间的内容被视为一个perl程序并执行(即
-e
)。方便快速测试(甚至可能没有bash脚本或类似的东西)。此外,还有许多方便的开关,例如,
perl-ne'.'文件
将打开
文件
,并应用
'
中的代码逐行检查它(即
-n
)。看见在bashshell中,您甚至可以将其分散到多行,这样就可以将上面的程序复制并粘贴到您的shell中,然后按enter键运行它。@Den我听说过它,从未见过它。很抱歉开始时有点颠簸——如果事情发生在你面前,任何编程语言都可能被压倒,尤其是Perl是一个p
my $name = shift @ARGV;

while (<>) {
    print “The input was $name found at the start of $_\n”;
    exit;
}