从Perl中以eval(“string”)创建的包中访问__DATA__

时间:2014-01-13 07:22:01

标签: perl

我正在__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程序作为模板系统的输入文件。)

1 个答案:

答案 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>";