Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re: Using __DATA__ from a package

by Athanasius (Chancellor)
on Jun 18, 2013 at 06:18 UTC ( #1039515=note: print w/replies, xml ) Need Help??

in reply to Using __DATA__ from a package

Consider a driver script “”:

use strict; use warnings; use MyTest; while (<DATA>) { chomp; print "MAIN: >$_<\n"; } #MyTest::run(); while (<MyTest::DATA>) { chomp; print "MAIN: >$_<\n"; } __DATA__ 32 wilma 16

run in conjunction with a module “” (in a separate file):

package MyTest; use strict; use warnings; sub run { while (<DATA>) { chomp; print "TEST: *$_*\n"; } close DATA; } 1; __DATA__ TEST 1 2 3


14:19 >perl MAIN: >32 wilma 16< MAIN: >TEST 1 2 3< 16:04 >

As can be seen, the data section in the module is accessed via __DATA__ from within the module (i.e., within package MyTest), but via MyTest::DATA from within a different package.

But you get the same effect by uncommenting the call to MyTest::run() and using that in place of the second while loop in the driver script. Calling MyTest::run() is better practice as it maintains the encapsulation of the MyTest module.

Note: Trying to combine the two approaches is much more difficult, as it means resetting the DATA handle in the MyTest package. So far, my experiments with open, close, and seek have been less than encouraging. But trying to read the same DATA section twice is probably a bad idea anyway.

Update: ++poj for the link below. The solution is given in Re^2: __DATA__, seek, and tell — change sub run in “MyTest” to:

sub run { my $datapos = tell DATA; while (<DATA>) { chomp; print "TEST: *$_*\n"; } seek DATA, $datapos, 0; }

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^2: Using __DATA__ from a package
by poj (Monsignor) on Jun 18, 2013 at 07:42 UTC
Re^2: Using __DATA__ from a package
by Lotus1 (Curate) on Jun 18, 2013 at 13:48 UTC

    Also be aware that for Perl 5.12 and earlier on windows platforms the line ending characters weren't handled correctly (update: when using seek/tell on DATA). After this node a perlbug report was submitted and the problem corrected.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1039515]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (7)
As of 2018-04-26 14:17 GMT
Find Nodes?
    Voting Booth?