我一直在使用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的执行中止。
答案 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) = @_;
}