Perl'de "my" anahtar kelimesini nasıl kullanmalıyım?


93

Çevrimiçi Perl betikleri örneğinde değişken isimlerinin önünde "benim" anahtar kelimesini görmeye devam ediyorum ama bunun ne anlama geldiği hakkında hiçbir fikrim yok. Kılavuz sayfalarını ve diğer siteleri çevrimiçi olarak okumayı denedim, ancak nasıl kullanıldığını gördüğüm ve kılavuz arasındaki fark göz önüne alındığında ne işe yaradığını anlamakta güçlük çekiyorum.

Örneğin, bu yazıda dizinin uzunluğunu elde etmek için kullanılır: Perl'de bir dizinin boyutunu bulun

Ancak kılavuz şöyle diyor:

Bir my, listelenen değişkenleri çevreleyen blok, dosya veya eval için yerel (sözcüksel olarak) olarak bildirir. Birden fazla değer listelenmişse, liste parantez içine yerleştirilmelidir.

Ne işe yarar ve nasıl kullanılır?


3
"Bu yazıdaki dizinin uzunluğunu almak için kullanılır", Hiç de değil. myen azından bunu hesaba katmadı. =Skaler bağlamı zorlayan, skaler atama operatörüdür ( ) @arr.
ikegami

Gerçekten "senin" değilse, onu kullanmamalısın.
icenac

Yanıtlar:


145

mybir değişkenin kapsamını kısıtlar . Bir değişkenin kapsamı, görülebildiği yerdir. Bir değişkenin kapsamını değişkenin gerekli olduğu yere indirgemek, iyi programlamanın temel bir yönüdür. Kodu daha okunabilir ve daha az hataya açık hale getirir ve bir dizi türetilmiş fayda sağlar.

Kullanarak bir değişken tanımlamazsanız my, bunun yerine global bir değişken oluşturulacaktır. Bundan kaçınılmalıdır. Kullanmak use strict;Perl'e örtük olarak genel değişkenler oluşturmanın engellenmesini istediğinizi söyler, bu nedenle programlarınızda her zaman use strict;(ve use warnings;) kullanmalısınız .


İlgili okuma: Neden use strict;ve kullanıyorsunuz use warnings;?


12
Sonunda nedenini açıklayan bir cevap .
ThisSuitIsBlackNot

Buraya JS'den gelen insanlar için: Aslında JavaScript'e benziyor varve letiçinde. Olmadan 'use strict';JS Eğer uygulamaların iyi sayılmaz her iki anahtar kelime olmadan yeni genel değişkenleri bildirmek izin verir.
Elektrikli Kahve

@Electric Kahve, In JS terimleri, soru "Ne gelmez olacağını letve varyapmak ve nasıl kullanılmalıdır?" Ve evet, cevap kabaca aynı olacaktır. (JS'nin letdeğişkenleri, Perl'in mydeğişkenlerine çok benzer , ancak bu letdeğişkenler yakalanamaz.)
ikegami

Demek istediğim, eğer insanlar Perl'e
Electric Coffee

@ElectricCoffee 1) Kapsam belirlemeyi anlayan bir programcının, dil değiştirdikten sonra bunu onlara tekrar açıklamasına gerek yoktur. 2) Kapsam belirlemeyi, bir JS programcısının anlayacağı terimlerle veya başka şekilde açıkladığınızdan emin değilim. Belki açıklamaya çalışıyordun use strict;? Ama soru bu değildi ve use strict;bundan daha fazlasını yapıyor. Ya da o iletişim anlamına mykapsamı şey gibi vars sınırları letve varyapmak, ama bu hemen hemen cevabın ilk cümle. 3) Bir soruyu farklı yanıtlamak istiyorsanız, Cevaplar bunun içindir.
ikegami

28

Hızlı özet: myyeni bir değişken oluşturur,local , bir değişkenin değerini geçici olarak değiştirir

Aşağıdaki örnekte, $ :: a, 'global' ad alanında $ a anlamına gelir.

$a = 3.14159;
{
  my $a = 3;
  print "In block, \$a = $a\n";
  print "In block, \$::a = $::a\n";
}
print "Outside block, \$a = $a\n";
print "Outside block, \$::a = $::a\n";

# This outputs
In block, $a = 3
In block, $::a = 3.14159
Outside block, $a = 3.14159
Outside block, $::a = 3.14159

yani localdeğişkenin değerini geçici olarak değiştirir, ancak yalnızca içinde bulunduğu kapsam dahilinde.

Kaynak: http://www.perlmonks.org/?node_id=94007

Güncelleme

Arasındaki fark Hakkında ourve mybakın

( ThisSuitIsBlackNot sayesinde ).


'Onların' ifadesini açıklamak ister misin? Bunları hep kafa karıştırıcı bulmuşumdur.
rdodev

@rdodev: Ne demek istiyorsun?
Igor Chubin

Perl kodunu hem 'benim' hem de 'onların' ile görmeye devam ediyorum ve pratikte farkı hiçbir zaman tam olarak anlamadım.
rdodev

3
@rdodev Şunu demek istediğini düşünüyorum our: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot

1
Sanırım bu cevabın biraz ayarlanması gerekiyor. Kullanımını gösteren bir kod örneğiniz var my, ancak daha sonra , bu yanıtın hiçbir yerinde gösterilmemesine rağmen, 'nin kullanımını localgöstermişsiniz gibi konuşan bir cümle ile devam edin . Sanırım kaynağı iki kod örneği olan PerlMonks'ta yanlış alıntı yaptınız. Hakkında cümle , burada yazdığınız değil, diğerini anlatıyordu. locallocallocal
temporary_user_name

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.