Zaid
Zaid

Reputation: 37146

Is __LINE__ constant-folded in this Perl one-liner?

In exploring an alternative answer to sarathi's current file line number question, I wrote this one-liner with the expectation that it would print the first line of all files provided:

$ perl -ne 'print "$ARGV : $_" if __LINE__ == 1;' *txt

This did not work as expected; all lines were printed.

Running the one-liner through -MO=Deparse shows that the conditional is not present. I assume this is because it has been constant-folded at compile time:

$  perl -MO=Deparse -ne 'print "$ARGV : $_" if __LINE__ == 1;' *txt
LINE: while (defined($_ = <ARGV>)) {
    print "$ARGV : $_";
}
-e syntax OK

But why?

Run under Perl 5.8.8.

Upvotes: 0

Views: 148

Answers (2)

Vijay
Vijay

Reputation: 67231

__LINE__ is the source line number i.e., the program line number. $. will give you the input file line number.

if you want to print all the first lines of all the files then you can try this:

perl -lne '$.=0 if eof;print $_ if ($.==1)' *.txt

Upvotes: 4

choroba
choroba

Reputation: 241918

__LINE__ corresponds to the line number in the Perl source, not in the input file.

Upvotes: 5

Related Questions