Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在perl中访问从对象方法返回的数组元素?_Arrays_Perl_Syntax - Fatal编程技术网

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

Arrays 如何在perl中访问从对象方法返回的数组元素?,arrays,perl,syntax,Arrays,Perl,Syntax,我已经使用Perl有一段时间了,但有一个语法问题困扰着我。 在某些包中,方法可以返回数组。比如说 $root->getlist(); 将返回一个数组。现在我想得到结果的第一个元素。我当然可以做到: my @results = $root->getlist(); if($results[0] =~ /wow/) { print "Qualified result"; } 然而,这是非常麻烦的。有没有办法把第一行和第二行结合起来?我试过了,但失败了 if(

我已经使用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的执行已中止

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


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

WANTARY
用于此操作。在返回数组的
子项中,请执行以下操作:

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]

wantarray
更易读。在返回数组的
子文件中,执行以下操作:

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->get_list() )[0] =~ /wow/ ) {
    print "Qualified result";
}
当只需要一个结果时,这将节省获取所有结果的开销。如果它是您特别需要的另一个索引,请编写:

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

我知道,perl并不容易阅读,但是这个比
${$root->get}[0]

更易读。使用perl语法,您可以将返回值分配给变量列表:

if ( ( $root->get_list() )[0] =~ /wow/ ) {
    print "Qualified result";
}
my ($result) = $root->getlist();
print "Qualified result" if $result =~ /wow/;
这是非常基本的Perl语法,通常在需要在sub中获取几个参数时使用:

sub get_three_params {
    my ($foo, $bar, $baz) = @_;
}

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

my ($result) = $root->getlist();
print "Qualified result" if $result =~ /wow/;
这是非常基本的Perl语法,通常在需要在sub中获取几个参数时使用:

sub get_three_params {
    my ($foo, $bar, $baz) = @_;
}


这种方法需要两行代码,这比我提到的不容易。我想在一个语句中访问返回值。这种方法需要两行代码,这比我提到的不容易。我想在一个语句中访问返回值。很抱歉,它实际上不起作用。就像我刚才更新的示例代码一样。@pulseball,您的示例无法工作,因为打印被解释为函数调用。
使用警告来了解我的意思。如果你像Chris一样将它放在If块中,它会工作…至少对我来说是这样。@gpojd现在我明白了。()被解释为函数括号。懒惰让我抓狂。lol。很抱歉它实际上不起作用。就像我刚刚更新的示例代码一样。@pulseball,你的示例不起作用,因为打印被解释为函数调用。
使用警告
来了解我的意思。如果你像Chris一样将它放在If块中,它将……在至少对我来说是这样。@gpojd现在我明白了。该()被解释为函数括号。懒惰让我抓狂。lol。它也不起作用,就像更新问题中的示例一样。它在我的示例代码(在
if
语句中没有多余的括号)或其他上下文(如您添加的示例)中不起作用吗?不,它给出了错误。实际上,Linus Kleen的方法和Chris J的方法都有效。它也不起作用,就像更新问题中的示例。它在我的示例代码(在
if
语句中没有多余的括号)或其他上下文中不起作用(比如您添加的示例)?不,它给出了错误。实际上Linus Kleen的方法和Chris J的方法都有效。该语法错误是因为第一个开括号被解析为
print
参数周围的括号。请尝试
print$obj->getList()[0];
不使用额外的括号,看看它是否有效。除了
使用strict
,您还应该
使用warnings
。如果使用了,您会看到在上一个示例中,您试图将
print
作为函数调用。该语法错误是因为第一个开括号被解析为围绕参数的括号请尝试打印$obj->getList()[0]
不带括号,看看它是否有效。除了
使用strict
,你还应该
使用warnings
。如果你这样做了,你会看到你在上一个例子中试图调用
print
作为函数。你不需要做数组引用并取消引用来获得正确的语法。我同意chris lutz,您可以使用chris J的方法来提取一个元素,但是我完全同意,如果一个元素有良好的行为,而多个元素有不同的良好行为,那么责任就在
sub
上,以使其正确。尤其是在编写它的情况下。您不需要进行数组引用并取消引用来获取它语法正确。我同意chris lutz的观点,你可以使用chris J的方法提取一个元素,但是我完全同意,如果一个元素有好的行为,而许多元素有不同的好的行为,那么责任就在
上。尤其是在你写它的时候。