为什么我不能在 Perl 中执行 "shift subroutine_name()"?
Why I can't do "shift subroutine_name()" in Perl?
为什么此代码 return 出现 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”。
子例程 Prog
returns 标量列表。 shift
函数仅对数组进行操作。数组和列表不是一回事。数组有存储空间,列表没有。
如果您想要获取列表的第一个元素 Prog
returns,请执行以下操作:
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();
Prog
返回的是 list,而不是 array。 shift
等操作修改数组,不能用于列表。
您可以改为:
my ($variable) = Prog; # $variable is now 1:
# Prog is evaluated in list context
# and the results assigned to the list ($variable)
请注意,您不需要 &
。
为什么此代码 return 出现 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”。
子例程 Prog
returns 标量列表。 shift
函数仅对数组进行操作。数组和列表不是一回事。数组有存储空间,列表没有。
如果您想要获取列表的第一个元素 Prog
returns,请执行以下操作:
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();
Prog
返回的是 list,而不是 array。 shift
等操作修改数组,不能用于列表。
您可以改为:
my ($variable) = Prog; # $variable is now 1:
# Prog is evaluated in list context
# and the results assigned to the list ($variable)
请注意,您不需要 &
。