2010-03-30 20 views
8

Sadece bizim kod tabanı bazı kodlar gördük (ve Perl 3 veya Perl 4 gün olduğu gibi, ESKİ kodu) (ı büyük ölçüde basitleştirerek ediyorum) şöyle görünür:Perl, bu davaya itmek için bu argümanla ne yapıyor?

@array; 
push(array, $some_scalar); 

Bildirimi o array yılında push(), @ ürününe sahip değildir. Push arkasındaki kodun, ilk argümanın dizi olması gerektiğini bildiğini varsayalım, bu yüzden diziyi array tipglob'dan alır. Bu daha mı az mı? Perl bunu sorunsuz yapabilseydi, neden @'u eklemelisin?

+1

Bu kodu 'uyarıları kullan' ile çalıştırın ve sorunuzun yanıtlanıp yanıtlanmadığını görün. – mob

+1

Bu eski kod için uyarıları açmanız, tamamlanmamış bir felaket olurdu, ama ben sizin dikkatinizi çekiyorum. – Morinar

+2

@Monirar: Eğer bu kodu devam ettirmeniz gerekiyorsa, uyarıları etkin olarak çalıştırmak için geliştirmek çok yararlı olabilir. –

cevap

9

Bu, ayrıştırıcının eski bir 'özelliğidir. Değişkenin bir paket değişkeni olması durumunda @ bir zorlama zorunlu değildir. Bu, pek çoğu tarafından düzeltilmesi gereken bir hata olarak kabul edilir. Bunu gerçekten yapmamalısın.

+0

Hm, aslında itme işlemini gerçekleştirmiyor gibi görünüyor. Bununla: 'perl -e 'benim @array =(); itme (dizi, "foo"); print "@array \ n"; "Çıktı alıyorum. Ben aptalca bir şey mi yaptım? – Cascabel

+2

Belki o zaman tipglobs ile ilgili bir şey var. Jefromi'nin yukarıdaki örnek kodunda hiçbir şey çıkmıyor, ancak 'my'imi kaldırırsanız, o zaman o yapar. – mob

+1

Evet, haklısın. Sadece paket değişkenleri için çalışıyor gibi görünüyor. –

4

Bu, perl'in, kullanımdan kaldırılmış davranışının şüpheli bir "özelliği" dir; bir hata olmalı, ama işe yarıyor.

Array @aa missing the @ in argument 1 of push() at xx.pl line 2.