2015-06-10 132 views
-2

我正在運行下面的腳本來查詢監視系統,我得到的結果是散列數組。訪問單個哈希和它們的元素的最佳方式是什麼?哈希操作陣列

use strict; 
use warnings; 

use YMS::Client::MonStatus; 
use Getopt::Long; 
use DBI::Dumper; 
use Data::Dumper; 
use YMS::Client::MonStatus::Filter; 

my $username = "username"; 
my $password = "passwd"; 
my $cluster = "aso"; 

#my $filter = YMS::Client::MonStatus::Filter(); 
my $client = YMS::Client::MonStatus->new($cluster); 
$client->verbose("on"); 
$client->byauth({username => $username, password => "$password"}); 
$client->yms_rotation("bot.ops.com:4080"); 
$client->debug("on"); 

my $filter = YMS::Client::MonStatus::Filter->new(); 
$filter->add("cluster", "=", "aso"); 
$filter->add("host", "in", "<hostname>"); 
#$filter->add("service", "=", "Prod-Deploy"); 
$filter->add("status", "=", "OK"); 
my %args = (
    "filters" => $filter, 
    "times" => { 
     "start" => "now - 4 hours", 
     "end" => "now" 
    }, 
); 
$client->filters($filter); 
#$client->saved_list(); 
$client->status_list(\%args); 

my @result = $client->output; 
my $field = scalar (@result); 

#print Dumper (@result); 
#my $ref = $result[0][0]->[0]; 
#print Dumper ($result[0][0]); 

print $field; 
for (my $i = 0; $i < $field; $i++) { 
    print $result[$i]{'notification_enabled'} ."\n"; 
} 

我查詢API的輸出如下。

