我需要一个函数来返回一个列表,该列表作为map BLOCK LIST
的唯一输入列表使用。我写了return (6);
,因为我想返回一个包含一个元素的列表,但是这个看起来与 括在括号中的标量相同。它会以我想要的方式解释吗?我需要使用像return @{[6]};
这样的丑陋的东西来强制执行我的意图吗?
答案 0 :(得分:6)
此处没有歧义,无法无条件地返回列表。
在Perl 5中,每个表达式(包括子程序调用)都有一个上下文,它是列表上下文(返回零个或多个值)或标量context (只返回一个值)。 return
语句将子例程调用的上下文传播到return
语句中的表达式。我们假设您正在尝试返回包含多个元素的列表:
return (6, 7, 8);
这不保证是一个列表。如果在标量上下文中调用sub,那么return
语句中的逗号表达式也在标量上下文中,并且标量上下文中逗号表达式的行为是返回最右边的值,8
。
如果您改为使用临时数组,
return @{[6, 7, 8]}
然后如果在标量上下文中调用它,您将在标量上下文中获得数组的行为,即返回数组中元素的数量。
上述所有内容都适用于单元素列表,与示例中的三元素列表一样多。
一些一般事实:
无法强行返回列表 - 您只能返回来电者要求的内容。
如果在标量上下文中调用list-y,则没有系统的选择 - 列表中将在列表上下文中返回的元素数量是一种常见的选择,但不是通用的。< / p>
如果你想拥有一个明确指定的子程序,你就不能说“它总是返回一个列表”;你必须指定当需要返回标量时会发生什么。 (如果需要,您可以决定它始终die
。)
如果要根据调用是在标量还是列表上下文中做出明确的选择,可以使用命名不佳的内置wantarray
,如果在列表中调用子例程,则返回true上下文。
这是你所要求的最接近实际存在的东西。请注意,没有括号 - 括号不会影响上下文。
die "can't be scalar" unless wantarray;
return 6;