2017-10-18 44 views
1

我試圖將Linux上的網絡接口配置文件列表加載到散列哈希中,並將它們進一步編碼爲JSON。這是我使用的代碼:在perl中創建網絡接口配置文件列表中的散列哈希

#!/usr/bin/env perl 
use strict; 
use diagnostics; 
use JSON; 
use Data::Dumper qw(Dumper); 


opendir (DIR, "/etc/sysconfig/network-scripts/"); 
my @configs =grep(/^ifcfg-*/, readdir(DIR)); 
my $output = "metadata/json_no_comment"; 
my %configuration; 

my $key; 
my $value; 
my %temp_hash; 
foreach my $input (@configs) { 
    $input= "/var/tmp/rhel6.8/" . $input; 
    open (my $JH, '<', $input) or die "Cannot open the input file $!\n"; 
    while (<$JH>) { 
     s/#.*$//g; 
     next if /^\s*#/; 
     next if /^$/; 
     for my $field (split) { 
      ($key, $value) = split /\s*=\s*/, $field; 
      $temp_hash{$key} = $value; 
      } 
      $configuration{$input} = \%temp_hash; 
     } 
    close $JH; 
} 
print "-----------------------\n"; 
print Dumper \%configuration; 
print "-----------------------\n"; 

my $json = encode_json \%configuration; 
open (my $JNH, '>', $output) or die "Cannot open the output file $!\n"; 
    print $JNH $json; 
close $JNH; 

的數據結構,那我得到的是以下幾點:

$VAR1 = { 
      '/etc/sysconfig/network-scripts/ifcfg-lo' => { 
              'BOOTPROTO' => 'dhcp', 
              'NAME' => 'loopback', 
              'TYPE' => 'Ethernet', 
              'IPV6INIT' => 'yes', 
              'HWADDR' => '"52:54:00:65:e7:8c"', 
              'DEVICE' => 'lo', 
              'NETBOOT' => 'yes', 
              'NETMASK' => '255.0.0.0', 
              'BROADCAST' => '127.255.255.255', 
              'IPADDR' => '127.0.0.1', 
              'NETWORK' => '127.0.0.0', 
              'ONBOOT' => 'yes' 
             }, 
      '/etc/sysconfig/network-scripts/ifcfg-eth0' => $VAR1->{'/etc/sysconfig/network-scripts/ifcfg-lo'} 
     }; 

的數據結構,我要找的是以下內容:

$VAR1 = { 
      '/etc/sysconfig/network-scripts/ifcfg-lo' => { 
              'BOOTPROTO' => 'dhcp', 
              'NAME' => 'loopback', 
              'TYPE' => 'Ethernet', 
              'IPV6INIT' => 'yes', 
              'HWADDR' => '"52:54:00:65:e7:8c"', 
              'DEVICE' => 'lo', 
              'NETBOOT' => 'yes', 
              'NETMASK' => '255.0.0.0', 
              'BROADCAST' => '127.255.255.255', 
              'IPADDR' => '127.0.0.1', 
              'NETWORK' => '127.0.0.0', 
              'ONBOOT' => 'yes' 
             }, 
      '/etc/sysconfig/network-scripts/ifcfg-eth0' => { 
              'BOOTPROTO' => 'dhcp', 
              'NAME' => '"eth0"', 
              'TYPE' => 'Ethernet', 
              'IPV6INIT' => 'yes', 
              'HWADDR' => '"52:54:00:65:e7:8c"', 
              'NETBOOT' => 'yes', 
              'ONBOOT' => 'yes' 
             } 
}; 

任何想法我做錯了什麼?爲什麼第一個嵌套散列是正確創建的,第二個不是?我懷疑它與逐行讀取文件有關,但我必須這樣做,因爲我需要在JSON轉換之前過濾掉註釋行。 感謝您的幫助。

編輯:我修改了鮑羅廷建議的腳本,它的工作原理。謝謝!

+0

怎麼樣Sys :: HostIP,Net ::接口或從CPAN其他模塊?這對你有用嗎? – jira

+0

你建議的模塊是好的,但我想要更通用的解決方案。通過一些調整,我現在可以用JSON解析和編碼其他類型的配置文件,並使用不同的語法。無論如何感謝您的建議。 – Yakup

回答

1

問題是$configuration{$input}總是指相同的散列%temp_hash,因爲您已將其聲明爲文件級別。你需要通過聲明%temp_hashfor

還要注意的是next if /^\s*#/可沒有任何效果,因爲你只是刪除了該行的任何散列裏面會爲每個配置文件一個新的哈希值。你的衛生應該看起來像

s/#.*//; 
next unless /\S/;