http://qs321.pair.com?node_id=199096


in reply to Re: Save all but line 32!
in thread Save all but line 32!


Very nice. ++

I like the twisted logic but the best part is the bare $ at the end. I had to run it through B::Deparse to see what was happening:

$ perl -MO=Deparse -pe '$_=$' LINE: while (defined($_ = <ARGV>)) { $_ = $; } continue { die "-p destination: $!\n" unless print $_; }

It shows that in this case $ gets interpreted as $; the subscript separator. However, this means that your code inserts an extra character in the file as shown by this:     perl -pe '$.-32or$_=$' file | cat -A

But I'm still not sure why perl inserts that semicolon. It doesn't in other cases:

$ perl -MO=Deparse -pe '$_=$.' LINE: while (defined($_ = <ARGV>)) { $_ = $. } continue { die "-p destination: $!\n" unless print $_; }

Anyone have an explanation for this last point?

Update: blakem's answer below is right. This last case is a perl 5.005 issue with B::Deparse.

--
John.

Replies are listed 'Best First'.
Re3: Save all but line 32!
by blakem (Monsignor) on Sep 19, 2002 at 08:08 UTC
    I seem to get the semicolon with your second case:
    % perl5.6.1 -MO=Deparse -pe '$_=$.' LINE: while (defined($_ = <ARGV>)) { $_ = $.; } continue { die "-p destination: $!\n" unless print $_; } % perl5.8.0 -MO=Deparse -pe '$_=$.' LINE: while (defined($_ = <ARGV>)) { $_ = $.; } continue { die "-p destination: $!\n" unless print $_; }
    Update: Response to above update: with 5.00503 I get:
    % perl5.00503 -MO=Deparse -pe '$_=$.' LINE: while (defined($_ = <ARGV>)) { $_ = $. } continue { die "-p destination: $!\n" unless print $_; }

    -Blake