2013-08-23 44 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