2010-06-29 37 views
24

Biểu tượng toàn cầu yêu cầu tên gói rõ ràng? Tại sao điều này xảy ra và các trường hợp khác nhau có thể gây ra lỗi này là gì?Biểu tượng toàn cầu yêu cầu tên gói rõ ràng

+1

Mã mẫu perl? Xem http://stackoverflow.com/q/4257179/10468 hoặc tìm kiếm câu hỏi về mô-đun perl. Xem thêm (offsite) http://www.sitepoint.com/forums/showthread.php?501379-Perl-require-and-variables – DarenW

Trả lời

22

Có một cái nhìn tại perldiag:

biểu tượng toàn cầu "% s" đòi hỏi tên gói rõ ràng

(F) Bạn đã nói "sử dụng nghiêm ngặt" hoặc "sử dụng vars nghiêm ngặt", điều này cho biết tất cả các biến phải là phạm vi từ vựng (sử dụng "của tôi" hoặc "trạng thái"), được khai báo trước bằng cách sử dụng "của chúng tôi" hoặc rõ ràng đủ điều kiện để nói biến toàn cục nào nằm trong (sử dụng "::").

5

Để cụ thể nói điều gì đã gây ra nó trong mã của bạn, bạn cần phải đăng mã của mình.

Lỗi này là outputted và kịch bản của bạn dừng lại vì bạn đã có use strict hoặc một dẫn xuất của nó. Lỗi xảy ra vì chương trình của bạn đang gọi một biến ngoài phạm vi.

  1. Bạn có thể đã sử dụng địa phương hoặc nội bộ của tôi trong một thủ tục/chức năng phụ, nhưng đang cố gắng sử dụng nó trong một thủ tục khác hoặc bên ngoài cuộc gọi chức năng.

    sub foo{ 
        my $bar=0; 
        our ($soap) = 1; 
    } 
    foo(); 
    print $bar  , "\n"; # does not work w/ strict -- bar is only in the scope of the function, not globally defined 
    print $main::bar , "\n"; # will run, but won't be populated 
    print $soap  , "\n"; # does not work w/ strict -- the package isn't defined 
    print $main::soap , "\n"; # will run and work as intended because of our 
    
-1

Bạn đang sử dụng use strict; tuyên bố có nghĩa là mã của bạn phải nằm trong phạm vi quy định của văn bản lệnh perl.

+2

Quy định viết lệnh Perl nào đang bị vi phạm? – alex

23

Điều này cũng có thể xảy ra khi tuyên bố trước đó chưa hoàn tất.

use strict; 

sub test; 

test() 

# some comment 
my $x; 

perl tại phàn nàn với thông báo lỗi sau:

my " 
Global symbol "$x" requires explicit package name 

Các lỗi không nằm trong tuyên bố "tôi", nhưng đồng chấm phẩy còn thiếu (;) tại test().

+2

Cảm ơn bạn! Tôi đã xé tóc ra. – Zack

0

Trong thực tế, nếu bạn sử dụng use strict; và ở đâu đó bạn bỏ lỡ ; ở phần cuối của một tuyên bố, sau đó những điều khoản sau đây (họ có cú pháp hoàn hảo) có thể làm tăng biểu tượng toàn cầu đòi hỏi tên gói rõ ràng cũng.

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