in reply to Count the number of lines in a file

cat file | perl -lpe ' } { * _ = *. } { '
Abigail

Replies are listed 'Best First'.
Re: Re: Count the number of lines in a file
by jmcnamara (Monsignor) on Aug 15, 2002 at 11:37 UTC

    Very nice. Actually, we spoke briefly about this technique at last years YAPC::EU. ;-)

    I asked you how you came up with the idea. You also signed a Perl book that I had with me and wrote a variation of the above on it. :-)

    --
    John.

Re: Re: Count the number of lines in a file
by Molt (Chaplain) on Aug 15, 2002 at 14:45 UTC

    Okay, this hurts my brain.

    Any chance of a few pointers as to how this works in order to relieve this brain pain?


      Horizontally, Abigail-II's code looks like this:     perl -lpe '}{*_=*.}{' file

      Which is really quite beautiful.

      Anyway, it (ab)uses the way that the -p command line option works. Consider the following output from deparse:

      $ perl -MO=Deparse -lpe '' file LINE: while (defined($_ = <ARGV>)) { chomp $_; } continue { print $_; }

      So for a simple bare -p you get all of that extra and useful code.

      Now if we deparse Abigail-II's code:

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

      The addition of the extra braces has created a while loop that loops through the file(s), a block with an assignment and a block with an empty statement and a continue. In effect it has disassociated the continue from the while.

      The typeglob assignment *_ = *. has the effect, among other things, of setting $_ = $.. Since the while has already looped through the file(s) $. is now the number of lines in the file(s).

      The last action of the program will be to enter the continue and print $_ so that the number of lines is output. The -l command line option helpfully appends a newline.

      Update: Abigail-II's own explanation is here


      John.

      You could always use the deparser....

      Abigail