【问题标题】:How can I slurp STDIN in Perl?如何在 Perl 中使用 STDIN?
【发布时间】:2012-05-25 23:04:16
【问题描述】:

我通过管道输出几个脚本的输出。其中一个脚本输出由我的 perl 脚本处理的整个 HTML 页面。我希望能够将整个 58K 文本提取到 perl 脚本中(当然,其中将包含换行符)。

我认为这可能有效:

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

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

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

【问题讨论】:

    标签: perl


    【解决方案1】:
    my @lines = <STDIN>;
    

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

    【讨论】:

    • 您的线路:my @lines = &lt;STDIN&gt;; 应该是:my $lines = &lt;STDIN&gt;; 吗?
    • @KevinFegan 当然不是。这将通过在标量上下文中调用 readlineSTDIN 中读取一行。
    • my $str; { local $/; $str = &lt;STDIN&gt; }; 消耗更少的内存
    【解决方案2】:

    tl;dr:见帖子底部。先解释一下。

    实际例子

    我只是想知道同样的问题,但我想要适合外壳单衬里的东西。原来这是(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"
    • -C7stdinstdoutstderr 设置为 UTF-8 模式(您可能需要也可能不需要)
    • -0777 设置 $/ 以便 Perl 将 slurp 整个文件;参考:人perlrun(1)
    • -Mutf8 -MEncode 加载两个模块
    • 剩下的就是Perl命令本身:print encode('MIME-Q', 'Subject: ' . &lt;&gt;);,让我们从内到外,从右到左看:
      • &lt;&gt; 获取整个 stdin 内容
      • 与字符串"Subject: "连接
      • 并传递给Encode::encode,要求它将其转换为 MIME Quoted-Printable
      • 其结果打印在标准输出上(没有任何尾随换行符)
    • 后面是; print,同样在 Korn shell 中,与 POSIX shell 中的 ; echo 相同——只是回显一个换行符。

    tl;博士

    使用-0777 选项调用perl。然后,在脚本内部,&lt;&gt; 将包含整个 stdin

    完整的独立示例

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

    【讨论】:

      【解决方案3】:

      我不能让这个机会说我有多 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】:

        要将它变成你想要的单个字符串:

        #!/usr/bin/perl -w
        use strict;
        
        my $html_string;
        while(<>){
           $html_string .= $_;
        }
        
        print $html_string;
        

        【讨论】:

        • 我已经知道如何获得单行了。这就是为什么我明确指出“slurp”并举例说明我关闭了行终止符。
        【解决方案5】:

        我一直使用裸块。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-05
          • 2013-02-26
          • 2012-03-25
          • 2016-03-29
          • 1970-01-01
          • 2020-09-15
          • 2018-01-03
          • 2015-01-20
          相关资源
          最近更新 更多