What's the purpose of perl's #line directives?

Usually such markers are put into code that has been pre-processed or mechanically generated in order to refer back to the human-generated source.

For example, if there was a program that converted Python to Perl, it might insert a

# line 812 "foo.py"

so that error messages would refer to the original Python code which would make more sense to the programmer.


They're useful when wrapping a Perl script in another file, like pl2bat does. Perl doesn't see the batch commands at the beginning of the file which throws off its idea of line numbers. A #line directive at the beginning of the Perl source compensates for this.


I've seen several times that people incorrectly write the current line's number into the #line directive. It should contain the next line's number. Example code of linetest.pl (using a ksh wrapper to set an environment variable for the perl script):

1  #!/usr/bin/ksh
2  MY_ENV_VAR='something'
3  export MY_ENV_VAR
4  /usr/bin/perl -x $0 $@ 2>&1
5  exit $?
6
7  #!/usr/bin/perl
8  #line 9
9  print "MY_ENV_VAR is $ENV{MY_ENV_VAR}\n";
10 die "This is line 10.";

Run the script and check the result:

$ ./linetest.pl
MY_ENV_VAR is something
This is line 10. at ./linetest.pl line 10.

You can see that line numbers are matching after writing #line 9 on line 8.

Tags:

Debugging

Perl