返回包含单个元素的数组或列表时的列表或标量上下文

时间:2015-08-17 13:20:57

标签: perl

我有一个函数func,它可以返回单个值或值列表,具体取决于函数的调用方式。因此,对于此特定函数,调用者将知道何时仅期望单个返回值,因此希望使用更简单的语法my $var = func( ... )而不是my ($var) = func( ... )。问题是在某些情况下,单个值将转换为具有一个元素的列表/数组的大小,在某些情况下不会。例如:

use feature qw(say);
use strict;
use warnings;

for (1..4) {
    no strict 'refs';
    my $a = &{"func".$_}();
    say $a;
}

sub func1 {
    return ("Hi");
}

sub func2 {
    my @a = ("Hi");
    return @a;
}

sub func3 {
    my @a = ("Hi");
    return (@a);
}

sub func4 {
    my @a = ("Hi");
    return (pop @a);
}

提供输出:

Hi
1
1
Hi

为什么我在某些情况下会获得1而在其他情况下会"Hi"

2 个答案:

答案 0 :(得分:6)

返回表达式在与函数本身相同的上下文中计算。 Here是一个非常全面的列表,列出了在标量上下文中返回的内容。

正如它适用于此:

  • func1:字符串文字并不关心上下文。 "Hi"评估字符串Hi,因此func1返回Hi

  • func2:在标量上下文中,@a评估@a中元素的数量,因此func2返回1

  • func3:在标量上下文中,@a评估@a中元素的数量,因此func3返回1

  • func4pop并不关心上下文。 pop(@a)评估已移除的元素(如果@a为空,则为undef),因此func4会返回Hi

请注意,括号只是覆盖优先级,这对您的任何示例都没有影响。

你想要

sub func {
   my @a = ...;
   return wantarray ? @a : $a[-1];
}

如果你想要聪明,你也可以使用以下内容,因为标量上下文中的切片返回最后一个元素,如果在列表上下文中返回的话:

sub func {
   my @a = ...;
   return @a[0..$#a];
}

答案 1 :(得分:2)

来自perldata

  

如果在标量上下文中计算数组,则返回数组的长度。 (请注意,列表不是这样,它返回最后一个值,如C逗号运算符,也不返回内置函数,返回它们返回的任何内容。)

有时您在标量上下文(func2func3)中返回数组的结果,有时是标量上下文(func1)中字符串文字的结果,有时是结果标量上下文中的popfunc4)。因此存在差异。