2010-01-06 34 views

Trả lời

21

Tôi thích sử dụng mô-đun Config::IniFiles.

+1

Config :: IniFiles là một trình quản lý INI rất mạnh mẽ. Đề xuất tốt. – daotoad

9

Nếu bạn thích phong cách Perlish hơn sau đó thử Tie::Cfg. Ví dụ:

tie my %conf, 'Tie::Cfg', READ => "/etc/connect.cfg"; 

$conf{test}="this is a test"; 
+1

Việc sử dụng cà vạt được khuyến nghị KHÔNG được sử dụng bởi "Thực hành tốt nhất Perl". –

8

Config::Tiny rất dễ sử dụng và dễ sử dụng.

$Config = Config::Tiny->read('file.conf'); 

my $one = $Config->{section}->{one}; 
my $Foo = $Config->{section}->{Foo}; 
9

Cách tốt nhất là tận dụng các mô-đun có sẵn trong CPAN như những gì người khác đã đề xuất. Dưới đây là chỉ cho sự hiểu biết của riêng mình, chúng ta hãy nói rằng bạn đã ini nộp như thế này:

$ more test.ini 
[Section1] 
    s1tag1=s1value1    # some comments 
[Section2] 
    s2tag1=s2value1   # some comments 
    s2tag2=s2value2 
[Section3] 
    s3tag1=s3value1 

bạn có thể làm phân tích cú pháp của riêng bạn w/o module bằng cách sử dụng chỉ regex Perl (hoặc phương pháp string) + cấu trúc dữ liệu như băm.

Sample Code:

$ini="test.ini"; 
    open (INI, "$ini") || die "Can't open $ini: $!\n"; 
     while (<INI>) { 
      chomp; 
      if (/^\s*\[(\w+)\].*/) { 
       $section = $1; 
      } 
      if (/^\W*(\w+)=?(\w+)\W*(#.*)?$/) { 
       $keyword = $1; 
       $value = $2 ; 
       # put them into hash 
       $hash{$section} = [ $keyword, $value]; 
      } 
     } 
    close (INI); 
    while(my($k, $v) = each(%hash)) { 
     print "$k => " . $hash{$k}->[0]."\n"; 
     print "$k => " . $hash{$k}->[1]."\n"; 
    } 

đầu ra

$ perl perl.pl 
Section1 => s1tag1 
Section1 => s1value1 
Section3 => s3tag1 
Section3 => s3value1 
Section2 => s2tag2 
Section2 => s2value2 
+1

Lưu ý rằng trình phân tích cú pháp này sẽ chỉ giữ một cặp khóa/giá trị cho mỗi phần. – Thelema

+0

Perl thực hành tốt nhất đề xuất KHÔNG sử dụng regex để đọc các tệp cấu hình, thay vì sử dụng các mô-đun chuẩn từ CPAN ... Đối với các tệp ini: 'Config :: IniFiles'. –

1

nitpicking trên trên:

Tie :: CFG, như tải về từ CPAN, không xử lý phần và các phím có thể có không gian trong đó. Nó cần phải được thay đổi bằng cách thêm dấu ngoặc kép (") xung quanh" phím "khi thiết lập các mục nhập băm cho cả phần và các phím trong các phần. Các tệp mà tôi đang cố gắng đọc được tạo bởi người dùng MS Windows, và do đó có rất nhiều không gian để đi xung quanh

Cấu hình :: Tiny, Config :: IniFiles đang kén chọn định dạng. Nếu bất kỳ dòng nào không có dạng [section] hoặc key = val, chúng sẽ ném lỗi và có thể không nhận được băm, trong đó, ít nhất là trong Config :: Files, được điền vào đúng cách anyway.Nó sẽ là tốt đẹp để có một tùy chọn bỏ qua lỗi. Các tập tin tôi đang cố gắng để đọc có một số dòng M4 giả mạo trong đó, tôi có thể chạy qua m4 để loại bỏ, nhưng điều đó không cần thiết trong những gì tôi đang cố gắng thực hiện với tập lệnh cụ thể này.

0

đọc và chức năng cho ini tập tin chỉnh sửa viết:

sub iniRead 
{ 
    my $ini = $_[0]; 
    my $conf; 
    open (INI, "$ini") || die "Can't open $ini: $!\n"; 
    while (<INI>) { 
     chomp; 
     if (/^\s*\[\s*(.+?)\s*\]\s*$/) { 
      $section = $1; 
     } 

     if (/^\s*([^=]+?)\s*=\s*(.*?)\s*$/) { 
      $conf->{$section}->{$1} = $2;   
     } 
    } 
    close (INI); 
    return $conf; 
} 
sub iniWrite 
{ 
    my $ini = $_[0]; 
    my $conf = $_[1]; 
    my $contents = ''; 
foreach my $section (sort { (($b eq '_') <=> ($a eq '_')) || ($a cmp $b) } keys %$conf) { 
    my $block = $conf->{$section}; 
    $contents .= "\n" if length $contents; 
    $contents .= "[$section]\n" unless $section eq '_'; 
    foreach my $property (sort keys %$block) { 
     $contents .= "$property=$block->{$property}\n"; 
    } 
    } 
    open(CONF,"> $ini") or print("not open the file"); 
    print CONF $contents; 
    close CONF; 
} 

sử dụng mẫu:

đọc file conf và lưu vào băm

$conf = iniRead("/etc/samba/smb.conf"); 

thay đổi các thuộc tính cấu hình của bạn hoặc thêm cấu hình mới các thuộc tính

chỉnh sửa

$conf->{"global"}->{"workgroup"} = "WORKGROUP"; 

thêm cấu hình mới

$conf->{"www"}->{"path"}="/var/www/html"; 

lưu cấu hình mới của bạn để nộp

iniWrite("/etc/samba/smb.conf",$conf); 
+1

Tại sao tái tạo lại bánh xe? – Toto

+0

có lẽ nhà phát triển không truy cập được để cài đặt gói hoặc không định cấu hình hoặc sử dụng gói khác, sau đó sử dụng chức năng cho công việc. – mehrdad

Các vấn đề liên quan