57

我有一个 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;
        }
    }
}
4

5 回答 5

119

我相信检查您刚刚执行的哈希中是否存在密钥

if (exists $strings{$string}) {
    ...
} else {
    ...
}
于 2009-06-16T20:05:53.190 回答
10

我建议不要使用if ($hash{$key}),因为如果密钥存在但它的值为零或为空,它不会做你期望的事情。

于 2009-06-16T21:29:52.177 回答
9

好吧,您的整个代码可以限制为:

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

如果该值不存在,++ 运算符将假定它为 0(然后递增到 1)。如果它已经存在 - 它只会增加。

于 2009-06-16T21:01:47.133 回答
6

我想这段代码应该回答你的问题:

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);

它会在第一次找到每个键时报告它。

于 2009-06-16T20:05:54.593 回答
-1

你可以去:

if(!$strings{$string}) ....
于 2009-06-16T20:06:50.613 回答