Namespacing your __DATA__s is a clever trick, but you're wrong in saying that __DATA__ can't be accessed twice. You can use __DATA__ twice: just rewind it. You need to do so carefully:
#!/usr/bin/perl
use strict;
use warnings;
my $data_start = tell DATA;
print while (<DATA>);
seek DATA, $data_start, 0;
print while (<DATA>);
__DATA__
hello world
If you don't bother to
tell DATA; ahead of time and instead just
seek DATA, 0, 0;, then you effectively
print "hello world\n`cat $0`" which isn't what you're expecting.
Is this the best solution to the original poster's problem? Nope. Is it a solution to "how do I re-process this normal filehandle?" Yep.