Perl'@_';没有提供预期的投入

Perl'@_';没有提供预期的投入,perl,Perl,我从PERLVARS那里了解到,@_变量是提供给子例程的参数列表。我的理解是,“shift”函数从该列表中弹出第一个值,但是@的元素也可以直接访问,就像其他任何列表一样。我看到的问题是,当一个子例程被多次调用时,@u列表总是包含第一次调用的值,并且这些值似乎不会被更新 #!/usr/bin/perl #Test the shift command foreach(1..5) { print "Input: $_ "; &Test_Shift($_); } #Te

我从PERLVARS那里了解到,@_变量是提供给子例程的参数列表。我的理解是,“shift”函数从该列表中弹出第一个值,但是@的元素也可以直接访问,就像其他任何列表一样。我看到的问题是,当一个子例程被多次调用时,@u列表总是包含第一次调用的值,并且这些值似乎不会被更新

#!/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"是搜索算法出了问题。