2012-03-21 35 views
11

說一個Perl函數返回一個數組:如何有選擇地訪問Perl子例程返回的元素?

sub arrayoutput 
{ 
    ...some code... 
    return @somearray; 
} 

我想從這個僅訪問一個特定的數組元素,比方說第一。所以我可以這樣做:

@temparray=arrayoutput(argument); 

然後參考$temparray[0]

但是這種簡短的參考不起作用:$arrayoutput(some argument)[0]

我習慣於Python,也是Perl的新手,所以我仍然在尋找一些簡短直觀的類似python的方法(a=arrayoutput(some argument)[0])來獲得這個值。我的Perl程序變得很長,使用像這樣的臨時數組似乎很難看。 Perl有沒有辦法做到這一點?

回答

10

Slices

use warnings; 
use strict; 

sub foo { 
    return 'a' .. 'z' 
} 

my $y = (foo())[3]; 
print "$y\n"; 

__END__ 

d 

更新:另一個代碼示例,以解決您的評論。你並不需要一箇中間變量:

use warnings; 
use strict; 

sub foo { 
    return 'a' .. 'z' 
} 

print((foo())[7], "\n"); 

if ((foo())[7] eq 'h') { 
    print "I got an h\n"; 
} 

__END__ 

h 
I got an h 
+0

+1,這個工程。但是我需要創建一箇中間變量來訪問這個值。但這是更好的一步,因爲當我無論如何需要一個變量賦值時,我至少可以使用它。但是在其他情況下,例如'print(foo())[3]'語句或者'if((foo())[3] ...)'語句。 – 2012-03-22 09:43:20

+0

你可以做這兩件事。看到我更新的答案。 – toolic 2012-03-22 12:35:11

+2

請注意,print(foo())[7]'不會按預期工作,因爲perl假定括號屬於函數調用,因此將其解析爲等同於'(print foo())[7] '。但是,'print((foo())[7])'或者更通俗的說法是print +(foo())[7]'將會起作用。 – 2013-12-28 20:07:27

2

單程可能是[(arrayoutput(some argument))]->[0]

+0

+1,This works!我不明白爲什麼這是被低估的。是否有一些不好的編程習慣或其他什麼東西在我這裏失蹤? – 2012-03-22 09:46:41

+1

不需要使用數組引用。我想這就是downvote的原因。 – 2012-03-22 13:46:30

14

只能通過列表環境決絕的第一個參數:

my ($wanted) = array_returning_sub(@args); 

TIMTOWTDI與切片:

my $wanted = (array_returning_sub(@args))[0]; 

兩種風格可以被擴展爲提取返回數組的第n個元素,儘管列表切片在眼睛上更容易一些:

my (undef, undef, $wanted, undef, $needed) = array_returning_sub(@args); 

my ($wanted, $needed) = (array_returning_sub(@args))[2,4]; 
+0

讀爲''數組返回子'',而不是''返回[a]子數組'' – Zaid 2012-03-21 19:09:29

+1

除了subs不能返回數組。他們只能返回標量列表。 – ikegami 2012-03-21 22:05:42

+0

+1。所以這只是一個括號問題!列表切片也比長列表的列表上下文更好。 – 2012-03-22 11:03:15

相關問題