Ответ 1
my @lines = <STDIN>;
или
my $str = do { local $/; <STDIN> };
Я обрабатываю вывод нескольких скриптов. Один из этих сценариев выводит всю HTML-страницу, которая обрабатывается моим perl script. Я хочу, чтобы вытащить весь текст 58К в perl script (который, конечно, будет содержать символы новой строки).
Я думал, что это может сработать:
open(my $TTY, '<', '/dev/tty');
my $html_string= do { local( @ARGV, $/ ) = $TTY ; <> } ;
Но он просто не делает то, что мне нужно. Любые предложения?
my @lines = <STDIN>;
или
my $str = do { local $/; <STDIN> };
Я не могу позволить этой возможности сказать, как сильно я люблю IO::All
проходят без слов:
I ♥ __ "Мне очень нравится IO::All
... много" __ ♥ ♥
Вариация на ОПИСАНИЕ ПОД:
use IO::All;
my $contents < io('-') ;
print "\n printing your IO: \n $contents \n with IO::All goodness ..." ;
Предупреждение: IO::All
может начать заменять все остальное, что вы знаете о IO в perl, своим собственным коварным совершенством.
Чтобы получить его в одну строку, которую вы хотите:
#!/usr/bin/perl -w
use strict;
my $html_string;
while(<>){
$html_string .= $_;
}
print $html_string;
tl; dr: см. внизу сообщения. Пояснение сначала.
Я просто задавался вопросом о том же, но мне нужно было что-то подходящее для оболочки с одним слоем. Оказывается, это (оболочка Korn, весь пример, расчленена ниже):
print -nr -- "$x" | perl -C7 -0777 -Mutf8 -MEncode -e "print encode('MIME-Q', 'Subject: ' . <>);"; print
Dissecting:
print -nr -- "$x"
echos все $x
без какой-либо завершающей новой строки (-n
) или escape-обратного сбега (-r
), эквивалент POSIX: printf '%s' "$x"
-C7
устанавливает stdin, stdout и stderr в режим UTF-8 (вам может понадобиться или не понадобиться)-0777
устанавливает $/
, чтобы Perl удалил весь файл; ссылка: man perlrun(1)
-Mutf8 -MEncode
загружает два модуляprint encode('MIME-Q', 'Subject: ' . <>);
, позволяет просматривать ее от внутреннего к внешнему, справа налево:
<>
принимает весь контент stdin"Subject: "
Encode::encode
с просьбой преобразовать его в MIME с котировкой-печатью; print
, снова в оболочке Korn, которая совпадает с ; echo
в оболочке POSIX - просто выдает новую строку.Вызовите perl
с помощью опции -0777
. Затем внутри script, <>
будет содержаться весь stdin.
#!/usr/bin/perl -0777
my $x = <>;
print "Look ma, I got this: '$x'\n";
Я всегда использовал голый блок.
my $x;
{
undef $/; # Set slurp mode
$x = <>; # Read in everything up to EOF
}
# $x should now contain all of STDIN