Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re: $. - smarter than you might think

by shmem (Chancellor)
on Jun 22, 2006 at 22:35 UTC ( [id://557033]=note: print w/replies, xml ) Need Help??


in reply to $. - smarter than you might think

You can even assign to it and cheat about the line number:
#!/usr/bin/perl <DATA>; $.= 39; print "$. $_" while <DATA>; __DATA__ line 1 line 2 line 3
BTW, the DATA filehandle is funny as well. This prints it's source along with line numbers (perl 5.8.8):
#!/usr/bin/perl seek DATA,0,0; print "$. $_" while <DATA>; __DATA__ line 1 line 2 line 3
gives
1 #!/usr/bin/perl 2 3 seek DATA,0,0; 4 print "$. $_" while <DATA>; 5 __DATA__ 6 7 line 1 8 line 2 9 line 3

Bug or feature? :-)

cheers,
--shmem

Update: this is covered implicitly in perl561delta, Potential to leak DATA filehandles:

Using the "__DATA__" token creates an implicit filehandle to th +e file that contains the token. It is the program's responsibility to + close it when it is done reading from it.

_($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                              /\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

Replies are listed 'Best First'.
Re^2: $. - smarter than you might think
by GrandFather (Saint) on Jun 22, 2006 at 22:53 UTC

    Ohh, that's nice, if you expect it. :)

    So you can have a Perl script print itself by:

    use warnings; use strict; seek DATA, 0, 0; print while <DATA>; __END__

    so long as __END__ or __DATA__ are present.

    Of course that also means that you have to my $dataStart = tell DATA; if you want to seek DATA back to the data start rather than script start.


    DWIM is Perl's answer to Gödel
      heh.. that makes me think about a $SIG{__DIE__} handler which not only says harshly "Can't do method foo in context bar in file quux line 1024" or such, but prints the 3 lines above and below the error as well...
      don't talk nonsense at blah.pl line 23. 21 learn('nothing'); 22 sub blah (\[&]) { 23 warn "don't talk nonsense"; > 24 $_[0]->(); 25 } 26 sub learn { 27 my $self->teach(shift); Can't use string ("bar") as a subroutine ref while "strict refs" in us +e at blah.pl line 24.

      I discovered this playing with your code, btw. Thanks!

      cheers,
      --shmem


      _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                    /\_¯/(q    /
      ----------------------------  \__(m.====·.(_("always off the crowd"))."·
      ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://557033]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (6)
As of 2024-03-28 21:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found