Read an entire file into a string
There are several ways in Perl to read an entire file into a string, (a procedure also known as “slurping”).
If you have access to CPAN, you can use the File::Slurp module:
use File::Slurp;
my $file_content = read_file('text_document.txt');
File::Slurp’s read_file
function to reads the entire contents of a file with the file name and returns it as a string. It’s simple and usually does what it’s expected to do. However use of File::Slurp
is discouraged as it has some encoding layer problems that may cause issues. File::Slurper aims to be a safer alternative that, regrettably is still described as experimental:
use File::Slurper;
my $content = read_text('text_document.txt');
File::Slurper’s read_text
function accepts an optional encoding argument, and can automatically decode crlf
line endings if you request it (for Windows files).
Slurping files without modules
Slurping files is not complicated though and requires just a few lines of Perl. First I open a filehandle:
open my $fh, '<', 'text_document.txt' or die "Can't open file $!";
Now I can read the file contents:
my $file_content = do { local $/; <$fh> };
Within the do
block it localizes Perl’s record separator variable $/
to undef
, so that the diamond <>
operator will read all the lines of the file at once (usually $/
is set to newline).
Once you’ve opened a filehandle to the file you want to slurp, instead of a do
block, you can also use read
to slurp a file:
read $fh, my $file_content, -s $fh;
read
requires a filehandle, a target variable to read content into and a length argument. To get the length of the file, we use the -s
function on the filehandle, which returns the file size in bytes. For large files, this approach is faster than the do
block method.
PerlIO Layers
When slurping a file, you may want to add a PerlIO layer instruction to the open argument:
open my $fh, '<:unix', 'text_document.txt' or die "Couldn't open $filename: $!";
With this code the first line looks the same except :unix
has been appended to the file open direction. You can read more about the PerlIO layers here.
Yet another way
In the comments section of a blog post, Damien Krotkine showed that it’s also possible to slurp a file in “one line” of Perl, or at least without using open
:
my $file_content = do{local(@ARGV,$/)=$filename;<>};
Cool, huh? This works by localizing @ARGV
and saving $filename
as the first element of @ARGV
. The empty diamond operator <>
automatically opens a filehandle to the first element of @ARGV
, which is the filename. If you need to set a PerlIO layer, the filehandle name is ARGV
so you can use binmode to set the layer (before the file is read!):
binmode ARGV, $layer;
Updated: changed to give more examples, File::Slurp warning and include File::Slurper. 2015-06-26
This article was originally posted on PerlTricks.com.
Tags
David Farrell
David is a professional programmer who regularly tweets and blogs about code and the art of programming.
Browse their articles
Feedback
Something wrong with this article? Help us out by opening an issue or pull request on GitHub