【问题标题】:How can I reopen STDIN <> in perl?如何在 perl 中重新打开 STDIN <>?
【发布时间】:2012-03-25 22:16:10
【问题描述】:

如何才能第二次打开 STDIN?

假设我有这些数据

John Smith  25  O   ATG 180
Peter Jackson   40  AB  GGTA    173
Carl Anderson   32  A   GGT 172

我有这个代码

while( my $line = <>)  {
    print $line;
}
while( my $line = <>)  {
    print $line;
}

我要打印出来

John Smith  25  O   ATG 180
Peter Jackson   40  AB  GGTA    173
Carl Anderson   32  A   GGT 172
John Smith  25  O   ATG 180
Peter Jackson   40  AB  GGTA    173
Carl Anderson   32  A   GGT 172

【问题讨论】:

    标签: perl stdin loops


    【解决方案1】:

    你不能,你已经清空了流。如果您想再次使用它,请将这些行放入一个数组中。

    my @lines;
    while( my $line = <>)  {
        print $line;
        push @lines, line;
    }
    
    foreach my $line (@lines)  {
        print $line;
    }
    

    或者,写入文件并获取文件的文件句柄。

    【讨论】:

    • 更简洁:my @lines = &lt;&gt;; print( (@lines) x 2 )
    【解决方案2】:

    如果 STDIN 附加到文件,那么您可以seek(STDIN, 0, 0),但一般情况下,您不能按照您的要求进行操作。

    【讨论】:

      【解决方案3】:

      您总是可以获取文件名而不是使用 STDIN。

      $fn = shift;
      open(MyFile,"< $fn") || die "cant open $fn $!";
      while(MyFile) { } # first time thru
      seek MyFile,0,0
      while(MyFile) { } # second time thru
      

      如果它是一个文件列表,您可以遍历它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-23
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多