2010-07-01 25 views
16

Bu soru, hem PHP hakkında hem here hem de here ile ilgili olarak sorulmuştur ve aynı soruya Perl. Bir liste döndüren bir işlev göz önüne alındığında, geçici bir değişken kullanmadan hemen onu dizine eklemek için herhangi bir yol (veya en iyi yol nedir) var mı? ÖrneğinPerl'de döndürülen dizine doğrudan dizinleme

:

my $comma_separated = "a,b,c"; 
my $a = split (/,/, $comma_separated)[0]; #not valid syntax 

ikinci satırında sözdizimi geçersiz anlıyorum, bu yüzden aynı etkiyi elde etmek için bir yol varsa Önce bir listeye dönüş değeri atamadan merak ediyorum ve bundan indeksleme. Sadece bunu yapabilirsiniz sever

my $a = (split /,/, $comma_separated)[0]; 

cevap

25

Sadece listesini tanımlamak için ve daha sonra endeksi istediğiniz eleman (lar) çekmek için parantezleri kullanabilirsiniz

($a, $b, $c) = @array; 
Bunu yapabilirsin

: LHS'nin (sol taraf) üzerinde

my($a) = split /,/, $comma_separated; 

my $a

skaler içerik olarak işlenir. my($a), liste içeriğidir. Tek eleman listesi, split'dan dönen ilk elementi alır.

Bu, bölünmeyi otomatik olarak sınırlandırmanın ek yararına sahiptir, bu nedenle $comma_separated büyükse, boşa harcanan iş yoktur.

+0

Bu çok basitti --- teşekkürler. – Carl

+7

Birçok durumda, parantez işlev dals'lerinde isteğe bağlı olduğundan, genellikle bunu “my $ x = (split /,/=> $ str) [0]' –

+0

@Carl olarak yazabilirim. "split (...)" için parantezler sadece * aramayı * çağırırlar -> bu argümanlarla bölünmek istediğinizde. Üzerine bir '[0]' atarak az anlam ifade eder. Ancak '(split ...)', döndüğünüz değeri gerçekten döndürür *, bu gerçekten endekslemek istediğiniz şeydir. – Axeman

8

:

+4

Perl, bu optimizasyonu zaten otomatik olarak gerçekleştirir. "Perldoc -f split" den: "Bir listeye atanırken, LIMIT atlanırsa veya sıfır olursa, Perl gereksiz işlerden kaçınmak için listedeki değişken sayısından büyük bir LIMIT sağlar." – Sean

+0

Oh neat, hiç bir fikrim yoktu! Her zaman böyle yapar. – Schwern

İlgili konular