Как я могу выборочно обращаться к элементам, возвращаемым подпрограммой 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]
.