> -----Original Message-----
> From: Jason Normandin [mailto:[EMAIL PROTECTED] 
> Sent: Thursday, 26 February 2004 10:56 AM
> To: Perl Beginners
> Subject: Count the number of lines in a file without actually 
> iterating through the file
> 
> Hi List.
> 
>  
> 
> Is there a way to determine the number of lines in a file 
> without actually
> iterating through the file and incrementing a file?
> 
>  

No.   Part of the problem is that different operating systems
have different ideas of what constitutes a line, hence you
have to read every byte to make sure::

Unix : the '0x0a' or linefeed ends a line'
DOS  : the '0x0d 0x0a' or carriage-return linefeed sequence ends a line.
         hence an '0x0a' on its own should not count.
CYBER: zero padded 60bit word constitues an end of line.  you cannot
       search the data for 'end of line' characters, because an end of
         line is the ABSENCE of character data which you can only
identify 
       by scanning the file.


> 
> I found the following on perlmonks.org, it works great but 
> this is command
> line syntax
> 
> :
> 
> perl -lpe '}{*_=*.}{' file
> 
>  
> 
> How could I integrate this into a script without invoking 
> another instance
> of Perl?
> 

Lets look at this a moment:

perl -lpe '}{*_=*.}{' file works this way:

perl -e expect the rest of the command to be a script to run, hence
   '}{*_=*.}{' is the script.

perl -l chomps input, and assigns 'output record separator = input
record separator'
 or in english, 'print' will always print a newline at the end of a
line.

perl -p  wraps
        while(<>) {
                your code
        } continue {
                print || die "............"
        }

Now, if we insert your code, we get:

        while(<>) {
        } { *_=*. } {
        } continue {
                print
        }

which is actually

        while( <> ) {}

        { 
                *_=*. 
        } continue {
                print 
        }

Which is actually an obfuscated way to say:

        while(<>) { } # scan file, do nothing with the input
        print $.

Hence, this script ITERATES over the entire file/input stream, and
at the end, prints the CURRENT INPUT RECORD NUMBER.  Naturally the
"CURRENT INPUT RECORD NUMBER" at the end of file happens to equal
the number of lines in the file!

voila.

Please don't use obfuscated code written by insane people until you
know enough about perl to realised whatever is going on is not 
necessarily safe or portable.


David 


--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to