Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use __DATA__ twice?

How can I use __DATA__ twice?

#!/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
like image 445
sid_com Avatar asked Dec 16 '10 10:12

sid_com


2 Answers

To use the DATA filehandle twice you need to rewind it. The tricky bit is that if you do seek(DATA, 0, 0), it'll be positioned to the first source line, not the line after __DATA__. Therefore you need to save the position first:

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>);

See also:

  • tell
  • seek
like image 155
Eugene Yarmash Avatar answered Nov 18 '22 17:11

Eugene Yarmash


You can use the Data::Handle module to do the tell()ing and seek()ing for you behind the scenes. (Though I believe if you have perl 5.10 or later you can dup the DATA file handle instead of sharing the original DATA file handle and seeking back and forth in it.)

like image 30
John Siracusa Avatar answered Nov 18 '22 15:11

John Siracusa