我有一个返回数组的函数,我只想从该数组中获取第一项,而不需要为该数组声明变量。基本上,它应该是这样的:
functionReturningArray()[1]
但那不管用。
我真的不想浪费空间来声明整个数组,因为我不需要它,而且我不想浪费额外的代码行。不管怎么说,要在一行中完成这件事?
发布于 2010-09-16 15:51:18
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
循环这样的几种情况下很有用。
发布于 2010-09-16 15:54:23
首先,[1]
是列表中的第二项,因为Perl使用从0开始的索引。
其次,您需要在列表上下文中计算函数的返回值,以便访问列表。
(functionReturningArray())[0]
发布于 2010-09-17 02:53:28
比起下面的讨论,查斯的答案更进一步,没有列表周期这回事。
与Python中的元组类型不同,Perl的列表完全是编译器/解释器中堆栈的构造。这就是你不能引用列表的原因。
就像python对元组的使用一样,当使用诸如=
赋值操作符之类的构造时,perl会自动推入和移动其堆栈,以便在变量组之间移动。(Perl的优先级规则需要括号,因为=
比,
绑定得更紧密)。Perl和Python机制之间的宏级差异在于,上下文通过整个表达式传播。
因此,在标量上下文中,该上下文被分配给每个,
运算符,运算符在空上下文中执行左侧,在标量上下文中执行右侧,然后返回。然而,在列表上下文中,,
操作符将其参数推送到堆栈上,所有这些参数都在列表上下文中执行。然后,堆栈通过赋值运算符传递,然后移入左值。堆栈/列表本身对于Perl级别的代码是不可变的,它的修改工具实际上是Perl的所有语法。
因此,虽然在标量上下文中引用列表是不正确的(因为这样的事情不会发生),但您可以引用类似语法构造的列表的行为(由,
运算符构造,由数组切片或列表切片构造)。在标量上下文中,list类构造的行为是返回列表的最后一个元素。如何实现这取决于表达式中的运算符。当然,这与标量上下文中返回其长度的数组的行为形成了对比。
举例说明,并最终遵守规则,实际回答问题:
假设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是最后执行的表达式
- so if `function` ends with `10, 11, 12` then the value will be 12
- if it instead is `@array` then the value will be 3
- and if it ends with `10, 11, 12, @array` the value is also 3
my ( $val ) = ( 10,11,12);#$val is 10my ($val) =(10..20)0 .5;# $val is 10my ( $val ) = @array;# $val is 10my ($val) = function();#$val是最后一条语句中第一个执行的表达式#。
- so if `function` ends with `10, 11, 12` then the value will be 10
- if it instead is `@array` then the value will be 10
- and if it ends with `10, 11, 12, @array` the value is also 10
我的@val = (10,11,12);# @val是10,11,12我的@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是最后执行的语句
- so if `function` ends with `10, 11, 12` then `@val` will be 10, 11, 12
- if it instead is `@array` then `@val` will be 10, 11, 12
- and if it ends with `10, 11, 12, @array` then `@val` will be 10, 11, 12, 10, 11, 12
https://stackoverflow.com/questions/3728337
复制相似问题