Как использовать данные из файла YAML после его прочтения?

Я читаю данные из файла YAML (используйте YAML qw / LoadFile /). Мне нужно иметь возможность читать значения и вставлять их в другие файлы.

Файл YAML имеет следующий формат:

--- 
host:
  - name: first_host
    interface:
      - name: eth0
        oldip: 1.2.3.4
        newip: 2.3.4.5
        oldgw: 1.2.3.1
        newgw: 2.3.4.1
      - name: eth1
        oldip: 1.2.3.4
        newip: 2.3.4.5
        oldgw: 1.2.3.1
        newgw: 2.3.4.1
      - name: eth2
        oldip: 1.2.3.4
        newip: 2.3.4.5
        oldgw: 1.2.3.1
        newgw: 2.3.4.1

Если я запускаю это через Data :: Dumper, я получаю следующее ($ Data :: Dumper :: Terse включен):

{
  'host' => [
            {
              'interface' => [
                             {
                               'oldgw' => '1.2.3.1',
                               'newgw' => '2.3.4.1',
                               'name' => 'eth0',
                               'newip' => '2.3.4.5',
                               'oldip' => '1.2.3.4'
                             },
                             {
                               'oldgw' => '1.2.3.1',
                               'newgw' => '2.3.4.1',
                               'name' => 'eth1',
                               'newip' => '2.3.4.5',
                               'oldip' => '1.2.3.4'
                             },
                             {
                               'oldgw' => '1.2.3.1',
                               'newgw' => '2.3.4.1',
                               'name' => 'eth2',
                               'newip' => '2.3.4.5',
                               'oldip' => '1.2.3.4'
                             }
                           ],
              'name' => 'first_host'
            },
            ]
}

Мне нужно внести изменения, например, в / etc / sysconfig / network-scripts / ifcfg-eth0, заменив значение oldip на значение newip. Однако я не понимаю, как его использовать. Если я просто напечатаю значение загруженного файла YAML, оно окажется не чем иным, как хеш-ссылкой. Но если я попытаюсь разыменовать хеш, я получу следующее:

Reference found where even-sized list expected

Далее следует ссылка на хэш.

Это сценарий, с которого я начинаю:

#!/usr/bin/perl

use strict;
use warnings;
use YAML qw(LoadFile);
use Data::Dumper;
$Data::Dumper::Terse = 1;

my %data = LoadFile("/home/user/bin/perl/dummy_data.yml");

print \%data

Может ли кто-нибудь объяснить мне, что мне нужно сделать, чтобы иметь возможность читать значения из этого ввода, чтобы я мог внести необходимые изменения?


person theillien    schedule 23.08.2013    source источник
comment
Вы можете посмотреть perlreftut и perlref.   -  person Brad Gilbert    schedule 25.08.2013


Ответы (1)


LoadFile возвращает хеш-ссылку, а не хеш. Разница небольшая, но важная.

У вас есть возможность использовать хэш-ссылку как есть:

my $data = LoadFile("data.yml");
print $data;

Или вы можете преобразовать его в хеш:

my %data = %{ LoadFile("data.yml") };
print %data;

Вы можете обрабатывать ссылку, как хотите, лишь бы вы знали, что это такое.

Вы получаете доступ к элементам немного по-другому:

$data{'foo'}   #hash %data
$data->{'foo'} #hashref $data

Вы можете заметить, что подпрограммы иногда ожидают ссылки на хеш вместо хешей. Обычно люди впервые сталкиваются с ними именно так.

person rutter    schedule 23.08.2013
comment
Кажется, я уже разбираюсь в этом. Похоже, что каждый уровень - это еще одна ссылка либо на массив, либо на другой хэш. До сих пор мне удавалось распечатывать все больше и больше структур данных путем разыменования их по мере того, как я углубляюсь в это. - person theillien; 24.08.2013