2011-12-12 29 views

Trả lời

11

đị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:

+0

Cảm ơn bạn rất nhiều – Anil

+6

"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'. –

+0

@ O.D http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs – TLP

3

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ác vấn đề liên quan