如何有选择地访问Perl子例程返回的元素?

Abh*_*Das 12 arrays perl subroutine

假设Perl子例程返回一个数组:

sub arrayoutput
{
    ...some code...
    return @somearray;
}
Run Code Online (Sandbox Code Playgroud)

我想从这里只访问一个特定的数组元素,比如第一个.所以我能做到:

@temparray=arrayoutput(argument);
Run Code Online (Sandbox Code Playgroud)

然后参考$temparray[0].

但这种简短的参考不起作用:$arrayoutput(some argument)[0].

我已经习惯了Python和Perl的新手,所以我仍然在寻找一些简短,直观,类似python的方式a=arrayoutput(some argument)[0]来获取这个值.我的Perl程序变得越来越长,使用像这样的临时数组似乎很难看.Perl有没有办法做到这一点?

Zai*_*aid 15

仅通过列表上下文拉出第一个参数:

my ( $wanted ) = array_returning_sub( @args );
Run Code Online (Sandbox Code Playgroud)

带片的TIMTOWTDI:

my $wanted = ( array_returning_sub( @args ) )[0];
Run Code Online (Sandbox Code Playgroud)

两种样式都可以扩展为提取返回数组的第n个元素,尽管列表切片在眼睛上更容易:

my ( undef, undef, $wanted, undef, $needed ) = array_returning_sub( @args );

my ( $wanted, $needed ) = ( array_returning_sub( @args ) )[2,4];
Run Code Online (Sandbox Code Playgroud)


too*_*lic 10

use warnings;
use strict;

sub foo {
    return 'a' .. 'z'
}

my $y = (foo())[3];
print "$y\n";

__END__

d
Run Code Online (Sandbox Code Playgroud)

更新:另一个代码示例来解决您的评论.您不需要中间变量:

use warnings;
use strict;

sub foo {
    return 'a' .. 'z'
}

print( (foo())[7], "\n" );

if ( (foo())[7] eq 'h') {
    print "I got an h\n";
}

__END__

h
I got an h
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`print(foo())[7]`将无法正常工作,因为perl假定括号属于函数调用,因此将其解析为等同于`(print foo())[7]` .然而,`print((foo())[7])`或者更具有惯用力的是,'print +(foo())[7]`会起作用. (2认同)