我该如何两次使用__DATA__?

35

我如何使用__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
3个回答

53

如果要两次使用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>);

另请参见:


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

在Perl的5.10之外的版本中,您可以使用dup(或fdopen)DATA,但似乎只有5.8.9(以及可能是5.8.0和5.10.0之间但不包括这两个版本)允许您保持每个文件句柄的单独指针。因此,您仍然需要在duped文件句柄上来回寻找,或者只需使用Data :: Handle。 - MkV

-2
老实说,最简单的解决方案是将数据读取一次并将其存储在数组或变量中。
my @data;
while(<DATA>){
  push @data, $_;
}

取决于情况。如果您不想存储它,那么这不是一个选项。 - stephanmg
为什么不想要存储它呢?无论如何,它已经在脚本中了,如果以后您想切换到另一个来源(例如输入文件),那么这种方法将使修改脚本变得更加简单。 - Tom Melly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接