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

Håk*_*and 3 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);
}
Run Code Online (Sandbox Code Playgroud)

给出输出:

Hi
1
1
Hi
Run Code Online (Sandbox Code Playgroud)

为什么在某些情况下和"Hi"其他情况下会得到1 ?

ike*_*ami 6

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

适用于此:

  • func1:字符串文字不关心上下文."Hi"计算字符串Hi,所以func1返回Hi.

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

  • func3:在标量上下文中,@a计算元素的数量@a,因此func3返回1.括号只是覆盖优先级,这在此处无效.

  • func4:pop不关心背景.pop(@a)计算已删除的元素(如果@a为空则为undef ),因此func4返回Hi.

你要

sub func {
   my @a = ...;
   return wantarray ? @a : $a[-1];
}
Run Code Online (Sandbox Code Playgroud)

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

sub func {
   my @a = ...;
   return @a[0..$#a];
}
Run Code Online (Sandbox Code Playgroud)

  • @HåkonHægland,"List"是一个非常通用的词.在pilcrow的引用中,"list"指的是list运算符,也称为逗号运算符.所以`"嗨"`不是列表,而是"嗨","我"是.(Parens只改变优先级.)// List通常也指子或函数返回的内容.它只是意味着"一定数量的标量".//在列表上下文中,list/comma运算符"Hi","I"`返回一个由两个标量组成的列表.与所有其他运算符一样,list/comma运算符"Hi","I"`在标量上下文中返回单个标量. (2认同)