Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: b2d6cb878e
Fetching contributors…

Cannot retrieve contributors at this time

100 lines (74 sloc) 3.796 kb
NAME
File::CountLines - efficiently count the number of line breaks in a
file.
SYNOPSIS
use File::CountLines qw(count_lines);
my $no_of_lines = count_lines('/etc/passwd');
# other uses
my $carriage_returns = count_lines(
'path/to/file.txt',
style => 'cr',
);
# possible styles are 'native' (the default), 'cr', 'lf'
DESCRIPTION
perlfaq5 answers the question on how to count the number of lines in a
file. This module is a convenient wrapper around that method, with
additional options.
More specifically, it counts the number of *line breaks* rather than
lines. On Unix systems nearlly all text files end with a newline (by
convention), so usually the number of lines and number of line breaks is
equal.
Since different operating systems have different ideas of what a newline
is, you can specifiy a "style" option, which can be one of the following
values:
"native"
This takes Perl's "\n" as the line separator, which should be the
right thing in most cases. See perlport for details. This is the
default.
"cr"
Take a carriage return as line separator (MacOS style)
"lf"
Take a line feed as line separator (Unix style)
"crlf"
Take a carriage return followed by a line feed as separator
(Microsoft Windows style)
Alternatively you can specify an arbitrary separator like this:
my $lists = count_lines($file, separator => '\end{itemize}');
It is taken verbatim and searched for in the file.
The file is read in equally sized blocks. The size of the blocks can be
supplied with the "blocksize" option. The default is 4096, and can be
changed by setting $File::CountLines::BlockSize.
Do not use a block size smaller than the length of the separator, that
might produce wrong results. (In general there's no reason to chose a
smaller block size at all. Depending on your size a larger block size
might speed up things a bit.)
Character Encodings
If you supply a separator yourself, it should not be a decoded string.
The file is read in binary mode, which implies that this module works
fine for text files in ASCII-compatible encodings, including ASCII
itself, UTF-8 and all the ISO-8859-* encodings (aka Latin-1, Latin-2,
...).
Note that the multi byte encodings like UTF-32, UTF-16le, UTF-16be and
UCS-2 encode a line feed character in a way that the 0x0A byte is a
substring of the encoded character, but if you search blindly for that
byte you will get false positives. For example the *LATIN CAPITAL LETTER
C WITH DOT ABOVE*, U+010A has the byte sequence "0x0A 0x01" when encoded
as UTF-16le, so it would be counted as a newline. Even search for "0x0A
0x00" might give false positives.
So the summary is that for now you can't use this module in a meaningful
way to count lines of text files in encodings that are not
ASCII-compatible. If there's demand for, I can implement that though.
Extending
You can add your own EOL styles by adding them to the
%File::CountLines::StyleMap hash, with the name of the style as hash key
and the seperator as the value.
AUTHOR
Moritz Lenz <http://perlgeek.de>, <mailto:moritz@faui2k3.org>
COPYRIGHT AND LICENSE
Copyright (C) 2008 by Moritz A. Lenz. This module is free software. You
may use, redistribute and modify it under the same terms as perl itself.
Example code included in this package may be used as if it were in the
Public Domain.
DEVELOPMENT
You can obtain the latest development version via subversion:
svn co https://faui2k3.org/svn/moritz/cpan/File-CountLines/
Jump to Line
Something went wrong with that request. Please try again.