16

我通过管道输出几个脚本的输出。其中一个脚本输出由我的 perl 脚本处理的整个 HTML 页面。我希望能够将整个 58K 文本提取到 perl 脚本中(当然,其中将包含换行符)。

我认为这可能有效:

open(my $TTY, '<', '/dev/tty');

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

但它只是没有做我需要的。有什么建议么?

4

5 回答 5

55
my @lines = <STDIN>;

或者

my $str = do { local $/; <STDIN> };
于 2012-05-25T23:07:24.390 回答
8
于 2014-05-22T14:09:20.537 回答
4

tl;博士:见帖子底部。先解释一下。

实际例子

我只是想知道同样的事情,但我想要适合外壳单衬里的东西。原来这是(Korn shell,整个例子,下面剖析):

print -nr -- "$x" | perl -C7 -0777 -Mutf8 -MEncode -e "print encode('MIME-Q', 'Subject: ' . <>);"; print

解剖:

  • print -nr -- "$x"$x在没有任何尾随换行符 ( -n) 或反斜杠转义 ( ) 的情况下回显整个-rPOSIX 等效项:printf '%s' "$x"
  • -C7stdinstdoutstderr设置为 UTF-8 模式(您可能需要也可能不需要)
  • -0777设置$/以便 Perl 将 slurp 整个文件;参考:人perlrun(1)
  • -Mutf8 -MEncode加载两个模块
  • 剩下的就是 Perl 命令本身:print encode('MIME-Q', 'Subject: ' . <>);,让我们从内到外,从右到左看:
    • <>获取整个标准输入内容
    • 它与字符串连接"Subject: "
    • 并通过Encode::encode要求它将其转换为 MIME Quoted-Printable
    • 结果打印在标准输出上(没有任何尾随换行符)
  • 这之后是; print, 再次在 Korn shell 中,这与; echo在 POSIX shell 中相同——只是回显一个换行符。

tl;博士

perl使用-0777选项调用。然后,在脚本内部,<>将包含整个stdin

完整的独立示例

#!/usr/bin/perl -0777
my $x = <>;
print "Look ma, I got this: '$x'\n";
于 2015-06-02T11:20:59.817 回答
3

要将其转换为您想要的单个字符串:

#!/usr/bin/perl -w
use strict;

my $html_string;
while(<>){
   $html_string .= $_;
}

print $html_string;
于 2012-05-27T05:10:07.827 回答
0

我一直使用裸块。

  my $x;
  {
    undef $/; # Set slurp mode
    $x = <>;  # Read in everything up to EOF
  }
  # $x should now contain all of STDIN
于 2019-06-27T19:48:04.517 回答