Diziler içindeki dizilere erişme

Farklı çıktı üreten iki kod parçam var ve nedenini anlamakta büyük zorluk çekiyorum.

Kod snippet'i 1:

my @args = $bighash{'arguments'}{'allocations'};
print "$args[0][1]";

Kod snippet'i 2:

my @args = $bighash{'arguments'}{'allocations'}[0];
print "$args[1]";

İlk durumda, beklediğim değeri basıyor. İkinci durumda, hiçbir şey yazdırmıyor. Bunu açıklayan var mı?

1
Yazdırılacak argümanları belirtmeye gerek yoktur.
katma yazar Eric Strom, kaynak
Bu kod yanlış görünüyor: Eric'in işaret ettiği gibi, karmadaki şey bir dizi değil, bir dizi referans olurdu. Yani benim $ args olmalı = $ bighash ...; $ args yazdır -> [0] -> [1]; Her şeyi yazdırmak için Data :: Dumper kullanmayı deneyin ve perldoc.perl.org/perlreftut adresine bakın. .html
katma yazar Øyvind Skaar, kaynak

3 cevap

Hashinizde saklanan değerler dizi referanslarıdır. Referans ile doğrudan çalışabilirsiniz:

my $args = $bighash{'arguments'}{'allocations'};
print $$args[1];  # or $args->[1]

Ya da diziyi yenisiyle açabilirsiniz:

my @args = @{ $bighash{'arguments'}{'allocations'} };
print $args[1];

Perlref ve perldsc man sayfaları.

2
katma
print $ bighash {arguments} {allocations} [0] [1]; çıktı ne yapar?
katma yazar Eric Strom, kaynak
Evet, üzgünüm, sorunuzu yanlış anladım. Cevap şu an doğru olmalı.
katma yazar Eric Strom, kaynak
İkisini de denedim ve ne yazık ki hiçbir şey basmıyor.
katma yazar Adam S, kaynak
Hiçbir şey yazdırmıyor.
katma yazar Adam S, kaynak
Aslında sanırım anladım. İkinci çözümünüzü [0] olmadan kullanıyorum.
katma yazar Adam S, kaynak
Çifte dolar işaretinin anlamı nedir?
katma yazar naught101, kaynak

Eric Strom'un cevabı temel olarak doğru bir şekilde ayarlandı ... ama hiç kimsenin, üzerinde çalıştığın veri yapılarını incelemek için Data :: Dumper'ı kullanmasını önermediği şaşırdım. Yaptıklarınızla Eric'in düzeltmesi arasındaki farkı gerçekten görebilirsiniz. Bu, işleri sizin için doğrudan belirlemenize yardımcı olabilir.

Re: uyarıları kullan ... Yeni oluşturulan dizinin varolmayan öğesini yazdırmaya çalıştığınızda bir uyarı almanız gerekir. Bir keresinde katı ve uyarıları kullanana kadar çevrimiçi bir şey sormamayı söyledim. Bu belki biraz aşırı, ama -w ve Data :: Dumper kesinlikle bana yardım ediyor :-)

2
katma
Birisi Data :: Dumper'ı kullanmayı önerdi. Bir yorum olarak yayınladılar.
katma yazar Brad Gilbert, kaynak

Kod snippet'ında (2), sizin büyük farenizin ilk elemanını etkin bir şekilde alarak ([0] ilk öğe) ve bunu bir dizideki tek öğe olarak koyarak. Sonra var olmayan ikinci elementi soruyorsunuz.

'Uyarıları kullanmayı' hatırlarsanız, bir dizi gibi bir skaler atadığınız için bu bir tane vermelidir. Yine de bunu kendim test etmedim.

0
katma
Burada hiçbir uyarı yok, bir diziye bir skaler atamak gayet iyi, sadece bir elementle bir dizi yaratıyor.
katma yazar Eric Strom, kaynak
Vay ... Bu benim niyetim değildi. Atama operatörü yeni bir diziye etkili bir şekilde "ekleme" veya "ekleme" yapar mı? $ Bighash {'arguments'} {'allocations'} için referans olan yeni bir dizi nasıl oluşturabilirim?
katma yazar Adam S, kaynak
Adam: Bir referans olan bir dizi oluşturmuyorsunuz .., bir diziye referans oluşturuyorsunuz. Referansın kendisi bir dizi değildir.
katma yazar Øyvind Skaar, kaynak
Doğru, Eric haklı.
katma yazar ath88, kaynak