Perl: как сопоставить массив с вложенным хешем - PullRequest
0 голосов
/ 13 июля 2011

Учитывая хеш:

my %stats_info = (
  "2010-10-31T23:30:00",
  [
    ["ASBG_#_Mp_at_bsNo-25_#_sbgMpNoOfSessionSetupAttempts",3290387,],
    ["ASBG_#_Mp_at_bsNo-25_#_sbgMpNoOfMediaStreams", 508],
    ["BSBG_#_Mp_at_bsNo-35_#_sbgMpNoOfSessionSetupAttempts",3289764,],
    ["BSBG_#_Mp_at_bsNo-35_#_sbgMpNoOfMediaStreams", 496],
    ["ASBG_#_Mp_at_bsNo-35_#_sbgMpNoOfSessionSetupAttempts",3289764,],
    ["ASBG_#_Mp_at_bsNo-35_#_sbgMpNoOfMediaStreams", 496],
    ["BSBG_#_Mp_at_bsNo-25_#_sbgMpNoOfSessionSetupAttempts",3290387,],
    ["BSBG_#_Mp_at_bsNo-25_#_sbgMpNoOfMediaStreams", 508],
  ],
  "2010-10-31T23:15:00",
  [
    ["ASBG_#_Mp_at_bsNo-25_#_sbgMpNoOfSessionSetupAttempts",3288736,],
    ["ASBG_#_Mp_at_bsNo-25_#_sbgMpNoOfMediaStreams", 610],
    ["ASBG_#_Mp_at_bsNo-35_#_sbgMpNoOfSessionSetupAttempts",3288113,],
    ["ASBG_#_Mp_at_bsNo-35_#_sbgMpNoOfMediaStreams", 619],
    ["BSBG_#_Mp_at_bsNo-35_#_sbgMpNoOfSessionSetupAttempts",3288113,],
    ["BSBG_#_Mp_at_bsNo-35_#_sbgMpNoOfMediaStreams", 619],
    ["BSBG_#_Mp_at_bsNo-25_#_sbgMpNoOfSessionSetupAttempts",3288736,],
    ["BSBG_#_Mp_at_bsNo-25_#_sbgMpNoOfMediaStreams", 610],
  ],
  "2010-10-31T23:45:00",
  [
    ["BSBG_#_Mp_at_bsNo-25_#_sbgMpNoOfSessionSetupAttempts",3291863,],
    ["BSBG_#_Mp_at_bsNo-25_#_sbgMpNoOfMediaStreams", 445],
    ["ASBG_#_Mp_at_bsNo-35_#_sbgMpNoOfSessionSetupAttempts",3291239,],
    ["ASBG_#_Mp_at_bsNo-35_#_sbgMpNoOfMediaStreams", 449],
    ["ASBG_#_Mp_at_bsNo-25_#_sbgMpNoOfSessionSetupAttempts",3291863,],
    ["ASBG_#_Mp_at_bsNo-25_#_sbgMpNoOfMediaStreams", 445],
    ["BSBG_#_Mp_at_bsNo-35_#_sbgMpNoOfSessionSetupAttempts",3291239,],
    ["BSBG_#_Mp_at_bsNo-35_#_sbgMpNoOfMediaStreams", 449],
  ],
) ;

и отсортированный массив ключей:

my @timeline = ("2010-10-31T23:15:00", "2010-10-31T23:30:00", "2010-10-31T23:45:00",) ;

и полезный ответ на подобный вопрос

Мой ВОПРОС:

  • Как сделать, например, "BSBG _ # _ Mp_at_bsNo-35 _ # _ sbgMpNoOfMediaStreams" ключом к "449"?

Вот как я могу получить доступ к оригинальному хешу:

foreach my $t (@timeline)   
{ 
    my $i=0 ; 
    while( exists($stats_info{$t}[$i]) )    
    { 
        # counter: $stats_info{$t}[$i][0] , quantify: $stats_info{$t}[$i][1] ; 
        $i = $i+1 ; 
    } 
}

На данный момент дело в том, что пара (counter, quantify) является массивом, и я хотел бы сделать эту пару counter => quantify (hash) внутри $ stats_info {$ t}

1 Ответ

4 голосов
/ 13 июля 2011
for my $key (@timeline) {
 my %newhash = ();
 for my $pair (@{$stats_info{$key}}) {
  my($k, $v) = @$pair;
  $newhash{$k} = $v;
 }
 $stats_info{$key} = { %newhash };
}

или даже:

for my $key (keys %stats_info) {
 $stats_info{$key} = { map { @$_ } @{$stats_info{$key}} };
}
...