Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Count the number of lines in a file

by jmcnamara (Monsignor)
on Aug 15, 2002 at 07:43 UTC ( #190332=snippet: print w/replies, xml ) Need Help??
Description: 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 ' } { * _ = *. } { '

      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. :-)


      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


        You could always use the deparser....


Re: Count the number of lines in a file
by Anonymous Monk on Aug 16, 2002 at 02:52 UTC
    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


Log In?

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

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (3)
As of 2021-01-17 00:12 GMT
Find Nodes?
    Voting Booth?