Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从在Perl中返回数组的函数中获取第一项?

如何从在Perl中返回数组的函数中获取第一项?
EN

Stack Overflow用户
提问于 2010-09-16 15:45:29
回答 3查看 1K关注 0票数 6

我有一个返回数组的函数,我只想从该数组中获取第一项,而不需要为该数组声明变量。基本上,它应该是这样的:

functionReturningArray()[1]

但那不管用。

我真的不想浪费空间来声明整个数组,因为我不需要它,而且我不想浪费额外的代码行。不管怎么说,要在一行中完成这件事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-16 15:51:18

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
my $item = (function_returning_list())[0];

函数不能返回数组,它们可以返回数组(即列表)的内容。列表是从0开始索引的,所以函数返回的第一项是(func)[0]。你也可以说

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
my ($item) = function_returning_list();

这会将function_returning_list放在列表上下文中,并(按顺序)对左侧列表中的变量进行赋值。

值得注意的是,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sub function_returning_list {
    return ("a", "b", "c")
}

my $item = function_returning_list();

很可能不会做你期望的事情。将为$item变量分配"c"。这是因为在标量上下文中没有列表这样的东西。相反,您在标量上下文中使用逗号运算符,它在void上下文中计算左侧表达式,丢弃结果,然后在标量上下文中计算右侧表达式。

我调用一个序列(而不是一个列表),这在像C风格的for循环这样的几种情况下很有用。

票数 12
EN

Stack Overflow用户

发布于 2010-09-16 15:54:23

首先,[1]是列表中的第二项,因为Perl使用从0开始的索引。

其次,您需要在列表上下文中计算函数的返回值,以便访问列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(functionReturningArray())[0]
票数 2
EN

Stack Overflow用户

发布于 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是最后执行的表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 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是最后一条语句中第一个执行的表达式#。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 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是最后执行的语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3728337

复制
相关文章

相似问题

在Perl中如何从mongoDB中获取返回的数据?

10

从perl中的函数中获取返回布尔值

23

在perl中获取param函数数组

34

如何使用pop - Perl从数组的数组中返回数组

31

在Perl中返回数组

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文