2012-03-21 13 views
11

bir Perl altyordam dizisi döndürür ki: Ben, bu sadece belirli bir dizi elemanı erişmek istediğiniz ilk söylemekPerl alt yordamı tarafından döndürülen öğelere nasıl seçici olarak erişebilirim?

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

. Bu yüzden:

ve sonra $temparray[0]'a bakın.

Ancak bu tür bir kısa başvuru çalışmıyor: $arrayoutput(some argument)[0].

Python için kullanılan ve yeni Perl, bu yüzden hala bu değeri elde etmek bazı kısa, sezgisel, piton benzeri şekilde (a=arrayoutput(some argument)[0]) arıyorum duyuyorum. Perl programım çok uzun sürüyor ve bunun gibi geçici diziler kullanmak çirkin görünüyor. Perl'de bunu yapmanın bir yolu var mı?

cevap

10

Slices

use warnings; 
use strict; 

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

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

__END__ 

d 

GÜNCELLEME: Başka kod örneği yorum adres için. Sen bir ara değişkeni gerekmez: sadece liste kapsamında aracılığıyla ilk argüman kapalı

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, bu çalışır. Ama yine de değere erişmek için bir ara değişken oluşturmam gerekiyor. Ama bu bir adım daha iyi, çünkü en azından onu bir değişken atamaya ihtiyacım olduğunda kullanabilirim. Ancak diğer senaryolarda, bir 'print (foo()) [3]' ifadesi ya da 'if ((foo()) [3] ...) ifadesini söyleyiniz. –

+0

Her ikisini de yapabilirsiniz. Güncellenmiş Yanıtıma bakın. – toolic

+2

Baskı (foo()) [7] 'beklendiği gibi çalışmayacağından, çünkü perllerin işlev çağrısına ait olduğunu varsayar ve böylece' (print foo()) [7] 'ye eşdeğer olarak ayrıştırır. '. Ya baskı ((foo()) [7]) 'veya, daha idiomatik olarak,' print + (foo()) [7] 'çalışacaktır. –

2

Tek yön [(arrayoutput(some argument))]->[0] olabilir.

+0

+1, bu iş! Neden bunun reddedildiğini anlamıyorum. Bazı kötü programlama pratikleri ya da eksik olduğum başka bir şey var mı? –

+1

Dizi başvurusu kullanmanıza gerek yoktur. Sanırım bu düşüşün sebebi. –

14

Çekme: Bir dilim

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

TIMTOWTDI:

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

Hem stilleri olabilir liste dilim biraz daha kolay olsa da, döndürülen dizinin n'th elemanını çıkarmak için uzatılmalıdır:

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

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

: "dizi döndüren alt", "değil" dizisi [a] alt "dizini" – Zaid

+1

"dizeleri dışında, diziler döndürülemez. Sadece skaler listelerini geri alabilirler. – ikegami

+0

+1. Yani sadece bir parantez meselesiydi! Dilim listesi ayrıca uzun listeler için listeyi daha iyi. –

İlgili konular