我有一个返回一个数组的函数,我想从该数组中得到第一个项而不会为数组声明一个变量。基本上,它应该是这样的:
functionReturningArray()[1]
除此之外不起作用。
我真的不想浪费空间来声明整个阵列,因为我不需要它,而且我宁愿不浪费额外的代码行。无论如何要在一行中做到这一点?
答案 0 :(得分:12)
my $item = (function_returning_list())[0];
函数不能返回数组,它们可以返回数组的内容(即列表)。列表从0
开始编制索引,因此函数返回的第一项是(func)[0]
。你也可以说
my ($item) = function_returning_list();
这会将function_returning_list
置于列表上下文中,并对左侧列表中的变量进行赋值(按顺序)。
重要的是要注意
sub function_returning_list {
return ("a", "b", "c")
}
my $item = function_returning_list();
可能不会达到您的预期。 $item
变量将被指定为"c"
。这是因为在标量上下文中没有列表这样的东西。相反,您在标量上下文中有逗号运算符,并在void上下文中计算左手表达式,丢弃结果,然后在标量上下文中计算右侧。
我调用一个序列(而不是一个列表),如果像C风格的for
循环一些情况,它会很有用。
答案 1 :(得分:2)
首先,[1]
是列表中的第二项,因为Perl使用从0开始的索引。
其次,您需要在列表上下文中评估函数的返回值,以便有一个列表可供访问。
(functionReturningArray())[0]
答案 2 :(得分:2)
比Chas的回答更进一步,没有列表期间的事情。
与具有填充此角色的元组类型的Python不同,Perl的列表完全是编译器/解释器中堆栈的构造。这就是为什么你不能参考列表。
就像python使用元组一样,当使用诸如=
赋值运算符之类的构造时,perl会自动推送并移动其堆栈以在变量组周围移动。 (Perl的优先规则是需要括号的,因为=
比,
更紧密。 Perl和Python机制之间的宏观层次差异是上下文在整个表达式中传播。
因此,在标量上下文中,该上下文被分配给每个,
运算符,并且运算符在void上下文中执行其左侧,而在标量上下文中执行它的右侧,然后返回。但是在列表上下文中,,
运算符将其参数推送到堆栈,所有这些都在列表上下文中执行。然后堆栈通过赋值运算符,然后转移到左值。堆栈/列表本身对Perl级别代码是不可变的,它的修改工具实际上是Perl的所有语法。
因此,虽然在标量上下文中引用列表是不正确的(因为这样的事情不可能发生),但您可以参考列表的行为,如句法结构(由,
运算符构造,由数组切片或列表切片)。在标量上下文中,类似构造的列表的行为是返回列表的最后一个元素。如何实现这取决于表达式中的运算符。这当然与标量上下文中返回其长度的数组行为形成对比。
通过一个例子澄清并最终遵守规则并实际回答问题:
假设my @array = (10, 11, 12);
标量上下文
my $val = (10, 11, 12); # $val is 12
my $val = (10 .. 20)[0 .. 5]; # $val is 15
my $val = @array; # $val is 3
my $val = function(); # $val is the last executed expression
function
以10, 11, 12
结尾,那么该值将为12 @array
,那么该值将为3 10, 11, 12, @array
结尾,则值也为3
列出上下文
my ($val) = (10, 11, 12); # $val is 10
my ($val) = (10 .. 20)[0 .. 5]; # $val is 10
my ($val) = @array; # $val is 10
my ($val) = function(); # $val is the first executed expression
# in the last statement.
function
以10, 11, 12
结尾,那么该值将为10 @array
,那么该值将为10 10, 11, 12, @array
结尾,则值也为10
并且为了完整性,列出上下文将整个列表抓取到数组中
my @val = (10, 11, 12); # @val is 10, 11, 12
my @val = (10 .. 20)[0 .. 5]; # @val is 10, 11, 12, 13, 14, 15
my @val = @array; # @val is 10, 11, 12
my @val = function(); # @val is the the last executed statement
function
以10, 11, 12
结尾,则@val
将为10,11,12 @array
,那么@val
将是10,11,12 10, 11, 12, @array
结尾,则@val
将为10,11,12,10,11,12