从perl中的网络接口配置文件列表创建哈希哈希

时间:2017-10-18 16:49:58

标签: json perl hash

我试图将Linux上的网络接口配置文件列表加载到哈希哈希中,并进一步将它们编码为JSON。这是我正在使用的代码:

#!/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转换之前过滤掉注释行。 谢谢你的帮助。

编辑:我已按照Borodin的建议修改了脚本,但它确实有效。谢谢!

1 个答案:

答案 0 :(得分:1)

问题是$configuration{$input}始终引用相同的哈希%temp_hash,因为您已在文件级别声明它。您需要在%temp_hash循环中声明for

为每个配置文件创建新的哈希值

另请注意,next if /^\s*#/无效,因为您刚刚删除了该行中的任何哈希值。您的卫生处理看起来应该是

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