2012-01-04 76 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

相關問題