Get Filename of Current Perl File
Sometimes you need to use a filename in your code. While hard-coding a filename can be easy it can make the long term maintenance of the code a little more challenging.
One use case, but certainly not the only, is when you want to write something to a log file for debugging purposes. In this case you may want to easily associate the name of the log file with the name of the originating file.
There are a few ways you can get the name of the file.
FILE
__FILE__
is a special token that returns the name of the file where it is. This works a lot like the similar in the C preprocessor. It substitutes the name of the current file.
As an example lets presume that a Perl script is written named file.pl
. Inside of this script we call a subroutine called logit
within a module called file.pm
.
In the file.pm
the logit
module performs a simple print.
$ perl file.pl
file.pl # <- __FILE__ when called from file.pl
file.pm # <- __FILE__ when called from file.pm
$
Pros
- The token will automatically update if you change the name of the file.
- It returns the name of the file where it occurs.
Cons
- If you place within a subroutine of a Perl Module then you will get the name of the PM, not the file where you call the subroutine. (I suppose this could equally be a pro)
Variable $0
$0
is a special variable in Perl. It contains the name of the program being executed. If we use the same example as above but slightly modify the file.pl we can see how this differs.
$ perl file.pl
file.pl # <- $0 when called from file.pl
file.pl # <- $0 when called from file.pm
$
The output from the Perl script and the package are now both the same.
Pros
- The value will automatically update to the value of the command being executed.
- Returns the command being executed regardless of the actual file it is located in.
Cons
- If you place the within a subroutine of a Perl Module then you will get the name original command executed, not the file where you call the subroutine. (I suppose this could equally be a pro).
You must be logged in to see the comments. Log in now!