2009-04-01 3 views
29

Есть ли способ определить, является ли текущий файл тем, который выполняется в Perl-источнике? В Python мы делаем это с помощью следующей конструкции:Есть ли эквивалент Perl для Python `if __name__ == '__main __'`?

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

Я могу взломать что-нибудь вместе, используя FindBin и __FILE__, но я надеюсь, что есть канонический способ сделать это. Благодаря!

ответ

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

См. caller. Он возвращает undef в главном скрипте. Обратите внимание, что это не работает внутри подпрограммы только в коде верхнего уровня.

3

unless caller хорошо, но более прямая параллель, а также более Явная проверка является:

use English qw<$PROGRAM_NAME>; 

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

Просто думал, что я положил, что там.

EDIT

Имейте в виду, что $PROGRAM_NAME (или '$0') доступен на запись, так что это не является абсолютным. Но, в большинстве случаев - кроме случаев аварии или модулей взрыва - это, вероятно, не будет изменено или изменено не более locally в другой области.

+0

Это не гарантируется. Во-первых, $ 0 (настоящее имя $ PROGRAM_NAME) на самом деле является переменной для записи в Perl. Но на __FILE__ не влияет изменение $ 0. – cjm

+0

@cjm: Добавлен отказ от ответственности. – Axeman

+0

Модифицирован не только $ 0, [так это '__FILE__'] (http://perldoc.perl.org/perlsyn.html#Plain-Old-Comments-%28Not%21%29). – tchrist