I recently needed to check to see if a file had a particular tag in it before continuing, but I didn’t want to have to read it line by line to find out.
To my astonishment, there is no simple way to read a whole file into a string in Perl. The simple solution would be to use File::Slurp, but since the script will be running in a closed system I could only use default libraries. Also, because it’s Perl, I wanted to do it in a single line to maintain maximum incomprehensibility.
After a bit of tooling around I came up with this:
#!/usr/bin/perl -w use strict; use warnings; # Check the file to ensure it contains the tag before continuing my $FILE = $ARGV[0] or die $!; die "File is missing required TIMESTAMP tag.n" unless do { local $/; local @ARGV = $FILE; <> } =~ /TIMESTAMP/; ...
More simply, here is the code to just stick the file contents in a variable:
my $contents = do { local $/; local @ARGV = $FILE; <> };
Essentially, what’s going on here is that I’m unsetting ‘$/’, the Input Record Separator, to make <> give the whole file at once.
Props to Stack Overflow for pointing me in the right direction.
This will be in perl 6 with the ‘slurp’ built-in, and before then, you can always:use Perl6::Slurp; my $contents = slurp $filename;