Is there a Perl equivalent to Python's `if __name__ == '__main__'`?
Question:
Is there a way to determine if the current file is the one being executed in Perl source? In Python we do this with the following construct:
if __name__ == '__main__':
# This file is being executed.
raise NotImplementedError
I can hack something together using FindBin
and __FILE__
, but I’m hoping there’s a canonical way of doing this. Thanks!
Answers:
unless (caller) {
print "This is the script being executedn";
}
See caller. It returns undef
in the main script. Note that that doesn’t work inside a subroutine, only in top-level code.
See the “Subclasses for Applications (Chapter 18)” portion of brian d foy‘s article Five Ways to Improve Your Perl Programming.
unless caller
is good, but a more direct parallel, as well as a more explicit check, is:
use English qw<$PROGRAM_NAME>;
if ( $PROGRAM_NAME eq __FILE__ ) {
...
}
Just thought I’d put that out there.
EDIT
Keep in mind that $PROGRAM_NAME
(or ‘$0
‘) is writable, so this is not absolute. But, in most practice–except on accident, or rampaging modules–this likely won’t be changed, or changed at most locally within another scope.
Is there a way to determine if the current file is the one being executed in Perl source? In Python we do this with the following construct:
if __name__ == '__main__':
# This file is being executed.
raise NotImplementedError
I can hack something together using FindBin
and __FILE__
, but I’m hoping there’s a canonical way of doing this. Thanks!
unless (caller) {
print "This is the script being executedn";
}
See caller. It returns undef
in the main script. Note that that doesn’t work inside a subroutine, only in top-level code.
See the “Subclasses for Applications (Chapter 18)” portion of brian d foy‘s article Five Ways to Improve Your Perl Programming.
unless caller
is good, but a more direct parallel, as well as a more explicit check, is:
use English qw<$PROGRAM_NAME>;
if ( $PROGRAM_NAME eq __FILE__ ) {
...
}
Just thought I’d put that out there.
EDIT
Keep in mind that $PROGRAM_NAME
(or ‘$0
‘) is writable, so this is not absolute. But, in most practice–except on accident, or rampaging modules–this likely won’t be changed, or changed at most locally within another scope.