Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Count the number of lines in a file

by jmcnamara (Monsignor)
on Aug 15, 2002 at 07:43 UTC ( [id://190332]=CUFP: print w/replies, xml ) Need Help??

This is basically a poor man's version of wc -l.

There are many ways of doing this, and most of them are better, but this is pretty.

perl -le 'print $==()=<>' file

Replies are listed 'Best First'.
Re: Count the number of lines in a file
by Abigail-II (Bishop) on Aug 15, 2002 at 11:16 UTC
    cat file | perl -lpe ' } { * _ = *. } { '
    Abigail

      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.

      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

Re: Count the number of lines in a file
by Anonymous Monk on Aug 16, 2002 at 02:52 UTC
    TIMTOWTDI
    perl -ne END{print$.} file
    Bonus: Cross-platform portable because no quotes are needed.
Re: Count the number of lines in a file
by blakem (Monsignor) on Aug 15, 2002 at 08:23 UTC
    Tempting the wrath of He who must not be named, I'll post a heretical one-liner I wrote lastnight that does basically the same thing....
    % ruby -e 'puts open(ARGV.shift).read.count("\n")' file

    -Blake

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (3)
As of 2024-03-19 07:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found