首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能在Perl中做"shift subroutine_name()“呢?

为什么我不能在Perl中做"shift subroutine_name()“呢?
EN

Stack Overflow用户
提问于 2015-02-03 22:39:17
回答 2查看 171关注 0票数 4

为什么这段代码返回一个Not an ARRAY reference错误?

代码语言:javascript
复制
sub Prog {
    my $var1 = 1;
    my $var2 = 2;
    ($var1, $var2);
}

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

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

代码语言:javascript
复制
my @intermediate_array = &Prog;
my $variable = shift @intermediate_array;
print "$variable\n";

上述代码现在输出"1“。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-03 22:45:25

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

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

代码语言:javascript
复制
sub Prog {
    return ( 'this', 'that' );
}

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

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

您还可以向标量分配第一个元素,就像其他人显示的那样:

代码语言:javascript
复制
my ($var) = Prog();

这与以下情况大致相同:

代码语言:javascript
复制
my ($var, $ignored_var) = Prog();

然后无视$ignored_var。如果您想清楚地表明您忽略了第二个值而实际上没有给它一个变量,那么您可以这样做:

代码语言:javascript
复制
my ($var, undef) = Prog();
票数 13
EN

Stack Overflow用户

发布于 2015-02-03 22:45:49

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

你可以这样做:

代码语言:javascript
复制
my ($variable) = Prog; # $variable is now 1: 
                       # Prog is evaluated in list context 
                       # and the results assigned to the list ($variable)

请注意,您不需要&

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28310118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档