Как получить доступ к элементу массива, возвращенного из метода объекта в Perl? - PullRequest
0 голосов
/ 02 сентября 2011

Я давно пользуюсь Perl, но меня беспокоит одна проблема с синтаксисом. В некоторых пакетах метод может возвращать массив. Например

$root->getlist();

Вернет массив. Теперь я хочу получить первый элемент результата. Конечно, я могу сделать это:

my @results = $root->getlist();
if($results[0] =~ /wow/) {
    print "Qualified result";
}

Однако это очень хлопотно. Есть ли способ, которым я могу объединить первую строку со второй строкой? Я попробовал это, но не получилось.

if(${$root->getlist()}[0] =~ /wow/) {
    print "Qualified result";
}

Есть ли способ сделать это быстро?

Лучший пример: Рассмотрим следующий пакет:

package Try;

sub new {
    my $package = shift;
    return bless({}, $package);
}

sub getList {
    return (1,2,3,4,5);
}

1;

Теперь у меня есть пользовательский файл, подобный этому:

use lib '.';
use Try;
use strict;

my $obj = Try->new();
print ($obj->getList())[0];

Попытка запустить этот скрипт приведет к:

синтаксическая ошибка в строке 6 perlarrayaccess.pl, рядом с ") ["

Выполнение perlarrayaccess.pl прервано из-за ошибок компиляции.

Ответы [ 4 ]

3 голосов
/ 02 сентября 2011
if ( ( $root->get_list() )[0] =~ /wow/ ) {
    print "Qualified result";
}
2 голосов
/ 02 сентября 2011

Для этого есть wantarray. В вашем sub возвращающем массив выполните:

sub getlist()
{
    my $self = shift;

    #  caller wants the full list
    if (wantarray) {
        # fetch all
        return @all_results;
    } else {
        # fetch only first result here.
        return $one_result;
    }
}

Это избавит вас от необходимости извлекать все результаты, когда требуется только один. Если вам нужен другой индекс, напишите:

if ([$root->getlist]->[5] =~ /wow/) {
...
}

Я знаю, Perl не для легкого чтения, но этот более разборчивый, чем ${$root->get}[0].

0 голосов
/ 03 сентября 2011

Используя синтаксис Perl, вы можете просто присвоить возвращаемое значение списку переменных:

my ($result) = $root->getlist();
print "Qualified result" if $result =~ /wow/;

Это очень простой синтаксис Perl, который часто используется, когда вам нужно получить несколько параметров в sub:

sub get_three_params {
    my ($foo, $bar, $baz) = @_;
}
0 голосов
/ 02 сентября 2011
if($root->getlist()[0] =~ /wow/) {
    print "Qualified result";
}

Должен работать.Второе, что вы попробовали, обрабатывает возвращаемое значение как массив ссылка и пытается разыменовать его.Метод просто возвращает массив (точнее, список - разница есть), поэтому вам нужно просто получить доступ к нужному элементу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...