2013-08-23 48 views
2

我正在从YAML文件读取数据(使用YAML qw/LoadFile /)。我需要能够读取这些值并将它们插入到其他文件中。阅读后如何使用YAML文件中的数据?

的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 ::自卸车,我得到以下($数据::自卸车::简洁启用):

{ 
    '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 

有人能向我解释什么,我需要做的,能够从该输入读取的值,所以我可以做我所需要的变化做?

+0

你可能想看看[perlreftut](http://perldoc.perl.org/perlreftut.html“perldoc perlreftut”)和[perlref](http://perldoc.perl.org/perlref.html“ perldoc perlref“)。 –

回答

9

LoadFile正在返回一个hashref,而不是一个散列。 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 

您可能会注意到潜艇往往期望散列的引用,而不是散列,有时。通常人们首先会遇到他们。

+0

我似乎已经掌握了它。看起来,每个级别都是对数组或另一个散列的另一个引用。到目前为止,我已经能够通过解构引用越来越多的数据结构,因为我深入研究了它。 – theillien