Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best way to slurp a file into a string in Perl?

People also ask

What does it mean to slurp a file?

If your program is slurping that means it's not working with the data as it becomes available and rather makes you wait for however long it might take for the input to complete.

How do I store contents of a file in a variable in Perl?

my $content; open(my $fh, '<', $filename) or die "cannot open file $filename"; { local $/; $content = <$fh>; } close($fh); Using 3 argument open is safer. Using file handle as variable is how it should be used in modern Perl and using local $/ restores initial value of $/ on block end, instead of your hardcoded \n .

How do you call a file in Perl?

open DATA, "+>file. txt" or die "Couldn't open file file. txt, $!"; You can open a file in the append mode.

How do I read the contents of a file in Perl?

The main method of reading the information from an open filehandle is using the operator < >. When < > operator is used in a list context, it returns a list of lines from the specified filehandle. The example below reads one line from the file and stores it in the scalar. $firstchar = getc (fh);


How about this:

use File::Slurp;
my $text = read_file($filename);

ETA: note Bug #83126 for File-Slurp: Security hole with encoding(UTF-8). I now recommend using File::Slurper (disclaimer: I wrote it), also because it has better defaults around encodings:

use File::Slurper 'read_text';
my $text = read_text($filename);

or Path::Tiny:

use Path::Tiny;
path($filename)->slurp_utf8;

I like doing this with a do block in which I localize @ARGV so I can use the diamond operator to do the file magic for me.

 my $contents = do { local(@ARGV, $/) = $file; <> };

If you need this to be a bit more robust, you can easily turn this into a subroutine.

If you need something really robust that handles all sorts of special cases, use File::Slurp. Even if you aren't going to use it, take a look at the source to see all the wacky situations it has to handle. File::Slurp has a big security problem that doesn't look to have a solution. Part of this is its failure to properly handle encodings. Even my quick answer has that problem. If you need to handle the encoding (maybe because you don't make everything UTF-8 by default), this expands to:

my $contents = do {
    open my $fh, '<:encoding(UTF-8)', $file or die '...';
    local $/;
    <$fh>;
    };

If you don't need to change the file, you might be able to use File::Map.


In writing File::Slurp (which is the best way), Uri Guttman did a lot of research in the many ways of slurping and which is most efficient. He wrote down his findings here and incorporated them info File::Slurp.


open(my $f, '<', $filename) or die "OPENING $filename: $!\n";
$string = do { local($/); <$f> };
close($f);