2014-03-19 71 views
3

我有一個哈希陣列和一個YAML,它是從linux命令中提取的。我有另一個哈希數組,具有相同的YAML集,但具有不同的值,由相同的命令(稍後運行)執行。2個哈希陣列之間的算術運算

例如,

content.none: 
    bytes: 31046 
content.image.gif: 
    bytes: 0 

content.none: 
    bytes: 31050 
content.image.gif: 
    bytes: 0 

現在,我要尋找的值之間的數學運算。我正在尋找一個輸出

content.none: 
    bytes: 4 
content.image.gif: 
    bytes: 0 

這是散列中相應值之間的數學結果。

我試着迭代和做差異,但它看起來像一個累積輸出。

%host_stat_new=New stats 
%host_stat_old=Old stats (taken from stats.yml, which contains old data) 
while (true){ 
open my $FH1, ">stats.yml" or die "cannot write to stat file because $!\n"; 
foreach my $line4 (keys %host_stat_new){ 
     print $FH1 "$line4:\n"; 
     foreach my $line5 (keys %{$host_stat_new{$line4}}) { 
       print $FH1 " $line5: \n"; 
       foreach my $line6 (keys %{$host_stat_new{$line4}{$line5}}){ 
       my $diff1 = $host_stat_new{$line4}{$line5}{$line6}; 
       my $diff2 = $host_stat_old{$line4}{$line5}{$line6}; 


$math=$diff1-$diff2; 
#$host_stat1{$line4}{$line5}{$line6} = $math; 
$host_stat_new{$line4}{$line5}{$line6} = $math; 
        print $FH1 " $line6: $host_stat_new{$line4}{$line5}{$line6}\n"; 
        } 
      } 


    } 
} 

我在做什麼錯在這裏?有沒有可以做到這一點的模塊?

+0

會發生什麼?預期的輸出是什麼,輸出是什麼?你可以在'%host_stat_old'和'new'上使用Data :: Dumper,這樣我們就可以看到這個哈希是如何填充的?你是否使用嚴格控制和使用警告? – DeVadder

+0

輸出在第一次是作爲差異,但從第二次迭代起,它會以累積的形式出現。是的,使用嚴格和警告。 – nohup

回答

3

只需使用一些很好的遞歸來獲得差異。此功能假定數據結構是相同的,可以增加功能,以確認:

use YAML; 

use strict; 
use warnings; 

my $str1 = <<YAML_STRING1; 
content.none: 
    bytes: 31046 
content.image.gif: 
    bytes: 0 
YAML_STRING1 

my $str2 = <<YAML_STRING2; 
content.none: 
    bytes: 31050 
content.image.gif: 
    bytes: 0 
YAML_STRING2 

my $data1 = Load($str1); 
my $data2 = Load($str2); 

my $diff = diff_recurse($data2, $data1); 

print Dump($diff); 

sub diff_recurse { 
    my ($str1, $str2) = @_; 

    my $diff; 

    if ('HASH' eq ref $str1) { 
     $diff = {}; 
     for my $key (keys %$str1) { 
      $diff->{$key} = diff_recurse($str1->{$key}, $str2->{$key}); 
     } 

    } elsif ('ARRAY' eq ref $str1) { 
     $diff = []; 
     for my $i (0..$#$str1) { 
      $diff->[$i] = diff_recurse($str1->[$i], $str2->[$i]); 
     } 

    } elsif (my $unknown = ref $str1) { 
     die "Unknown type $unknown\n"; 

    } elsif ($str1 =~ /^[\d\.]+$/) { 
     $diff = $str1 - $str2; 
    } else { 
     $diff = $str1; 
    } 

    return $diff; 
} 

輸出

--- 
content.image.gif: 
    bytes: 0 
content.none: 
    bytes: 4 
+0

有道理。感謝米勒。 – nohup