Ответ 1
Я считаю, что проверить, существует ли ключ в хеше, который вы только что делаете
if (exists $strings{$string}) {
...
} else {
...
}
У меня есть Perl script, который подсчитывает количество вхождений различных строк в текстовом файле. Я хочу, чтобы проверить, не является ли определенная строка еще не ключом в хеше. Есть ли лучший способ сделать это вообще?
Вот что я делаю:
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;
}
}
}
Я считаю, что проверить, существует ли ключ в хеше, который вы только что делаете
if (exists $strings{$string}) {
...
} else {
...
}
Ну, весь ваш код может быть ограничен:
foreach $line (@lines){
$strings{$1}++ if $line =~ m|my regex|;
}
Если значение не существует, оператор ++ будет считать, что он равен 0 (а затем увеличивается до 1). Если он уже существует, он просто будет увеличен.
Я бы советовал не использовать if ($hash{$key})
, поскольку он не будет делать то, что вы ожидаете, если ключ существует, но его значение равно нулю или пустое.
Я думаю, что этот код должен ответить на ваш вопрос:
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);
Кто сообщает каждый ключ при первом обнаружении.
Вы можете просто пойти с:
if(!$strings{$string}) ....