Bagaimana saya harus menggunakan kata kunci "my" di Perl?

90

Saya terus melihat kata kunci "saya" di depan nama variabel dalam contoh skrip Perl online tetapi saya tidak tahu apa artinya. Saya mencoba membaca halaman manual dan situs lain secara online tetapi saya mengalami kesulitan untuk membedakan untuk apa mengingat perbedaan antara cara saya melihatnya digunakan dan manual.

Misalnya, digunakan untuk mendapatkan panjang array di posting ini: Temukan ukuran array di Perl

Tapi manualnya mengatakan:

A my mendeklarasikan variabel yang terdaftar menjadi lokal (secara leksikal) ke blok, file, atau eval yang terlampir. Jika lebih dari satu nilai terdaftar, daftar harus ditempatkan dalam tanda kurung.

Apa fungsinya dan bagaimana itu digunakan?

Tinjuan kemarahan
sumber
3
Re "digunakan untuk mendapatkan panjang array di posting ini", Tidak sama sekali. mytidak memperhitungkannya sedikit pun. Ini adalah operator penugasan skalar ( =) yang memberlakukan konteks skalar @arr.
ikegami
Jika itu bukan benar-benar "milik Anda", Anda tidak boleh menggunakannya.
icenac

Jawaban:

141

mymembatasi ruang lingkup variabel. Ruang lingkup variabel adalah di mana ia dapat dilihat. Mengurangi ruang lingkup variabel ke tempat variabel dibutuhkan adalah aspek fundamental dari pemrograman yang baik. Itu membuat kode lebih mudah dibaca dan tidak terlalu rentan terhadap kesalahan, dan menghasilkan banyak manfaat yang diperoleh.

Jika Anda tidak mendeklarasikan variabel menggunakan my, variabel global akan dibuat. Ini harus dihindari. Menggunakan use strict;memberitahu Perl bahwa Anda ingin dicegah membuat variabel global secara implisit, itulah sebabnya Anda harus selalu menggunakan use strict;(dan use warnings;) dalam program Anda.


Bacaan terkait: Mengapa menggunakan use strict;dan use warnings;?

ikegami
sumber
11
Akhirnya jawaban yang menjelaskan mengapa .
ThisSuitIsBlackNot
Untuk orang yang datang ke sini dari JS: Ini pada dasarnya seperti vardan letdalam JavaScript. Tanpa 'use strict';JS, Anda dapat mendeklarasikan variabel global baru tanpa salah satu kata kunci, yang tidak dianggap sebagai praktik terbaik.
Electric Coffee
@Electric Coffee, Dalam istilah JS, pertanyaannya adalah "Apa yang dilakukan letdan vardilakukan dan bagaimana mereka harus digunakan?" Dan ya, jawabannya kira-kira sama. (JS letvars sangat mirip dengan Perl's myvars, kecuali bahwa letvars tidak dapat ditangkap.)
ikegami
Maksud saya, jika orang datang ke Perl dari JS, itu akan menjadi cara mudah untuk menjelaskan konsep yang sama
Electric Coffee
@ElectricCoffee 1) Seorang programmer yang memahami pelingkupan tidak perlu menjelaskannya lagi setelah berpindah bahasa. 2) Tidak yakin bahwa Anda benar-benar menjelaskan pelingkupan, dalam istilah programmer JS akan mengerti atau sebaliknya. Mungkin Anda mencoba menjelaskan use strict;? Tapi bukan itu pertanyaannya, dan use strict;melakukan lebih dari itu. Atau mungkin Anda bermaksud untuk berkomunikasi yang mymembatasi ruang lingkup vars like letand vardo, tapi itulah kalimat pertama dari jawabannya. 3) Jika Anda ingin menjawab pertanyaan secara berbeda, untuk itulah Answers.
ikegami
27

Ringkasan cepat: mymembuat variabel baru, localmengubah nilai variabel untuk sementara

Pada contoh di bawah, $ :: a merujuk ke $ a di namespace 'global'.

$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

yaitu, localmengubah sementara nilai variabel, tetapi hanya dalam ruang lingkupnya.

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

Memperbarui

Tentang perbedaan antara ourdan mysilakan lihat

(Terima kasih kepada ThisSuitIsBlackNot ).

Igor Chubin
sumber
Mau menjelaskan 'mereka'? Saya selalu menganggapnya membingungkan.
rdodev
@rdodev: Apa maksud Anda?
Igor Chubin
Saya terus melihat kode perl dengan 'saya' dan 'milik mereka' dan tidak pernah benar-benar memahami perbedaannya, dalam praktiknya.
rdodev
@rdodev: bisakah Anda mengirimkan saya tautan ke beberapa kode dengan their?
Igor Chubin
3
@rdodev Saya pikir maksud Anda our: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot
4

Variabel Pribadi melalui my () adalah dokumentasi utama untuk my.

Dalam contoh ukuran array yang Anda sebutkan, ini tidak digunakan untuk mencari ukuran array. Ini digunakan untuk membuat variabel baru untuk menampung ukuran array.

cjm
sumber