2011-12-09 6 views
14

Perl'de bir bölme tarafından elde edilen bir diziye başvuru oluşturmak istiyorum. Ben böyle bir şey düşünüyorum:Perl'de bölünmüş bir ifadeye nasıl başvurulur?

my $test = \split(/,/, 'a,b,c,d,e'); 

foreach $k (@$test) { 
    print "k is $k\n"; 
} 

Ama bu Not an ARRAY reference at c:\temp\test.pl line 3. Bütün başarılı olamadı, birkaç diğer alternatifleri denedik ile şikayet ediyor. Anonim bir başvuru yapmak için köşeli parantezler arasında komut satırı split

cevap

31

Arka plan açıklaması:

split, diğer özellikler gibi, bir listesini verir. Bir listeye başvuru yapamazsınız. Ancak, referans operatörünü bir listeye uygularsanız, tüm üyelerine uygulanır. Örneğin:

use Data::Dumper; 

my @x = \('a' .. 'c'); 

print Dumper \@x 

Çıktı:

$VAR1 = [ 
      \'a', 
      \'b', 
      \'c' 
     ];

nedenle, my $test = \split(/,/, 'a,b,c,d,e'); yazarken, döndürülen listenin son öğeye bir başvuru almak (örneğin What’s the difference between a list and an array? bakınız). Senden beri

my $scalar = ('dog', 'cat', 'bird'); # $scalar gets bird 

:

Eğer sağ taraftaki bir liste var gibi görünse de, Perl aslında bir virgülle ayırarak skalerler bir demet görür: Durumunuz benzer Bir skaler atama, sağ taraf skaler bağlamdadır. Skaler bağlamda virgül operatörü (evet, bir operatördür!), Sol tarafını değerlendirir, sonucu atar ve sonucunu doğru olarak değerlendirir ve sonucu döndürür. Aslında, bu liste benzer bir şekilde skaler atar ve en sağdaki değerdir. Birçok kişi bunda geçen eleman da bekledikleri sayısıdır listesi-lookalike tercih çünkü: Senin durumunda

my $scalar = (1, 2, 3); # $scalar gets 3, accidentally 

, ne RHS olsun elemanlarına referans listesi olduğunu Liste split tarafından döndürüldü ve bu listenin son öğesi $test'da biter. İlk önce bu dönüş değerlerinden bir dizi oluşturup ona bir referans göndermeniz gerekir.

my $test = [ split(/,/, 'a,b,c,d,e') ]; 
+0

Bu yüzden bu yüzden çok seviyorum! Kapsamlı, sabırlı ve çok net açıklamalarınız için çok teşekkürler. Şimdi tamamen açık, bugün çok şey öğrendim. Teşekkürler! –

19

.

my $test = [ split(/,/, 'a,b,c,d,e') ]; 
+0

Teşekkür biraz benim perl kitapta ters eğik çizgi örneklerle yanıltmak oldu: Bir anonim dizi oluşturan ve $test bu başvurusunu saklayarak tek Açıklamada, yapabilirsiniz. –

+1

Bu, split sonucun bir var '@ splitResult' olarak saklanması kadar etkilidir, daha sonra bu varlığa bir referans alarak, $ $ $ $ $ $ \ \ splitResult'? Yoksa iki kere başlatılan dizi mi? Bir kez bölünme sırasında ve tekrar anonim diziyi başlatmak için ref. – Despertar