2011-09-02 87 views
0

我一直在使用Perl一段時間,但卻受到一個語法問題的困擾。 在一些包中,一個方法可以返回一個數組。例如如何訪問從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

該語法錯誤是因爲第一個開放括號被解析爲圍繞「print」參數的括號。嘗試'打印$ obj-> getList()[0];'沒有額外的括號,看它是否工作。 –

+2

除'嚴格使用'外,您還應該'使用警告'。如果你這樣做了,你會發現你在最後一個例子中試圖調用'print'作爲一個函數。 – gpojd

回答

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

對不起,它實際上不起作用。就像我剛剛更新的示例代碼一樣。 –

+2

@pulseball,你的例子不起作用,因爲打印被解釋爲函數調用。 '用警告'來看看我的意思。如果你把它放在if區塊裏,像Chris一樣,它會起作用......至少它對我有用。 – gpojd

+0

@gpojd現在我明白了。 ()被解釋爲函數括號。懶惰讓我撓我的腦袋。大聲笑。 –

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

應該工作。您嘗試的第二件事將返回值視爲數組參考,並嘗試對其進行解引用。該方法只是返回一個數組(或者說,一個列表 - 有一個區別),所以你只需要訪問你想要的元素。

+0

它也不起作用,就像更新問題中的示例一樣。 –

+0

它不在我的示例代碼中工作嗎?(在'if'語句中沒有多餘的括號)或在其他上下文中(如添加的示例)? –

+0

不,它給出了錯誤。實際上Linus Kleen的方法和Chris J的方法都起作用。 –

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]更清晰。

+0

您不應該需要創建數組引用並對其進行解引用才能使語法正確。 –

+0

我同意chris lutz,你可以用chris j的方法來拉一個元素,但是我完全同意,如果要有一個元素有很好的行爲並且對於很多元素有不同的好行爲,那麼這個責任可以放在'sub'上,做對了。尤其是如果你正在寫它。 –

0

使用Perl語法,你可以返回值只分配到的變量列表:

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

這是非常基本的Perl語法經常使用,當你需要在子獲得幾個參數:

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

這種方式需要兩條線,這比我提到的要容易得多。我想在一個語句中訪問返回的值 –

相關問題