You need to compute the number of lines in a file.
Many systems have a wc program to count lines in a file:
$count = `wc -l < $file`; die "wc failed: $?" if $?; chomp($count);
You could also open the file and read line-by-line until the end, counting lines as you go:
open(FILE, "< $file") or die "can't open $file: $!"; $count++ while <FILE>; # $count now holds the number of lines read
Here's the fastest solution, assuming your line terminator really
is
"\n"
:
$count += tr/\n/\n/ while sysread(FILE, $_, 2 ** 16);
Although you can use
-s
$file
to determine the file size in bytes, you generally cannot use it to derive a line count. See the Introduction to
Chapter 9,
Directories
, for more on
-s
.
If you can't or don't want to call another program to do your dirty work, you can emulate wc by opening up and reading the file yourself:
open(FILE, "< $file") or die "can't open $file: $!"; $count++ while <FILE>; # $count now holds the number of lines read
Another way of writing this is:
open(FILE, "< $file") or die "can't open $file: $!"; for ($count=0; <FILE>; $count++) { }
If you're not reading from any other files, you don't need the
$count
variable in this case. The special variable
$.
holds the number of lines read since a filehandle was last explicitly
close
d:
1 while <FILE>; $count = $.;
This reads all the records in the file and discards them.
To count paragraphs, set the global input record separator variable
$/
to the empty string (
""
) before reading to make <> read a paragraph at a time.
$/ = ''; # enable paragraph mode for all reads open(FILE, $file) or die "can't open $file: $!"; 1 while <FILE>; $para_count = $.;
Your system's
wc
(1) manpage; the
$/
entry in
perlvar
(1), and in the
"Special Variables"
section of
Chapter 2
of
Programming Perl
; the Introduction to
Chapter 9
Copyright © 2001 O'Reilly & Associates. All rights reserved.