Как я могу выборочно обращаться к элементам, возвращаемым подпрограммой Perl?

Скажите, что подпрограмма Perl возвращает массив:

sub arrayoutput
{
    ...some code...
    return @somearray;
}

Я хочу получить доступ только к определенному элементу массива из этого, скажем, к первому. Поэтому я мог бы сделать:

@temparray=arrayoutput(argument);

а затем обратитесь к $temparray[0].

Но эта короткая ссылка не работает: $arrayoutput(some argument)[0].

Я использую Python и новый для Perl, поэтому я все еще ищу короткий, интуитивный, похожий на питон способ (a=arrayoutput(some argument)[0]), чтобы получить это значение. Мои программы Perl становятся очень длинными, и использование временных массивов вроде бы кажется уродливым. Есть ли способ в Perl сделать это?

Ответ 1

Slices

use warnings;
use strict;

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

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

__END__

d

UPDATE: еще один пример кода для вашего комментария. Вам не нужна промежуточная переменная:

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

Ответ 2

Отключите первый аргумент только через контекст списка:

my ( $wanted ) = array_returning_sub( @args );

TIMTOWTDI с фрагментом:

my $wanted = ( array_returning_sub( @args ) )[0];

Оба стиля могут быть расширены, чтобы извлечь n-й элемент возвращаемого массива, хотя фрагмент списка немного проще на глазу:

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

my ( $wanted, $needed ) = ( array_returning_sub( @args ) )[2,4];

Ответ 3

Один способ может быть [(arrayoutput(some argument))]->[0].