我正在__DATA__
创建一个包含动态名称和eval("")
部分的包。我可以访问__DATA__
,如果是,如何访问?
这是我到目前为止所拥有的。我不希望代码在最后一行死掉,但确实如此。
#! /usr/bin/perl -w
$packname = "testpackage";
eval(<<END);
package $packname;
\$foo='bar';
__DATA__
Some data lives here
END
# Prints "bar" as expected:
$glob = ${$packname."::"}{foo};
print "${$glob}\n" if defined ${ *{$glob}{SCALAR} };
# Dies, which is not expected
$glob = ${$packname."::"}{DATA};
die "No DATA symbol" if not defined $glob;
如果它没有死,我希望能够说出像
这样的话$data = <${$packname."::"}{DATA}>;
但显然这不起作用。
即便如此
my $body = <testpackage::DATA>;
在未打开的文件句柄DATA上显示“readline()”。即使它有效,它也无法解决我的问题,因为我事先并不知道包名。
在真实程序中,传递给eval("")
的字符串来自外部源。 (我信任的一个。我,只是戴着不同的帽子。)显然,因为我有我使用过的字符串,我可以手动徘徊__DATA__
并获得我想要的东西。但如果我能利用它,那就太好了。
(为什么我在世界上这样做?https://stackoverflow.com/questions/21085621/how-to-use-perl-as-data-file-language“沿着这条路走下去疯狂,回头!”的答案可能更适合那里。编辑添加:链接的问题有简而言之:我正在尝试使用简单的Perl程序作为模板系统的输入文件。)
答案 0 :(得分:1)
即使这不起作用:
perl -e 'package Foo;
print <Foo::DATA>;
__DATA__
FOO'
因此只有在解析了正确的输入流时才会打开DATA
文件句柄。当然,走这条路是疯狂的,但如果这真的是你想要的方式,你仍然可以通过安排从文件中读取输入来使其工作:
#! /usr/bin/perl -w
$packname = "testpackage";
use lib "/tmp";
open TMP, ">", "/tmp/tempcode.pm";
print TMP <<END;
package $packname;
\$foo='bar';
__DATA__
Some data lives here
END
close TMP;
require tempcode;
unlink "/tmp/tempcode.pm";
eval "print <$packname" . "::DATA>";