Как определить, сколько раз я добавляю что-то к вложенному хешу? - PullRequest
1 голос
/ 03 февраля 2011

Я работаю с набором данных, который потребует от меня прибегнуть к некоторому типу ООП, я думаю. У меня нет большого опыта с этим. По сути, я анализирую данные в цикле foreach и добавляю результаты в хеш.

Будет только около 8 различных значений, по крайней мере, на данный момент, но несколько «совпадений» этих значений. Допустим, я создаю значение color=>white. Что ж, color=>white снова появится, и когда я добавлю его в хеш, он просто перезапишет существующий color=>white.

Я надеюсь определить, сколько раз я добавляю color=>white. Теперь, очевидно, есть простой, тупой способ сделать это - какой-то переключатель, тестирующий различные условия. Только вещи динамичны. Вещи иногда меняются. Поэтому мне нужно иметь возможность справиться с этим без постоянного изменения сценария.

Таким образом, в идеале, в конце концов, я бы смог проверить хеш для каждого ключа / значения и посмотреть, сколько раз оно происходило, не имея представления, какой ключ / значение я ищу.

У кого-нибудь есть совет?

Ответы [ 2 ]

3 голосов
/ 03 февраля 2011

Вы можете использовать многоуровневый хеш, где первый уровень - это имя атрибута, следующий уровень - это значение, а значение этого - количество.

my @data = qw(
    color white
    color blue
    color white
    size  10
    size  20
    size  10
    color yellow
    color blue
    color white
);

my %hash;
while (@data) {
    my ($key, $value) = splice @data, 0, 2;
    $hash{$key}{$value}++;
}

for my $key (keys %hash) {
    for my $value (keys %{$hash{$key}}) {
        print "'$key' was '$value' $hash{$key}{$value} times\n"
    }
}

, которое печатает:

'color' was 'white' 3 times
'color' was 'blue' 2 times
'color' was 'yellow' 1 times
'size' was '10' 2 times
'size' was '20' 1 times
2 голосов
/ 03 февраля 2011

В Perl есть этот метод для эмуляции многоуровневых ассоциативных массивов с использованием одного хэша.Он унаследован от AWK, является древним и ущербным, и вы не должны его использовать ... но это все равно интересно.

my %hash;

while (<DATA>) {
    my ($key, @values) = split;
    $hash{$key, $_}++ for @values;
}

while (my ($keys, $count) = each %hash) {
    my ($key, $value) = split /\Q$;/, $keys;
    print "$key => $value => $count\n";
}

__DATA__
color white blue red green
size small medium
color red orange purple
size medium large

Создает что-то вроде

color => blue => 1
color => green => 1
color => orange => 1
color => purple => 1
color => red => 2
color => white => 1
size => large => 1
size => medium => 2
size => small => 1

, хотя порядок хешированиянепредсказуемо.

См. ответ Эрика Строма (и прочитайте perldoc perllol и perldoc perldsc ) для современного и лучшего решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...