Шукати в цьому блозі

середа, 25 липня 2012 р.

Perl: сохраняем хэш (hash) в XML, считываем XML в хэш (hash)

Используем для этого модуль XML::Simple. Для дампа хэша используем Data::Dumper.
#!/usr/bin/perl

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
Имя XML-файла куда будем сохранять наш хэш:
my $conf_xml = 'serpol.xml';
Пример многоуровневого хэша:
my $routers = {
    "router0" => {
        user    => 'user0',
        password=> 'pass0',
        enable  => 'enab0',
        edgedev => {
            'switch00' => { type => "Cisco" },
            'switch01' => { type => "ExtremeNetworks" },
            'dslam0' => { type => "Alcatel 7324" }
        }
    },
    "router1" => {
        user    => 'user1',
        password=> 'pass1',
        enable  => 'enab1',
        edgedev => {
            'switch10' => { type => "Cisco" }
        }
    }
};
Вот таким вот образом мы сохраняем данные в XML-файл:
my $xml_os = XML::Simple->new();
open my $fh, '>:encoding(utf8)', $conf_xml or die "open($conf_xml): $!";
my $xml = $xml_os->XMLout( $routers,
    OutputFile => $fh,
    RootName => 'serpol',
    AttrIndent => 0,
    NoAttr => 0
);
close $fh;
undef $xml_os;
Вот, что у нас получилось:
<serpol>
  <router0 enable="enab0" password="pass0" user="user0">
    <edgedev name="dslam0" type="Alcatel 7324" />
    <edgedev name="switch00" type="Cisco" />
    <edgedev name="switch01" type="ExtremeNetworks" />
  </router0>
  <router1 enable="enab1" password="pass1" user="user1">
    <edgedev name="switch10" type="Cisco" />
  </router1>
</serpol>
А теперь прочитаем назад этот XML-файл в хэш:
my $xml_is = XML::Simple->new();
my $hash = $xml_is->XMLin( $conf_xml );
print Dumper( $hash );
undef $xml_is;
Дамп восстановленного хэша:
{
  'router1' => {
    'enable' => 'enab1',
    'password' => 'pass1',
    'user' => 'user1',
    'edgedev' => {
      'name' => 'switch10',
      'type' => 'Cisco'
    }
  },
  'router0' => {
    'enable' => 'enab0',
    'password' => 'pass0',
    'user' => 'user0',
    'edgedev' => {
      'dslam0' => {
        'type' => 'Alcatel 7324'
      },
      'switch01' => {
        'type' => 'ExtremeNetworks'
      },
      'switch00' => {
        'type' => 'Cisco'
      }
    }
  }
};

Немає коментарів: