2012-02-16 30 views
9

Trong một tập lệnh như sau, có thể không thả 'của tôi' để khai báo hiệu quả 'var' chỉ một lần và có hiển thị bên ngoài khối BEGIN không?Tuyên bố biến trong BEGIN block

echo -e "\n\n\n" | \ 
    perl -lne 'BEGIN { my $var="declared & initialized once" } print $var' 

Ngoài ra, tại sao tuyên bố var không có 'của tôi' làm cho nó hiển thị bên ngoài khối BEGIN?

Trả lời

12

Đặt my $var; trước BEGIN khối:

$ perl -le 'my $var; BEGIN { $var = "declared"; } print $var;' 
declared 

my cung cấp cho các phạm vi từ vựng biến, vì vậy $var không được định nghĩa trong ví dụ của bạn bên ngoài khối BEGIN. Loại bỏ các my có hiệu quả làm cho nó một biến toàn cầu, có thể truy cập qua kịch bản sau khi chuyển nhượng.

+0

Trình tự biên soạn sẽ giải thích cho tôi một chút. Vì $ var được khai báo trong khối BEGIN trước tiên, tại sao nó không bị xóa bởi khai báo với 'my' sau này? –

2

Ngoài ra, tại sao tuyên bố var mà không có 'của tôi' làm cho nó hiển thị bên ngoài khối BEGIN?

Bạn không khai báo sau đó. Nó được tự động phát là toàn cầu, nếu bạn không sử dụng use strict (ngăn cản việc khai báo theo mặc định). Trong một lớp lót, strict gây tổn hại nhiều hơn mức giúp; Tôi hoàn toàn ổn với việc không khai báo trong bối cảnh như vậy.

Các vấn đề liên quan