2009-04-01 31 views
29

Có cách nào để xác định xem tệp hiện tại là tệp đang được thực thi trong nguồn Perl không? Trong Python chúng tôi làm điều này với các cấu trúc sau:Có một Perl tương đương với Python `if __name__ == '__main __'`?

if __name__ == '__main__': 
    # This file is being executed. 
    raise NotImplementedError 

tôi có thể hack một cái gì đó với nhau bằng FindBin__FILE__, nhưng tôi hy vọng có một cách kinh điển để làm điều này. Cảm ơn!

Trả lời

41
unless (caller) { 
    print "This is the script being executed\n"; 
} 

Xem caller. Nó trả về undef trong tập lệnh chính. Lưu ý rằng điều đó không hoạt động bên trong một chương trình con, chỉ trong mã cấp cao nhất.

3

unless caller là tốt, nhưng một song song trực tiếp hơn, cũng như nhiều kiểm tra rõ ràng, là:

use English qw<$PROGRAM_NAME>; 

if ($PROGRAM_NAME eq __FILE__) { 
    ... 
} 

Chỉ cần nghĩ rằng tôi muốn đưa rằng ngoài kia.

EDIT

Hãy ghi nhớ rằng $PROGRAM_NAME (hoặc '$0') là có thể ghi, vì vậy đây không phải là tuyệt đối. Nhưng, trong hầu hết các thực hành - ngoại trừ tai nạn, hoặc các mô-đun cuồng nhiệt - điều này có thể sẽ không bị thay đổi hoặc thay đổi tối đa là locally trong phạm vi khác.

+0

Điều đó không đảm bảo hoạt động. Đối với một điều, $ 0 (tên thật của $ PROGRAM_NAME) thực sự là một biến có thể ghi trong Perl. Nhưng __FILE__ không bị ảnh hưởng bởi việc thay đổi $ 0. – cjm

+0

@cjm: Đã thêm tuyên bố từ chối trách nhiệm. – Axeman

+0

Không chỉ là $ 0 có thể thay đổi được, [như vậy là '__FILE__'] (http://perldoc.perl.org/perlsyn.html#Plain-Old-Comments-%28Not%21%29). – tchrist

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