Perl'@_';没有提供预期的投入
我从PERLVARS那里了解到,@_变量是提供给子例程的参数列表。我的理解是,“shift”函数从该列表中弹出第一个值,但是@的元素也可以直接访问,就像其他任何列表一样。我看到的问题是,当一个子例程被多次调用时,@u列表总是包含第一次调用的值,并且这些值似乎不会被更新Perl'@_';没有提供预期的投入,perl,Perl,我从PERLVARS那里了解到,@_变量是提供给子例程的参数列表。我的理解是,“shift”函数从该列表中弹出第一个值,但是@的元素也可以直接访问,就像其他任何列表一样。我看到的问题是,当一个子例程被多次调用时,@u列表总是包含第一次调用的值,并且这些值似乎不会被更新 #!/usr/bin/perl #Test the shift command foreach(1..5) { print "Input: $_ "; &Test_Shift($_); } #Te
#!/usr/bin/perl
#Test the shift command
foreach(1..5) {
print "Input: $_ ";
&Test_Shift($_);
}
#Test the @_ list
foreach(1..5) {
print "Input: $_ ";
&Test_List($_);
}
sub Test_Shift() {
my $Test1 = shift;
print "Returns: $Test1 \n";
}
sub Test_List() {
my $Test2 = @_;
print "Returns: $Test2 \n";
}
结果
Input: 1 Returns: 1
Input: 2 Returns: 2
Input: 3 Returns: 3
Input: 4 Returns: 4
Input: 5 Returns: 5
Input: 1 Returns: 1
Input: 2 Returns: 1
Input: 3 Returns: 1
Input: 4 Returns: 1
Input: 5 Returns: 1
我做错了什么或误解了什么
更新
根据池上的建议,我更改了以下行
#Original
my $Test2 = @_;
#New
my ($Test2) = @_;
这将产生预期的输出。正如Ikegami提醒我的那样,当列表被强制到标量上下文中时,该值就变成了列表的大小
my $Test2 = @_;
在标量上下文中计算@
,它计算数组中的元素数。你想要
my ($Test2) = @_;
在标量上下文中计算@
,它计算数组中的元素数。你想要
my ($Test2) = @_;
一个很好的资源:顺便说一句,您的原型(
()
)不正确(它们表示sub不接受任何参数),这就是为什么您必须使用&
覆盖它们。去掉原型和&
。如果将1..5
更改为4..9
Re,“当列表强制为标量上下文时,值变为列表的大小”,则会更好地看到问题。上下文不强制值,它首先影响操作符返回的内容@
不返回强制的列表<代码> @“< /COD>”返回它包含的元素的数量。@拜伦琼斯:似乎是您的努力来解释C++语言中的Perl代码,这会使您感到困惑。code>@不是列表对象,而是数组。当在标量上下文中使用数组时,它的计算结果为数组中的元素数。(在列表上下文中使用时,其计算结果为其元素的值列表。)任何数组@xx
的第一个元素是标量值,因此具有美元前缀$xx[0]
<代码>$(@[0])没有什么特别之处,是一个语法错误。您现在应该忽略原型。它们的用途在Perl中比在其他语言中更为深奥。一个很好的资源:顺便说一下,您的原型(()
)是不正确的(它们表示sub不接受任何参数),这就是为什么您必须使用&
覆盖它们。去掉原型和&
。如果将1..5
更改为4..9
Re,“当列表强制为标量上下文时,值变为列表的大小”,则会更好地看到问题。上下文不强制值,它首先影响操作符返回的内容@
不返回强制的列表<代码> @“< /COD>”返回它包含的元素的数量。@拜伦琼斯:似乎是您的努力来解释C++语言中的Perl代码,这会使您感到困惑。code>@不是列表对象,而是数组。当在标量上下文中使用数组时,它的计算结果为数组中的元素数。(在列表上下文中使用时,其计算结果为其元素的值列表。)任何数组@xx
的第一个元素是标量值,因此具有美元前缀$xx[0]
<代码>$(@[0])没有什么特别之处,是一个语法错误。您现在应该忽略原型。在Perl中,它们的用途比在其他语言中要深奥得多。是的,你完全正确。从C/C++/C#的历史来看,Perl处理变量的方式让我大吃一惊。为什么要回答一个如此明显重复的问题呢?@Matt Jacob,因为所谓的重复很少出现。最好回答和结束。在辩护中,我确实搜索了其他涉及@!。我没有找到上一个问题。我认为“@u”与“@u”的对比让搜索算法出错了。是的,你完全正确。从C/C++/C#的历史来看,Perl处理变量的方式让我大吃一惊。为什么要回答一个如此明显重复的问题呢?@Matt Jacob,因为所谓的重复很少出现。最好回答和结束。在辩护中,我确实搜索了其他涉及@!。我没有找到上一个问题。我想"uu"对"uu"是搜索算法出了问题。