2012-03-29 15 views
5

Tôi đang tạo một tập lệnh Perl cần đọc và nhận các giá trị của tệp INI.Perl: Lặp lại thông qua các tệp INI

INI File Format:

[name] 
Property=value 

Ví dụ:

[switch_6500] 
cpu=1.5.1.12.4 
free_memory=1.45.32.16 

[oracle_db_11g] 
param1=value1 
param2=value2 
param3=value3 
param4=value4 
... 

Như bạn có thể thấy, có thể được bất kỳ số lượng các bộ phận, có chứa bất kỳ số lượng các tham số. Tên của các tên/thông số phần sẽ luôn khác nhau.

Những gì tôi cần làm là tập lệnh Perl của tôi lặp qua từng phần và lấy tất cả tên/giá trị tham số của phần đó. Những gì tôi đang sử dụng để làm với các tập tin INI chỉ đơn giản là xác định tên phần cùng với tên của tham số như thế này:

#!/usr/bin/perl -w 

    use strict; 
    use warnings; 
    use Config::Tiny; 

    # Read the configuration file 
    my $Config = Config::Tiny->new(); 
    $Config = Config::Tiny->read('configfile.ini'); 
    my $Metric1_var = $Config->{switch_6500}->{cpu}; 
    my $Metric2_var = $Config->{switch_6500}->{free_memory}; 

Tuy nhiên, bây giờ mà tôi có một số lượng không xác định các mục tên/thông số, cũng vì không biết tên của họ, tôi dường như không thể tìm ra cách để trích xuất tất cả các giá trị. Tôi đã nhìn xung quanh mô-đun Config :: IniFiles, và nó có một số công cụ thú vị, nhưng tôi không thể tìm cách để có được một giá trị tham số mà không biết tên phần/tham số.

Nếu có ai có thể giúp tôi với việc lặp qua tệp INI này, nó sẽ được đánh giá cao.

Cảm ơn bạn.

Trả lời

6

Bạn có thể làm những gì bạn muốn với Config::Tiny. Đơn giản chỉ cần sử dụng keys chức năng để lặp qua tất cả các phím của băm, như sau:

use strict; 
use Config::Tiny; 

my $config = Config::Tiny->read('configfile.ini'); 

foreach my $section (keys %{$config}) { 
    print "[$section]\n"; 
    foreach my $parameter (keys %{$config->{$section}}) { 
     print "\t$parameter = $config->{$section}->{$parameter}\n"; 
    } 
} 

Lưu ý: Bởi vì băm là "băm", chứ không phải ra lệnh như mảng là, thứ tự của các phím trở lại có thể dường như vô nghĩa. Vì thứ tự không quan trọng trong một tệp INI (chỉ vị trí của các tham số nào trong phần nào quan trọng), điều này không phải là vấn đề.

+0

Cảm ơn rất nhiều, đây chính xác là những gì tôi đang tìm kiếm. – user1300922

5

Cá nhân tôi thích Config::Simple. Bạn có thể gọi nó là phương thức param() không có đối số nào để trả về tất cả các tham số từ tệp của bạn. Nó cũng có một vài tính năng đẹp khác trên Config::Tiny.

+0

+1 cho các dịch vụ CPAN. – Zaid

2

Tôi hiểu rằng bạn hài lòng với việc phân tích cú pháp các tệp ini. Nếu bạn chỉ muốn lặp qua tất cả các phần & các cặp khóa của chúng thì

Bạn có thể lặp qua Hash-Of-Hash như thế này.

foreach my $Section (keys %$Config) { 
print "[$Section]"; 
foreach my $Key (keys %{$Config->{$Section}}) { 
    print "$Key = $Config->{$Section}->{$Key}"; 
} 
} 
+0

Điều này hoạt động hoàn hảo. Cảm ơn bạn :) – user1300922