2017-10-18 23 views
1

Linux上のネットワークインターフェイス設定ファイルのリストをハッシュのハッシュにロードし、さらにそれらをJSONにエンコードしようとしています。perlのネットワークインターフェイス設定ファイルのリストからハッシュのハッシュを作成

$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'} 
     }; 

データ構造は、私が探している以下の通りです::私は、次のされそうだということは、

#!/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' => { 
              'BOOTPROTO' => 'dhcp', 
              'NAME' => '"eth0"', 
              'TYPE' => 'Ethernet', 
              'IPV6INIT' => 'yes', 
              'HWADDR' => '"52:54:00:65:e7:8c"', 
              'NETBOOT' => 'yes', 
              'ONBOOT' => 'yes' 
             } 
}; 

私は間違っていますか?最初のネストされたハッシュが正しく作成され、2番目のネストされたハッシュがなぜ正しくないのですか?私は、それが行ごとにファイルを読み込むことと関係があると思うが、JSON変換の前にコメント行をフィルタリングする必要があるので、それを行う必要がある。 ありがとうございました。

編集:私はBorodinの提案に従ってスクリプトを修正しています。ありがとう!

+0

Sys :: HostIP、Net :: InterfaceまたはCPANの他のモジュールはどうなっていますか?それはあなたのために働くだろうか? – jira

+0

あなたが提案するモジュールは良いですが、私はもっと一般的な解決策が必要でした。いくつかの調整をすると、JSONで別の構文の設定ファイルも解析してエンコードできます。とにかくアドバイスをありがとう。 – Yakup

答えて

1

$configuration{$input}はファイルレベルで宣言しているため、常に同じハッシュ%temp_hashを参照しています。あなたは

はまた、あなただけの行のいずれかのハッシュを削除したためnext if /^\s*#/は効果がないことに注意してくださいforループ内%temp_hashを宣言することで、各設定ファイルの新しいハッシュを作成する必要があります。あなたのサニタリゼーションは次のようになります

s/#.*//; 
next unless /\S/; 
関連する問題