我对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提醒我的那样,当列表被强制转换为标量上下文时,该值将成为列表的大小。
答案 0 :(得分:4)
my $Test2 = @_;
在标量上下文中计算@_
,这将评估数组中元素的数量。你想要
my ($Test2) = @_;