Как я могу узнать, есть ли у хэша Perl определенный ключ? - PullRequest
51 голосов
/ 16 июня 2009

У меня есть скрипт Perl, который подсчитывает количество вхождений различных строк в текстовом файле. Я хочу иметь возможность проверить, является ли определенная строка еще не ключом в хэше. Есть ли лучший способ сделать это вообще?

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

foreach $line (@lines){
    if(($line =~ m|my regex|) )
    {
        $string = $1;
        if ($string is not a key in %strings) # "strings" is an associative array
        {
            $strings{$string} = 1;
        }
        else
        {
            $n = ($strings{$string});
            $strings{$string} = $n +1;
        }
    }
}

Ответы [ 5 ]

110 голосов
/ 17 июня 2009

Я считаю, чтобы проверить, существует ли ключ в хэше, который вы просто делаете

if (exists $strings{$string}) {
    ...
} else {
    ...
}
11 голосов
/ 17 июня 2009

Я бы посоветовал не использовать if ($hash{$key}), поскольку он не будет выполнять то, что вы ожидаете, если ключ существует, но его значение равно нулю или пусто.

9 голосов
/ 17 июня 2009

Ну, весь ваш код может быть ограничен:

foreach $line (@lines){
        $strings{$1}++ if $line =~ m|my regex|;
}

Если значение отсутствует, оператор ++ примет его равным 0 (а затем увеличит до 1). Если он уже есть - он будет просто увеличен.

6 голосов
/ 17 июня 2009

Я думаю, что этот код должен ответить на ваш вопрос:

use strict;
use warnings;

my @keys = qw/one two three two/;
my %hash;
for my $key (@keys)
{
    $hash{$key}++;
}

for my $key (keys %hash)
{
   print "$key: ", $hash{$key}, "\n";
}

Выход:

three: 1
one: 1
two: 2

Итерация может быть упрощена до:

$hash{$_}++ for (@keys);

(См. $_ в perlvar .) И вы даже можете написать что-то вроде этого:

$hash{$_}++ or print "Found new value: $_.\n" for (@keys);

Который сообщает о каждом ключе в первый раз, когда он найден.

0 голосов
/ 17 июня 2009

Вы можете просто пойти с:

if(!$strings{$string}) ....
...