我怎样才能使用__DATA__两次?

时间:2010-12-16 10:17:51

标签: perl filehandle

如何使用__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 个答案:

答案 0 :(得分:46)

要使用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>);

另见:

答案 1 :(得分:7)

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

答案 2 :(得分:0)

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

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