I piping the output of several scripts. One of these scripts outputs an entire HTML page that gets processed by my perl script. I want to be able to pull the whole 58K of text
my @lines = <STDIN>;
or
my $str = do { local $/; <STDIN> };
To get it into a single string you want:
#!/usr/bin/perl -w
use strict;
my $html_string;
while(<>){
$html_string .= $_;
}
print $html_string;
I've always used a bare block.
my $x;
{
undef $/; # Set slurp mode
$x = <>; # Read in everything up to EOF
}
# $x should now contain all of STDIN
I can't let this opportunity to say how much I love IO::All pass without saying:
♥ ♥ __ "I really like IO::All ... a lot" __ ♥ ♥
Variation on the POD SYNOPSIS:
use IO::All;
my $contents < io('-') ;
print "\n printing your IO: \n $contents \n with IO::All goodness ..." ;
Warning: IO::All may begin replacing everything else you know about IO in perl with its own insidious goodness.
tl;dr: see at the bottom of the post. Explanation first.
I’ve just wondered about the same, but I wanted something suitable for a shell one-liner. Turns out this is (Korn shell, whole example, dissected below):
print -nr -- "$x" | perl -C7 -0777 -Mutf8 -MEncode -e "print encode('MIME-Q', 'Subject: ' . <>);"; print
Dissecting:
print -nr -- "$x"
echos the whole of $x
without any trailing newline (-n
) or backslash escape (-r
), POSIX equivalent: printf '%s' "$x"
-C7
sets stdin, stdout, and stderr into UTF-8 mode (you may or may not need it)-0777
sets $/
so that Perl will slurp the entire file; reference: man perlrun(1)-Mutf8 -MEncode
loads two modulesprint encode('MIME-Q', 'Subject: ' . <>);
, let’s look at it from inner to outer, right to left:
<>
takes the entire stdin content"Subject: "
Encode::encode
asking it to convert that to MIME Quoted-Printable; print
, again in Korn shell, which is the same as ; echo
in POSIX shell – just echoïng a newline.Call perl
with the -0777
option. Then, inside the script, <>
will contain the entire stdin.
#!/usr/bin/perl -0777
my $x = <>;
print "Look ma, I got this: '$x'\n";