为什么我不能在Perl中执行“shift subroutine_name()”?

时间:2015-02-03 22:39:18

标签: perl

为什么此代码会返回Not an ARRAY reference错误?

sub Prog {
    my $var1 = 1;
    my $var2 = 2;
    ($var1, $var2);
}

my $variable = shift &Prog;
print "$variable\n";

如果我使用中间数组,我会避免错误:

my @intermediate_array = &Prog;
my $variable = shift @intermediate_array;
print "$variable\n";

上面的代码现在输出" 1"。

2 个答案:

答案 0 :(得分:13)

子例程Prog返回标量列表。 shift函数仅对数组进行操作。数组和列表不是一回事。数组有存储空间,但列表没有。

如果您想要获取Prog返回的列表的第一个元素,请执行以下操作:

sub Prog {
    return ( 'this', 'that' );
}

my $var = (Prog())[0];
print "$var\n";

我将子调用更改为Prog()而不是&Prog,因为后者显然是旧式的。

您还可以将第一个元素分配给标量,就像其他元素一样:

my ($var) = Prog();

这大致与:

相同
my ($var, $ignored_var) = Prog();

然后忽略$ignored_var。如果你想明确表示你忽略了第二个值而没有实际给它一个变量,你可以这样做:

my ($var, undef) = Prog();

答案 1 :(得分:7)

Prog正在返回列表,而不是数组。像shift这样的操作会修改数组,不能在列表中使用。

您可以改为:

my ($variable) = Prog; # $variable is now 1: 
                       # Prog is evaluated in list context 
                       # and the results assigned to the list ($variable)

请注意,您不需要&