#Count number of lines in a file
$filename = <@ARGV>;
$lines = 0;
open(FILE, $filename) or die "Can't open `$filename': $!";
while (sysread FILE, $buffer, 4096) {
$lines += ($buffer =~ tr/\n//);
}
close FILE;
print "The number of lines in $filename is $lines.\n";
perl -MTie::File -MFcntl=O_RDONLY -le 'tie @array, "Tie::File", shift, mode => O_RDONLY or die $!; print scalar @array' /etc/hosts.. and of course there's wc on *nix or from ppt
open (FILE, $ARGV[0]) or die "Can't open '$ARGV[0]': $!"; $lines++ while (); close FILE; print "$lines\n";
perl -le 'open FILE, "/etc/passwd"; @_=And (similar to [QM]'s golf reply:; print $.'
perl -lne 'END{print $.}' /etc/passwd
perl -pe '}{$_=$.' filename
-QM
--
Quantum Mechanics: The dreams stuff is made of
> perl -MO=Deparse -pe"#stuff#" LINE: while (defined($_ =to -n:)) { (); } continue { print $_; }
> perl -MO=Deparse -ne"#stuff#" LINE: while (defined($_ =)) { (); }
-QM
--
Quantum Mechanics: The dreams stuff is made of
Here's yet another golf variation, provided there's only one filename and that's a real filename (not a glob or something you can give to the two-arg open):
exec wc,-ll,pop
Hi try this,
#! /usr/bin/perl use strict; open(IN, "test.txt"); my @str =; close(IN); print scalar(@str);
Sorry, please forgive the tirade, I don't know what came over me. It must be the ghost of [Abigail-II]...Certainly [TIMTOWTDI]. (I find many of my cow-orkers skip over the "gather requirements" phase of programming, and jump headfirst into the shallow end of the implementation pool.)
While playing with this, I wanted to check how similar schemes work. For instance, don't do this either:
perl -e 'print scalar(()=<>),"\n"' filenameI tried this on a 300MB file, which took a long time (I waited several minutes before killing it), lots of memory, and started swapping to disk.
I tried the following on the same 300MB file, which took about 10 seconds, and never went above 2MB memory:
perl -pe "}{$_=$." filename
Inside a script, you could do this:
#!/your/perl/here -p
}{$_=$.
(yes, that compiles and runs too) though you may prefer the more conventional
#!/your/perl/here
use strict;
use warnings;
while (<>) {}
print "$.\n";
If you want to get fancy, and feed it more than one file at a time, keeping track of each file, try this:
#!/your/perl/here
use strict;
use warnings;
my $file_count = @ARGV;
while (<>) {}
continue
{
if (eof)
{
# print file names for multiple files
print "$ARGV: " if ($file_count > 1);
print "$.\n";
close ARGV;
}
}
Someone will ask me for command line arguments to leave off the filenames, and provide summary statistics for multiple files. I'll leave that to [OMAR]. (Wow, there really is an [OMAR]! But he doesn't write much :(
-QM
--
Quantum Mechanics: The dreams stuff is made of
perlmonks.org content © perlmonks.org and ambrus, aweeraman, davidrw, gube, QM, Scott7477
prlmnks.org © 2006 edmund von der burg (eccles & toad)
v 0.03