我正在将几个脚本的输出进行管道处理。其中一个脚本输出整个HTML页面,该页面由我的Perl脚本处理。我想要能够将整个58K的文本拉入Perl脚本中(其中当然包含换行符)。
我原以为这样可以运行:
open(my $TTY, '<', '/dev/tty');
my $html_string= do { local( @ARGV, $/ ) = $TTY ; <> } ;
但是它并没有做到我需要的。 有什么建议吗?
我正在将几个脚本的输出进行管道处理。其中一个脚本输出整个HTML页面,该页面由我的Perl脚本处理。我想要能够将整个58K的文本拉入Perl脚本中(其中当然包含换行符)。
我原以为这样可以运行:
open(my $TTY, '<', '/dev/tty');
my $html_string= do { local( @ARGV, $/ ) = $TTY ; <> } ;
但是它并没有做到我需要的。 有什么建议吗?
my @lines = <STDIN>;
或者my $str = do { local $/; <STDIN> };
简短概括:请查看本文底部。以下是详细解释。
我也曾思考过同样的问题,但我想要一个适用于单行命令的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
加载两个模块print encode('MIME-Q', 'Subject: ' . <>);
,我们从内到外、从右到左来看它:
<>
获取整个标准输入的内容"Subject: "
连接起来Encode::encode
,要求将其转换为MIME Quoted-Printable格式; print
,在Korn shell中,它与POSIX shell中的; echo
相同-只是输出一个换行符。使用-0777
选项调用perl
。然后,在脚本内部,<>
将包含整个标准输入。
#!/usr/bin/perl -0777
my $x = <>;
print "Look ma, I got this: '$x'\n";
#!/usr/bin/perl -w
use strict;
my $html_string;
while(<>){
$html_string .= $_;
}
print $html_string;
我一直使用裸块。
my $x;
{
undef $/; # Set slurp mode
$x = <>; # Read in everything up to EOF
}
# $x should now contain all of STDIN
my @lines = <STDIN>;
是否应该改为:my $lines = <STDIN>;
? - Kevin Feganreadline
从STDIN
读取单行。 - Sinan Ünür