阅读后如何使用YAML文件中的数据?

时间:2013-08-23 23:48:21

标签: perl 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中,使用newip值交换oldip值。但是,我很想知道如何使用它。如果我只打印加载的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

有人可以向我解释我需要做些什么才能从这个输入中读取值,以便我可以进行更改吗?

1 个答案:

答案 0 :(得分:10)

LoadFile返回hashref,而不是hash。 The difference is subtle but important.

您可以选择使用hashref:

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

或者你可以把它变成哈希:

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

只要您知道它是什么,您就可以随意处理引用。

您访问元素的方式略有不同:

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

您可能会注意到subs倾向于期望哈希引用而不是哈希值。这通常是人们第一次遇到它们的方式。