Поиск значений из массива в хэш-ключе и возврат отсчетов нуля - PullRequest
0 голосов
/ 13 октября 2018

У меня есть один массив, который я проверяю для значений в хэше (который я создал).Идея состоит в том, чтобы проверить каждый элемент массива, если он существует в хеш-ключах.Если он не существует, следует сказать, что несуществующий элемент появляется ноль раз.Хеш, который я создал, чтобы посчитать частоту чисел во втором массиве.

Вот что я сделал:

use strict;
use warnings;

sub main {

    my @Source = ("A", "B", "D");
    my @ArrToHash = ("A", "C", "A", "B", "E", "F");

    my %hashy;
    ++$hashy{$_} for @ArrToHash;

    foreach my $e (@Source) {
        if (exists $hashy{$e}) {
            print "$e are $hashy{$e}\n";
        }
    }
}
main();

Я получаю

A 2

B 1

В то время как на самом деле я хотел бы:

A - 2

B - 1

D - 0

AnyПодсказка?Как исправить мой код?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018
    if (exists $hashy{$e}) {
        print "$e are $hashy{$e}\n";
    }else{
        print "$e are 0\n";
    }

ИЛИ

    printf "%s are %d\n", $e, $hashy{$e} // 0 ; 

Комментарий:
Я предпочитаю $hashy{$e} // 0.Он возвращает $hashy{$e}, если $hashy{$e} выходит и не является неопределенным.
Икегами предпочитает $hashy{$e} || 0.Возвращает 0 также, когда $hashy{$e} является пустой строкой.Он работает со старыми версиями Perl без поддержки оператора //.
IMHO В большинстве ситуаций это вопрос "руководства по стилю".

0 голосов
/ 13 октября 2018
if (exists $hashy{$e}) {
    print "$e are $hashy{$e}\n";
} else {
    print "$e are 0\n";
}

или просто

printf "%s are %s\n", $e, $hashy{$e} || 0;

Если вы действительно хотите, чтобы в хэше были нули,

my %hashy;
$hashy{$_} = 0 for @Source;
++$hashy{$_} for @ArrToHash;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...