Perl 模塊 Config::Any

簡(jiǎn)介

可透明地從各種不同類型的文件中加載配置信息;如:JSON,XML妈候,YAML楚里,INI等

use Config::Any;
 
my $cfg = Config::Any->load_stems({stems => \@filepath_stems, ... });
# or
my $cfg = Config::Any->load_files({files => \@filepaths, ... });
 
for (@$cfg) {
    my ($filename, $config) = %$_;
    $class->config($config);
    warn "loaded config from file: $filename";
}

Config::Any 為perl的應(yīng)用程序提供了一種從不同類型的配置文件加載配置信息的方法。它支持的文件格式有:XML、YAML、JSON、INI赛惩、Perl代碼.
這個(gè)模塊的基本原理如下 :
Perl程序會(huì)部署到不同的平臺(tái)并且會(huì)運(yùn)行在很多不同的系統(tǒng)環(huán)境下。系統(tǒng)管理員和最終用戶可能比開(kāi)發(fā)人員更喜歡不同的配置格式趁餐。多種格式的配置文件可以有很大的靈活性讓用戶做出不同的選擇喷兼,而開(kāi)發(fā)人員并沒(méi)有增加額外的工作量。作為開(kāi)發(fā)人員后雷,只需要學(xué)習(xí)如何使用一個(gè)接口讓不同格式的配置文件在適合的時(shí)間被加載季惯。

接口

load_files(%args)

Config::Any->load_files( { files => \@files } );
Config::Any->load_files( { files => \@files, filter  => \&filter } );
Config::Any->load_files( { files => \@files, use_ext => 1 } );
Config::Any->load_files( { files => \@files, flatten_to_hash => 1 } );

load_files() 嘗試從參數(shù)中給出的文件列表(files)中加載配置文件,前提是文件存在臀突。

如果參數(shù) filter 存在勉抓,它會(huì)被當(dāng)作一個(gè)回調(diào)方法(callback),被用來(lái)處理加載后返回之前的配置項(xiàng)候学。一個(gè)hash-reference 參數(shù)被傳遞給它藕筋。

如果參數(shù) use_ext 參數(shù)被定義,加載程序?qū)L試解析每個(gè)文件的擴(kuò)展名梳码,并跳過(guò)不能與標(biāo)準(zhǔn)的插件擴(kuò)展名相匹配的文件隐圾。只有與標(biāo)準(zhǔn) 的插件擴(kuò)展名相匹配的文件才會(huì)使用對(duì)應(yīng)的插件進(jìn)行解析。出于效率的原因掰茶,這是被鼓勵(lì)使用的暇藏。但是這也將失去靈活性。例如:一個(gè)文件命名為myapp.cfg 內(nèi)容是 YAML 數(shù)據(jù)濒蒋,這時(shí)它不會(huì)被 YAML 的插件解析叨咖,因?yàn)橹挥?.yml 或 .yaml 類型的文件才會(huì)被 YAML 插件解析。

當(dāng) flatten_to_hash 參數(shù)被定義時(shí),加載器會(huì)返回一個(gè)以文件名為鍵甸各、以內(nèi)容為值的哈希,而不是返回一個(gè)單鍵哈希的列表焰坪。

load_files() 還可以接受一個(gè)名為 force_plugins的參數(shù)趣倾,它的值應(yīng)該是一個(gè)以插件名為元素的arrayref。它的作用是允許你使用一個(gè)非標(biāo)準(zhǔn)的擴(kuò)展名某饰,并指定一個(gè)特定的解析器來(lái)處理他儒恋,此配置項(xiàng)與 use_ext 不兼容。

你還可以提供一個(gè) driver_args hashref 傳遞給個(gè)別的解析對(duì)象黔漂。如下代碼:

Config::Any->load_files( { files => \@files, driver_args => {
    General => { -LowerCaseNames => 1 }
} )

load_stems(%args)

Config::Any->load_stems( { stems => \@stems } );
Config::Any->load_stems( { stems => \@stems, filter  => \&filter } );
Config::Any->load_stems( { stems => \@stems, use_ext => 1 } );
Config::Any->load_stems( { stems => \@stems, flatten_to_hash => 1 } );

load_stems 首先遍歷所有可用插件诫尽,把插件可處理的所有擴(kuò)展名與 stems 列表中給出的沒(méi)有擴(kuò)展名的文件相結(jié)合生成一個(gè)插件可處理的文件列表。然后它將調(diào)用 load_files對(duì)生成的文件列表進(jìn)行處理炬守。

sub load_stems {
    my ( $class, $args ) = @_;
 
    unless ( $args && exists $args->{ stems } ) {
        warn "No stems specified!";
        return;
    }
 
    my $stems = delete $args->{ stems };
    my @files;
    for my $s ( @$stems ) {
        for my $ext ( $class->extensions ) {
            push @files, "$s.$ext";
        }
    }
 
    $args->{ files } = \@files;
    return $class->_load( $args );
}

finder()

這個(gè)方法 finder 返回 Module::Pluggable::Object 對(duì)象 用來(lái)加載插件牧嫉。

plugins()

這個(gè)方法 plugins 通過(guò)使用 Module::Pluggable::Object 模塊的對(duì)象 得到配置文件加載器插件的名稱。

extensions()

這個(gè)方法 extensions 返回插件可處理的所有可能的擴(kuò)展名减途。如果你設(shè)置了 use_ext 那么 load_stemsload_files 都需要用到它酣藻。

相關(guān)文章

Perl 模塊 Config::Any 之 Config::Any::Base

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鳍置,隨后出現(xiàn)的幾起案子辽剧,更是在濱河造成了極大的恐慌,老刑警劉巖税产,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怕轿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辟拷,警方通過(guò)查閱死者的電腦和手機(jī)撞羽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梧兼,“玉大人放吩,你說(shuō)我怎么就攤上這事∮鸾埽” “怎么了渡紫?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)考赛。 經(jīng)常有香客問(wèn)我惕澎,道長(zhǎng),這世上最難降的妖魔是什么颜骤? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任唧喉,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘八孝。我一直安慰自己董朝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布干跛。 她就那樣靜靜地躺著子姜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楼入。 梳的紋絲不亂的頭發(fā)上哥捕,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音嘉熊,去河邊找鬼遥赚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阐肤,可吹牛的內(nèi)容都是我干的凫佛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼泽腮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼御蒲!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诊赊,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厚满,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后碧磅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碘箍,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鲸郊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丰榴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秆撮,死狀恐怖四濒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情职辨,我是刑警寧澤盗蟆,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站舒裤,受9級(jí)特大地震影響喳资,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腾供,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一仆邓、第九天 我趴在偏房一處隱蔽的房頂上張望鲜滩。 院中可真熱鬧,春花似錦节值、人聲如沸徙硅。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闷游。三九已至,卻和暖如春贴汪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背休吠。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工扳埂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘤礁。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓阳懂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柜思。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岩调,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容