2012-01-04 62 views
4

我想设置Config :: General从__DATA__节读取脚本而不是外部文件。 (我意识到这通常不是如何工作的,但是我想看看我能否实现它。一个特定的用例是我可以将脚本示例发送给另一个开发人员,而无需发送单独的配置文件。)是否可以在Perl中使用Config :: General来读取__DATA__?

根据perldoc perldata$main::DATA应该充当有效的文件句柄。我认为Config::General应该能够使用-ConfigFile => \$FileHandle来阅读它,但它不适合我。例如,该脚本将执行没有崩溃,但__DATA__不读

#!/usr/bin/perl -w 

use strict; 
use Config::General; 
use YAML::XS; 

my $configObj = new Config::General(-ConfigFile => $main::DATA); 

my %config_hash = $configObj->getall; 

print Dump \%config_hash; 

__DATA__ 

testKey = testValue 

我也试过:

my $configObj = new Config::General(-ConfigFile => \$main::DATA); 

my $configObj = new Config::General(-ConfigFile => *main::DATA); 

和其他一些变化,但没有得到任何工作。

是否可以使用Config :: General从__DATA__读取配置密钥/值?

+0

它应该是'Dump \%config_hash'而不是'Dump%config_hash'。 – 2012-01-04 18:57:26

+0

@BradGilbert - 是的。我只是编辑修改\%config_hash的引用。谢谢。 – 2012-01-04 19:13:36

+0

在这个线程中'main ::'的所有用法都是多余的。 – ikegami 2012-01-05 01:15:13

回答

12

-ConfigFile需要引用句柄。这个工程:

my $configObj = Config::General->new(
    -ConfigFile => \*main::DATA 
); 
+0

明白了。欣赏它。 (我很接近....) – 2012-01-04 19:05:24

+0

作为@ikegami在问题的评论中注释。在我的测试案例中,没有必要使用'main ::'。删除它并使用'my $ configObj = new Config :: General(-ConfigFile => \ * DATA);'工作得很好。 – 2012-01-05 15:17:51

4

DATA句柄是一个glob,而不是标量。

尝试*main::DATA而不是$main::DATA

(也许尝试\*main::DATA。从Config::General文档,它看起来像你应该通过一个文件句柄的参数作为参考。)


如果-ConfigGeneral => filehandle参数构造函数没有做什么你意思是说,另一种是

new Config::General(-String => join ("", <main::DATA>)); 
+0

没有那个运气。 – 2012-01-04 18:47:57

+0

因为Config :: General的写法,它实际上是'Config :: General-> new(-ConfigFile => \ * main :: DATA)''。 – 2012-01-04 18:55:02

+0

对“新配置::常规”(-String => join(“”,))进行投票;'替代。这与Brad所指出的使用'\ * main :: DATA'的公认答案一样。 – 2012-01-04 19:07:58

1

这个工作对我来说:

#!/usr/bin/perl 

use strict; 
use warnings; 
use Config::General; 
use YAML::XS; 

my $string; 
{ 
    local $/; 
    $string = <main::DATA>; 
}; 
my $configObj = new Config::General(-String => $string); 

my %config_hash = $configObj->getall; 

use Data::Dumper; 
warn Dumper(\%config_hash); 

__DATA__ 

testKey = testValue 
+0

谢谢@Flimzy。事实证明,我能够使用对文件句柄的引用,并使它能够更好地实现我想要的更多功能。 – 2012-01-04 19:17:54

相关问题