我通过管道输出几个脚本的输出。其中一个脚本输出由我的 perl 脚本处理的整个 HTML 页面。我希望能够将整个 58K 文本提取到 perl 脚本中(当然,其中将包含换行符)。
我认为这可能有效:
open(my $TTY, '<', '/dev/tty');
my $html_string= do { local( @ARGV, $/ ) = $TTY ; <> } ;
但它只是没有做我需要的。有什么建议么?
我通过管道输出几个脚本的输出。其中一个脚本输出由我的 perl 脚本处理的整个 HTML 页面。我希望能够将整个 58K 文本提取到 perl 脚本中(当然,其中将包含换行符)。
我认为这可能有效:
open(my $TTY, '<', '/dev/tty');
my $html_string= do { local( @ARGV, $/ ) = $TTY ; <> } ;
但它只是没有做我需要的。有什么建议么?
my @lines = <STDIN>;
或者
my $str = do { local $/; <STDIN> };
tl;博士:见帖子底部。先解释一下。
我只是想知道同样的事情,但我想要适合外壳单衬里的东西。原来这是(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
将stdin、stdout和stderr设置为 UTF-8 模式(您可能需要也可能不需要)-0777
设置$/
以便 Perl 将 slurp 整个文件;参考:人perlrun(1)
-Mutf8 -MEncode
加载两个模块print encode('MIME-Q', 'Subject: ' . <>);
,让我们从内到外,从右到左看:
<>
获取整个标准输入内容"Subject: "
Encode::encode
要求它将其转换为 MIME Quoted-Printable; print
, 再次在 Korn shell 中,这与; echo
在 POSIX shell 中相同——只是回显一个换行符。perl
使用-0777
选项调用。然后,在脚本内部,<>
将包含整个stdin。
#!/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