【问题标题】:How can I use __DATA__ twice?我怎样才能使用 __DATA__ 两次?
【发布时间】:2010-12-16 10:17:50
【问题描述】:

我怎样才能使用两次__DATA__

#!/usr/local/bin/perl
use warnings;
use 5.012;

while ( <DATA> ) {
    print;
}

while ( <DATA> ) {
    chomp if $. == 1;
    print scalar reverse;
    print "\n" if eof;
}
__DATA__
one
two
three
four
five
six

【问题讨论】:

    标签: perl filehandle


    【解决方案1】:

    要使用DATA 文件句柄两次,您需要将其倒回。棘手的一点是,如果您执行seek(DATA, 0, 0),它将定位到第一个源代码行,而不是__DATA__ 之后的行。因此需要先保存位置:

    my $data_start = tell DATA; # save the position
    print while (<DATA>);
    seek DATA, $data_start, 0;  # reposition the filehandle right past __DATA__
    print while (<DATA>);
    

    另见:

    【讨论】:

      【解决方案2】:

      您可以使用Data::Handle 模块在幕后为您执行tell()ingseek()ing。 (虽然我相信如果你有 perl 5.10 或更高版本,你可以dupDATA 文件句柄,而不是共享原始的DATA 文件句柄并在其中来回查找。)

      【讨论】:

      • 您可以在 5.10 以外的 perl 中复制(或 fdopen)数据,但似乎只有 5.8.9((可能还有其他版本,但不包括 5.8.0 和 5.10.0)允许你为每个文件句柄保留单独的指针。所以你仍然需要在你的欺骗文件句柄上来回寻找,或者只使用 Data::Handle。
      【解决方案3】:

      老实说,最简单的解决方案是读取一次 DATA 并将其存储在数组或变量中。

      my @data;
      while(<DATA>){
        push @data, $_;
      }
      

      【讨论】:

      • 视情况而定。如果您不想存储它,这不是一个选项。
      • 您为什么不想存储它?无论如何它已经在脚本中了,如果以后你想切换到另一个源(例如输入文件),那么这种方法将使修改脚本变得更加简单。
      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      相关资源
      最近更新 更多