如何访问perl中的对象方法返回的数组元素?

时间:2011-09-02 19:31:37

标签: arrays perl syntax

我一直在使用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;

现在我有一个像这样的用户pl文件:

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

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

尝试运行此脚本将导致:

  perlarrayaccess.pl第6行的

语法错误,靠近“)[”

     

由于编译错误,perlarrayaccess.pl的执行中止。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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]更易读。

答案 2 :(得分:0)

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

应该工作。您尝试的第二件事是将返回的值视为数组引用并尝试取消引用它。该方法只返回一个数组(或者更确切地说,一个列表 - 存在差异),因此您只需要访问所需的元素。

答案 3 :(得分:0)

使用Perl语法,您只需将返回值分配给变量列表:

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

这是非常基本的Perl语法,当您需要在sub:

中获取少量参数时经常使用这种语法
sub get_three_params {
    my ($foo, $bar, $baz) = @_;
}