Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

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

Comment on Count the number of lines in a file
Download Code
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

Back to Snippets Section

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (8)
As of 2015-07-08 00:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls