如何在Perl中读取标准输入(STDIN)?

18

我正在将几个脚本的输出进行管道处理。其中一个脚本输出整个HTML页面,该页面由我的Perl脚本处理。我想要能够将整个58K的文本拉入Perl脚本中(其中当然包含换行符)。

我原以为这样可以运行:

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

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

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

5个回答

58
my @lines = <STDIN>;
或者
my $str = do { local $/; <STDIN> };

你的代码行:my @lines = <STDIN>; 是否应该改为:my $lines = <STDIN>; - Kevin Fegan
1
@KevinFegan 当然不会。这将通过在标量上下文中调用readlineSTDIN读取单行。 - Sinan Ünür
1
my $str; { local $/; $str = <STDIN> }; 可以节省内存。 - Ωmega

8
我不能错过这个表达我对IO::All 有多么热爱的机会,所以我要说:

♥ ♥ __ "我真的很喜欢IO::All ... 很多很多" __ ♥ ♥

POD SYNOPSIS 的变化:

use IO::All;
my $contents < io('-') ;
print "\n printing your IO: \n $contents \n with IO::All goodness ..." ;

警告: IO::All 可能会用自己的神奇特性,开始替代您所了解的perl中与IO相关的一切。


4

简短概括:请查看本文底部。以下是详细解释。

实际示例

我也曾思考过同样的问题,但我想要一个适用于单行命令的shell脚本。结果发现这个(Korn shell, 整个示例,在下面进行了分解):

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

分解:

  • print -nr -- "$x" 输出$x的全部内容,不带任何尾随换行符(-n)或反斜杠转义符(-r),POSIX等效命令:printf '%s' "$x"
  • -C7 将标准输入、标准输出和标准错误设置为UTF-8模式(您可能需要或不需要它)
  • -0777 设置$/以便Perl将读取整个文件; 参考:man perlrun(1)
  • -Mutf8 -MEncode 加载两个模块
  • 其余部分是Perl命令本身:print encode('MIME-Q', 'Subject: ' . <>);,我们从内到外、从右到左来看它:
    • <> 获取整个标准输入的内容
    • 将其与字符串"Subject: "连接起来
    • 并传递给Encode::encode,要求将其转换为MIME Quoted-Printable格式
    • 结果被打印在标准输出上(不带任何尾随换行符)
  • 这之后是; print,在Korn shell中,它与POSIX shell中的; echo相同-只是输出一个换行符。

tl;dr

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

完整自包含示例

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

3
为了将其转换为单个字符串,您需要:
#!/usr/bin/perl -w
use strict;

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

print $html_string;

2
我已经知道如何获取单行。这就是为什么我明确说明了“slurp”,并且给出了一个示例,其中我关闭了行终止字符。 - phileas fogg

0

我一直使用裸块。

  my $x;
  {
    undef $/; # Set slurp mode
    $x = <>;  # Read in everything up to EOF
  }
  # $x should now contain all of STDIN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接