Как я могу удалить STDIN в Perl?

Я обрабатываю вывод нескольких скриптов. Один из этих сценариев выводит всю HTML-страницу, которая обрабатывается моим perl script. Я хочу, чтобы вытащить весь текст 58К в perl script (который, конечно, будет содержать символы новой строки).

Я думал, что это может сработать:

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

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

Но он просто не делает то, что мне нужно. Любые предложения?

Ответы

Ответ 1

my @lines = <STDIN>;

или

my $str = do { local $/; <STDIN> };

Ответ 2

Я не могу позволить этой возможности сказать, как сильно я люблю 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, своим собственным коварным совершенством.

Ответ 3

Чтобы получить его в одну строку, которую вы хотите:

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

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

print $html_string;

Ответ 4

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 загружает два модуля
  • остальная часть - это сама команда Perl: print encode('MIME-Q', 'Subject: ' . <>);, позволяет просматривать ее от внутреннего к внешнему, справа налево:
    • <> принимает весь контент stdin
    • который объединен со строкой "Subject: "
    • и передан в Encode::encode с просьбой преобразовать его в MIME с котировкой-печатью
    • результат которого печатается на stdout (без какой-либо конечной новой строки)
  • за этим следует ; print, снова в оболочке Korn, которая совпадает с ; echo в оболочке POSIX - просто выдает новую строку.

TL;DR

Вызовите perl с помощью опции -0777. Затем внутри script, <> будет содержаться весь stdin.

полный автономный пример

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

Ответ 5

Я всегда использовал голый блок.

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