2012-12-14 18 views
-2

我是Perl編程的新手,想了解以Perl模塊的形式構建一段代碼的最佳方式。它應該提供一個框架,使'數據'可以增長/縮小而不會影響代碼。常見功能集的設計 - 拆分數據和代碼

本質上,程序需要執行3件不同的事情( '數據' 部分):根據

  1. 收集從多個文件文本(整個文本)在其RPM(RPM名= 'A',「B ','C'分別代表參數)安裝在主機上。文件列表將會增加,應該存儲在一個簡單的外部文件中,該文件應該很容易編輯。
  2. 在操作系統(Linux)上運行OS命令並將命令的輸出捕獲到文本文件中,具體取決於哪個RPM(參數的RPM名稱='A','B','C')是安裝在主機上。
  3. 在特定數據庫上運行數據庫命令(可以稱之爲'DBA','DBB','DBC',3個與3臺主機對應的數據庫),並將輸出捕獲到文本文件,具體取決於哪個RPM(RPM名稱= 'A','B','C'分別代表參數)安裝在主機上。

我需要的邏輯以這樣的方式編程的是:

  1. 必須有一個「RPM到文件/指令/ DB-命令」映射這是容易編輯分別從主Perl程序
  2. 文件數量,它們的名稱/位置+ OS + DB命令預計會發生變化,因此應該可以從主Perl程序中單獨輕鬆編輯
  3. RPM名稱和映射到上述數據可能會發生變化,因此應該可以從主Perl程序中輕鬆編輯

思想,我迄今研究:

  1. 哈希值的哈希(Perl模塊中)
  2. 陣列陣列的(Perl模塊中)
  3. 外部XML
  4. 外部密鑰 - 值對文件

任何指導最簡單最簡單的方法是什麼?說明性代碼將非常有益。

+0

SO不能這樣工作。我們希望您嘗試一些事情,解釋您正在嘗試的內容,然後提出問題,說明爲什麼有些事情沒有達到您期望的效果。 IOW,我們不會教你爲你編程或編寫你的代碼,但我們將幫助你調試你已經完成的工作。 (閱讀常見問題,這是非常有用的) – KevinDTimm

+0

該男子正在尋求如何去實施的建議,這對我來說是一個足夠有效的問題。除非你是在暗示他會問自己在代碼中實現解決方案的最佳方式是什麼?好傢伙! – Bee

+0

@Bee - 閱讀常見問題以確定SO的目的 – KevinDTimm

回答

1

你如何存儲你的配置取決於它的複雜程度以及它對未編程系統的人的訪問方式。

將配置存儲爲Perl代碼的好處是,該解析相當便宜。但是,可能存在安全問題,因爲配置文件不會被加載,而是被執行。另外,這是一個可怕的設計。

XML非常靈活,但(a)手動編輯可怕,並且(b)處理比其他解決方案更昂貴[需要的引證]

如果您的配置數據可以非常容易地表示爲鍵值對,那就去做吧。否則,看看JSON或YAML,它會給你所有你需要的權力(大部分時間)。


我會寫系統以這樣的方式,即主要目的是在程序的開始裝載。構造函數將RPM類型作爲參數,並處理相應的配置文件。

然後,您將創建一個接口到此對象,以便處理文本文件,運行系統命令和運行數據庫查詢將使用正確的配置值。

只要確保讓代碼更好,更通用,以便程序的主要邏輯不需要知道它使用的是什麼RPM,除了初始化。

一個Perl類通常是一個模塊在同一時間。在需要時創建輔助模塊,只要它是明智的。



實施例的構造:

package MyObject; 
use strict; use warnings; use Carp; 
use YAML qw(LoadFile); 
my $config_file_dir = "/foo/bar/"; 
sub new { 
    my ($class, $type) = @_; 
    do_rpm_type_sanity_check($type) or confess qq(Invalid type given: $!); 
    my $self = LoadFile($config_file_dir . $type . ".yaml"); 
    do_config_sanity_check($self) or confess qq(Really weird configuration: $!); 
    bless $self, $class; 
} 

示例用法

#!/usr/bin/perl 
use strict; use warnings; 
use MyObject; 

my $type = magically_get_type(); 

my $obj = MyObject->new($type); 
...; # do something useful with the object. 
+0

非常好,以前沒有考慮過yaml--謝謝! – Aravind