34

我怎样才能使用__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
4

3 回答 3

52

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

也可以看看:

于 2010-12-16T10:25:26.120 回答
7

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

于 2010-12-19T02:49:13.240 回答
-1

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

my @data;
while(<DATA>){
  push @data, $_;
}
于 2019-06-25T11:31:49.140 回答