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

时间:2016-02-26 22:38:16

标签: perl

我对PERLVARS的理解是' @ _' variable是提供给子例程的参数列表。我的理解是'转变'#39;函数弹出该列表中的第一个值,但也可以直接访问@_的元素,就像任何其他列表一样。我看到的问题是,当一个子程序被多次调用时,@ _列表总是包含第一次调用的值,并且值似乎不会更新。

#!/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 

我做错了什么或误解了什么?

更新

根据Ikegami的建议,我更改了以下行

#Original
my $Test2 = @_;

#New
my ($Test2) = @_;

这会产生预期的输出。正如Ikegami提醒我的那样,当列表被强制转换为标量上下文时,该值将成为列表的大小。

1 个答案:

答案 0 :(得分:4)

my $Test2 = @_;

在标量上下文中计算@_,这将评估数组中元素的数量。你想要

my ($Test2) = @_;