2009-03-02 23 views
5

Aşağıdaki kod satırıyla karşılaştım. Bu sorunları vardır: o itme olarak aynı şeyi amaçlanmaktadır

  • ben beri itmek
  • kullanmak için değiştirdik,
  • anlama itin okumak zor
  • kullanılan gerekirdi ben bir şey düşündüm gelmez
  • yasadışı olduğunu, ama açıkça değil burada

öyle geçerli:

$array [++$#array] = 'data'; 

Soruma soru: $ # dizisini önceden artırmanın anlamı nedir? Her zaman $ # dizisini bir dizinin niteliği olarak kabul ettim ve yazılabilir değil. $#array geçerli dizi uzunluğu daha büyük olan değer atama

+0

Teşekkürler - ben yazdım gereken unvan. –

cevap

14

perldata diyor ki:

"Bir dizinin uzunluğu sayıl değer Sen csh'ın olduğu gibi, $ # gün değerlendirerek dizi @days uzunluğunu bulabilir Ancak bu uzunluğu değil.. dizisi, son elementin alt öğesidir, bu, normalde bir 0 elementi olduğu için farklı bir değerdir. $ # güne atama aslında dizinin uzunluğunu değiştirir.Bu şekilde bir diziyi kısaltmak, araya giren değerleri yok eder. önceden kısaltılmıştı bu elemanlarda bulunan değerleri kurtarmaz. "

$ # dizisini değiştirmek bazı durumlarda yararlıdır, ancak bu durumda, açıkça itme daha iyidir.

+0

Daha iyi olabileceği durumlardan biri, dizininizin ne kadar büyük olacağını önceden bildiğiniz zaman. Büyük diziler ile bu size büyük bir performans artışı sağlayacaktır. – innaM

+0

$ # dizisi kullanılarak uzayan eski Perls, önceki değerleri geri alır. –

+0

Bu perl4'tü, ben inanıyorum. – ysth

4

dizi uzanır.

+0

Bağlantının bir kitabın izinsiz bir kopyası olduğuna inanıyorum. Onu kaldırmanı öneririm. – mirod

+0

Aslında, bağlantı zaten öldü, ancak korsan kitaplar ile bağlantı kurmanın kötü bir fikir olduğuna katılıyorum. – Telemachus

+0

Kontrol ettiğimde ölmedi ve orada da bir sürü kitap vardı. – mirod

3

Bu kod da çalışır:

$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a' 
Hello world! 

Perl dizi dinamiktir ve sınırların ötesine atadığınızda yetişir.

+0

++ $ # dizisinin bunu nasıl değiştirmeyeceğini anlamıyorum. Ödevden sonra $ # dizisinin yeniden, muhtemelen aynı değere değiştirildiğini varsayalım. –

+0

Sanırım buradaki '++ $ # array' işe yaramaz. –

+0

$ # dizisini kullanmanız gerekiyorsa, dizinin son elemanının üzerine yazacaksınız (ya da dizi bir 'Değiştirilemeyen dizi değeri deneniyor, alt simge -1' hatası. boş) – mirod

1

Her şeyden önce, bu çok kötü.

Bunun da işe yarayacağına şaşırdım. Bir sayıyı artırmaya çalışırken ++$#array'un "Sabit değiştirilemedi" hatasını alacağını tahmin ederdim. (Yanlışlıkla bunu yapmak zorunda değilim, tabii ki.) Ama sanırım tam olarak yanlış olduğumuz yer: $#array sabit değil (bir sayı); değişken bir ifade. Böylece onunla uğraşabilirsin.

my @array = qw/1 2 3/; 

++$#array; 
$array[$#array] = qw/4/; 

print "@array\n" 

Ve hatta, ekstra eğlence için, bu:

my @array = qw/1 2 3/; 

$#array += 5; 

foreach my $wtf (@array) { 
    if (defined $wtf) { 
    print "$wtf\n"; 
    } 
    else { 
    print "undef\n"; 
    } 
} 

Ve evet, Perl Cookbook büyümek veya diziler kesecek $#array uğraşmak mutlu (Bölüm 4 Aşağıdaki düşünün , tarif 3). Ben hala çirkin buluyorum, ama belki bu sadece bir "ama bir sayıdır" önyargısı.

+0

Senden emin değilim ama * Ben * çirkin olduğunu düşünüyorum çünkü 4 noktalama işareti simgesi var, bunlar arka arkaya değil, separatör veya parens ... Yani, ben de bir şey = b + (foo? - $ # dizi: + $ # dizi); çirkin B-) –

+0

Ben de işe yaradığı şaşırdı. –

4

Bir artış sonrası, önce değişkeni döndürür ve sonra artırır.

Eğer konusu birinci döner, çünkü son öğe modifiye etme ve daha sonra ucu üzerine boş eleman itmek sonrası artış kullanıldığında.İkinci döngüde bu boş değeri değiştirip daha sonra yeni bir boşluğu iteceksin. Yani itme gibi işe yaramaz.

Ön artış, değişkeni artırır ve sonra geri gönderir. Böylece, örneğiniz her zaman dizinin yeni, son bir elemanına yazı yazacak ve itme gibi çalışacaktır. Aşağıdaki Örnek:

my (@pre, @post); 

$pre[$#pre++] = '1'; 
$pre[$#pre++] = '2'; 
$pre[$#pre++] = '3'; 


$post[++$#post] = '1'; 
$post[++$#post] = '2'; 
$post[++$#post] = '3'; 

print "pre keys: "[email protected]"\n"; 
print "pre: @pre\n"; 
print "post keys: "[email protected]"\n"; 
print "post: @post\n"; 

çıkışları: düzenlemek için

pre keys: 3 
pre: 2 3 
post keys: 3 
post: 1 2 3 
+0

Arttırma işletmecisinin/operatörlerinin "geri dönüş" değeri önemli bir ayrımdır, birisinin bunu yaptığına sevindim. – jettero

+1

@pre = (2, 3, undef); –