вставить анонимный хеш в анонимный хеш для подсчета в цикле - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь сосчитать количество запусков и остановок некоторых служб, которые я отслеживаю в журналах.Я не собираюсь пропускать здесь весь код, но мой способ хеширования заключается в следующем: я передаю эти старты и остановки в анонимный хеш.Сначала я создаю анонимный хеш, заполненный ключами и значениями (в моем случае $ knot - это ключ, а нули - это значения).Затем я заменяю значения другим хешем.Мой код выглядит так:

foreach $knot (@knots){ 
        chomp $knot;
        $variable = $variable."$knot;0;";

        $Services = {split(/;/,$variable)};
}

 my $data =
    {
            Starts=>'0',
            Stops=>'0',
    };  

foreach my $key (keys %$Services) {
           $Services->{$key} = $data; 
}
print Dumper $Services;

Печать показывает:

$VAR1 = {
      ' knot1' => {
                      'Stops' => '0',
                      'Starts' => '0'
                    },
      ' knot2' => $VAR1->{' knot1'},
      ' knot3' => $VAR1->{' knot1'},
      ' knot4' => $VAR1->{' knot1'},
      ' knot5' => $VAR1->{' knot1'},

и так далее.Есть ли лучший способ сделать это?Мой путь, если я прав, плохо написан, потому что изменение узла1 запускает / останавливает изменения всех остальных значений узла.

1 Ответ

0 голосов
/ 16 ноября 2018

Подсчет очень прост в Perl, благодаря Autovivification. Вы можете просто создавать анонимные структуры данных на лету, например:

use Data::Dumper;

my %hash = ();

$hash{apple}{green}++;
$hash{apple}{red}  ++;
$hash{pear}{yellow}++;
$hash{apple}{green}++;
$hash{apple}{red}  ++;
$hash{apple}{green}++;

print Dumper(\%hash);

Это даст желаемую структуру для подсчета:

$VAR1 = {
          'apple' => {
                       'green' => 3,
                       'red' => 2
                     },
          'pear' => {
                      'yellow' => 1
                    }
        };

Это также работает в циклах с использованием переменных (здесь используется ссылка на хеш):

my $hash_ref = {};
for my $fruit (qw( apple pear apple peach apple pear )) {
    $hash_ref->{$fruit}++;
}
print Dumper($hash_ref);

в результате:

$VAR1 = {
          'peach' => 1,
          'pear' => 2,
          'apple' => 3
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...