$VAR1 = [ 
         { 
         'acknowledged' => 'N/A', 
         'check_type' => 'ACTIVE', 
         'current_attempt' => 1, 
         'deleted' => 0, 
         'dimensions' => { 
              'cluster' => '<cluster>', 
              'service' => '<servicename>', 
              'host' => 'hostfoobaar' 
             }, 
         'flapping' => 'N/A', 
         'frequency' => 0, 
         'hidden' => 0, 
         'last_ack_time' => 0, 
         'last_check_time' => 1432875229, 
         'last_comment_time' => 0, 
         'last_delete_time' => 1432875229, 
         'last_downtime_time' => 0, 
         'last_notif_time' => 0, 
         'last_state_change' => 1432875094, 
         'last_status_change' => 1432875094, 
         'max_attempt' => 1, 
         'msg_length' => 10, 
         'notification_enabled' => 'ENABLED', 
         'num_comments' => 0, 
         'quality_metric' => 0, 
         's_0' => 0, 
         's_1' => 0, 
         's_2' => 0, 
         's_3' => 0, 
         's_4' => 0, 
         's_5' => 0, 
         's_6' => 0, 
         's_7' => 0, 
         's_8' => 0, 
         's_9' => 0, 
         'scheduled_downtime' => 'NO', 
         'source' => '', 
         'state' => 'HARD', 
         'status' => 'OK', 
         'status_msg' => 'status ok', 
         'trap' => 1, 
         'ts_0' => 1432875229, 
         'ts_1' => 1432875094, 
         'ts_2' => 0, 
         'ts_3' => 0, 
         'ts_4' => 0, 
         'ts_5' => 0, 
         'ts_6' => 0, 
         'ts_7' => 0, 
         'ts_8' => 0, 
         'ts_9' => 0 
         } 
        ];` 

這裏是打印翻車機\輸出@Results

$VAR1 = [ 
      [ 
      { 
       'acknowledged' => 'N/A', 
       'check_type' => 'ACTIVE', 
       'current_attempt' => 1, 
       'deleted' => 0, 
       'dimensions' => { 
           'cluster' => 'aso', 
           'service' => 'system_launch', 
           'host' => 'hostfoobar' 
           }, 
       'flapping' => 'N/A', 
       'frequency' => 0, 
       'hidden' => 0, 
       'last_ack_time' => 0, 
       'last_check_time' => 1432875317, 
       'last_comment_time' => 0, 
       'last_delete_time' => 0, 
       'last_downtime_time' => 0, 
       'last_notif_time' => 0, 
       'last_state_change' => 1432875317, 
       'last_status_change' => 1432875317, 
       'max_attempt' => 1, 
       'msg_length' => 10, 
       'notification_enabled' => 'ENABLED', 
       'num_comments' => 0, 
       'quality_metric' => 0, 
       's_0' => 0, 
       's_1' => 0, 
       's_2' => 0, 
       's_3' => 0, 
       's_4' => 0, 
       's_5' => 0, 
       's_6' => 0, 
       's_7' => 0, 
       's_8' => 0, 
       's_9' => 0, 
       'scheduled_downtime' => 'NO', 
       'source' => '', 
       'state' => 'HARD', 
       'status' => 'OK', 
       'status_msg' => 'status ok', 
       'trap' => 1, 
       'ts_0' => 1432875317, 
       'ts_1' => 0, 
       'ts_2' => 0, 
       'ts_3' => 0, 
       'ts_4' => 0, 
       'ts_5' => 0, 
       'ts_6' => 0, 
       'ts_7' => 0, 
       'ts_8' => 0, 
       'ts_9' => 0 
      }, 
      { 
       'acknowledged' => 'N/A', 
       'check_type' => 'ACTIVE', 
       'current_attempt' => 1, 
       'deleted' => 0, 
       'dimensions' => { 
           'cluster' => 'cluster', 
           'service' => 'Prod-Deploy', 
           'host' => 'hostfoobar' 
           }, 
       'flapping' => 'N/A', 
       'frequency' => 0, 
       'hidden' => 0, 
       'last_ack_time' => 0, 
       'last_check_time' => 1432875229, 
       'last_comment_time' => 0, 
       'last_delete_time' => 1432875229, 
       'last_downtime_time' => 0, 
       'last_notif_time' => 0, 
       'last_state_change' => 1432875094, 
       'last_status_change' => 1432875094, 
       'max_attempt' => 1, 
       'msg_length' => 10, 
       'notification_enabled' => 'ENABLED', 
       'num_comments' => 0, 
       'quality_metric' => 0, 
       's_0' => 0, 
       's_1' => 0, 
       's_2' => 0, 
       's_3' => 0, 
       's_4' => 0, 
       's_5' => 0, 
       's_6' => 0, 
       's_7' => 0, 
       's_8' => 0, 
       's_9' => 0, 
       'scheduled_downtime' => 'NO', 
       'source' => '', 
       'state' => 'HARD', 
       'status' => 'OK', 
       'status_msg' => 'status ok', 
       'trap' => 1, 
       'ts_0' => 1432875229, 
       'ts_1' => 1432875094, 
       'ts_2' => 0, 
       'ts_3' => 0, 
       'ts_4' => 0, 
       'ts_5' => 0, 
       'ts_6' => 0, 
       'ts_7' => 0, 
       'ts_8' => 0, 
       'ts_9' => 0 
      }, 
      { 
       'acknowledged' => 'N/A', 
       'check_type' => 'ACTIVE', 
       'current_attempt' => 1, 
       'deleted' => 0, 
       'dimensions' => { 
           'cluster' => 'cluster', 
           'query' => 'foobar', 
           'service' => 'foobar', 
           'host' => 'hostfoobar' 
           }, 
       'flapping' => 'N/A', 
       'frequency' => 60, 
       'hidden' => 0, 
       'last_ack_time' => 1433949747, 
       'last_check_time' => 1433949867, 
       'last_comment_time' => 1421368592, 
       'last_delete_time' => 1433949867, 
       'last_downtime_time' => 1421376467, 
       'last_notif_time' => 1427825899, 
       'last_state_change' => 1407310478, 
       'last_status_change' => 1433949867, 
       'max_attempt' => 1, 
       'msg_length' => 172, 
       'notification_enabled' => 'ENABLED', 
       'num_comments' => 8, 
       'quality_metric' => 0, 
       's_0' => 0, 
       's_1' => 1, 
       's_2' => 0, 
       's_3' => 0, 
       's_4' => 0, 
       's_5' => 0, 
       's_6' => 0, 
       's_7' => 0, 
       's_8' => 0, 
       's_9' => 0, 
       'scheduled_downtime' => 'NO', 
       'source' => '', 
       'state' => 'HARD', 
       'status' => 'OK', 
       'status_msg' => 'UNKNOWN.', 
       'trap' => 0, 
       'ts_0' => 1433949867, 
       'ts_1' => 1433949747, 
       'ts_2' => 1433949687, 
       'ts_3' => 1433949627, 
       'ts_4' => 1433949567, 
       'ts_5' => 1433949507, 
       'ts_6' => 1433949447, 
       'ts_7' => 1433949387, 
       'ts_8' => 1433949327, 
       'ts_9' => 1433949267 
      }, 
      { 
       'acknowledged' => 'N/A', 
       'check_type' => 'ACTIVE', 
       'current_attempt' => 1, 
       'deleted' => 0, 
       'dimensions' => { 
           'cluster' => 'cluster', 
           'service' => 'Production_Deployment', 
           'host' => 'hostfoobar' 
           }, 
       'flapping' => 'N/A', 
       'frequency' => 0, 
       'hidden' => 0, 
       'last_ack_time' => 0, 
       'last_check_time' => 1432875270, 
       'last_comment_time' => 0, 
       'last_delete_time' => 0, 
       'last_downtime_time' => 0, 
       'last_notif_time' => 0, 
       'last_state_change' => 1432875270, 
       'last_status_change' => 1432875270, 
       'max_attempt' => 1, 
       'msg_length' => 10, 
       'notification_enabled' => 'ENABLED', 
       'num_comments' => 0, 
       'quality_metric' => 0, 
       's_0' => 0, 
       's_1' => 0, 
       's_2' => 0, 
       's_3' => 0, 
       's_4' => 0, 
       's_5' => 0, 
       's_6' => 0, 
       's_7' => 0, 
       's_8' => 0, 
       's_9' => 0, 
       'scheduled_downtime' => 'NO', 
       'source' => '', 
       'state' => 'HARD', 
       'status' => 'OK', 
       'status_msg' => 'status ok', 
       'trap' => 1, 
       'ts_0' => 1432875270, 
       'ts_1' => 0, 
       'ts_2' => 0, 
       'ts_3' => 0, 
       'ts_4' => 0, 
       'ts_5' => 0, 
       'ts_6' => 0, 
       'ts_7' => 0, 
       'ts_8' => 0, 
       'ts_9' => 0 
      } 
      ] 
     ]; 
+0

有很多方法。你所要求的太寬泛。你應該告訴你迄今爲止所嘗試的以及你的期望。 – shivams

+0

答案完全取決於你想要的。你寫的'for'循環有什麼問題? – Borodin

+0

當試圖去引用散列時,我得到下面的錯誤。假冒散列在./ymsclient.pl第44行棄用。 在./ymsclient.pl第44行不推薦使用僞哈希。 在./ymsclient.pl行的散列解引用中,參數「N/A」不是數字44. 錯誤的索引,同時強制將數組轉換爲./ymsclient.pl第44行的散列。 – Ani

回答

1

下面是一個腳本,顯示瞭如何將Perl的慣用方式遍歷一個循環。它不會比第三級更深,但它應該足以給你一些好點子。在while()循環中,它顯示瞭如何整體取消引用內部哈希,而不需要增加器,並顯示如何正確解引用和訪問結構中的各個項目。

編輯:我們發現OP實際上有一個散列數組的數組。代碼已更新。

#!/usr/bin/perl 

use warnings; 
use strict; 

my @aoh = (
      [ 
       { 
        1 => 'a', 
        2 => 'b', 
        3 => 'c', 
       }, 
       { 
        'z' => 26, 
        'd' => { 
          100 => '3rd level', 
          }, 
        'y' => 25, 
        'x' => 24, 
       }, 
      ], 
); 

for my $element (@aoh){ 

    for my $level_2_element (@{ $element }){ 

     while (my ($key, $value) = (each %{ $level_2_element })){ 
      if (ref($value) eq 'HASH'){ 
       while (my ($k, $v) = (each %{$value})){ 
        print "$key: -- $k: $v\n"; 

       } 
      } 
      else { 
       print "$key: $value\n"; 
      } 
     } 
    } 
} 

print "Element 0 0, key 1: $aoh[0]->[0]{1}\n"; 
print "Element 0 1, key x: $aoh[0]->[1]{x}\n"; 
+0

我試過了你的解決方案,我也嘗試過去參考你建議的方式,但都帶回了假散列錯誤僞散列在./ymsclient.pl第44行棄用。 參數「ENABLED」在散列元素中不是數字在./ymsclient.pl第44行。 錯誤的索引強制將數組轉換爲./ymsclient.pl第44行的散列值。 – Ani

+0

此處同樣的問題在我嘗試評論中的代碼片段時反覆出現。僞哈希在過時不推薦使用。 /ymsclient.pl第43行。 在./ymsclient.pl第43行不推薦使用僞哈希。 參數「N/A」在./ymsclient.pl第43行不是數字。 強制數組時錯誤的索引在./ymsclient.pl第43行輸入hash。 – Ani

+0

您最近的編輯也有同樣的問題,我使用perl,v5.8.6 在./ymsclient.pl行44不推薦使用僞哈希。 在./ymsclient.pl行44不推薦使用僞哈希。 參數「N/A」在./ymsclient.pl行中不是數字44. 錯誤的索引,同時強制將數組轉換爲./ymsclient.pl第44行的散列值。 – Ani