Theo tôi biết, toán tử my
là khai báo các biến thực sự phạm vi phạm vi và phạm vi động được thực hiện bằng toán tử local
để khai báo biến.Sự khác biệt giữa phạm vi từ vựng và động trong Perl là gì?
Có thể mô tả ngắn gọn về chúng không?
Theo tôi biết, toán tử my
là khai báo các biến thực sự phạm vi phạm vi và phạm vi động được thực hiện bằng toán tử local
để khai báo biến.Sự khác biệt giữa phạm vi từ vựng và động trong Perl là gì?
Có thể mô tả ngắn gọn về chúng không?
địa phương ($ x) tiết kiệm đi những giá trị cũ của toàn cầu biến $ x và gán một giá trị mới trong suốt thời gian của chương trình con đó là thể nhìn thấy trong các chức năng khác gọi từ chương trình con đó. Điều này được thực hiện tại thời gian chạy, được gọi là phạm vi động. local() luôn ảnh hưởng đến biến toàn cục, còn được gọi là biến gói hoặc biến động.
my ($ x) tạo biến mới chỉ hiển thị trong chương trình con hiện tại. Điều này được thực hiện tại thời gian biên dịch, vì vậy nó được gọi là từ vựng hoặc phạm vi tĩnh. my() luôn ảnh hưởng đến các biến riêng tư, còn được gọi là biến số từhoặc (không chính xác) biến tĩnh (ly phạm vi).
Hãy nhìn vào các Perl-FAQ's:
my
tạo ra một biến địa phương.local
thì không.
Tôi sẽ thêm ví dụ nhanh.
$var = "Global";
sub inner {
print "inner: $var\n";
}
sub changelocal {
my $var = "Local";
print "changelocal: $var\n";
&inner
}
sub changedynamic {
local $var = "Dynamic";
print "changedynamic: $var\n";
&inner
}
&inner
&changelocal
&changedynamic
Điều này cung cấp đầu ra sau (nhận xét được thêm).
inner: Global # Finds the global variable.
changedynamic: DynamiC# Dynamic variable overrides global.
inner: DynamiC# Find dynamic variable now.
changelocal: Local # Local variable overrides global.
inner: Global # The local variable is not in scope so global is found.
Bạn có thể nghĩ biến động là cách che dấu toàn cầu cho các hàm bạn gọi. Trường hợp như biến scoped lexical chỉ có thể nhìn thấy từ mã bên trong niềng răng gần nhất.
Cảm ơn bạn rất nhiều – Anil
"my ($ x) tạo biến mới chỉ hiển thị trong chương trình con hiện tại". Điều đó không đúng. 'my' tạo một biến mới chỉ hiển thị trong khối * mã * hiện tại. Một chương trình con chỉ là một ví dụ về một khối. Bạn thực hiện một lỗi tương tự trong định nghĩa của bạn 'local'. –
@ O.D http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs – TLP