How can I slurp STDIN in Perl?

后端 未结 5 1814
情话喂你
情话喂你 2021-02-07 08:06

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

5条回答
  •  难免孤独
    2021-02-07 08:49

    tl;dr: see at the bottom of the post. Explanation first.

    practical example

    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 modules
    • the remainder is the Perl command itself: print encode('MIME-Q', 'Subject: ' . <>);, let’s look at it from inner to outer, right to left:
      • <> takes the entire stdin content
      • which is concatenated with the string "Subject: "
      • and passed to Encode::encode asking it to convert that to MIME Quoted-Printable
      • the result of which is printed on stdout (without any trailing newline)
    • this is followed by ; print, again in Korn shell, which is the same as ; echo in POSIX shell – just echoïng a newline.

    tl;dr

    Call perl with the -0777 option. Then, inside the script, <> will contain the entire stdin.

    complete self-contained example

    #!/usr/bin/perl -0777
    my $x = <>;
    print "Look ma, I got this: '$x'\n";
    

提交回复
热议问题