Pergunta

Eu tenho um script Perl que está contando o número de ocorrências de várias cordas em um arquivo de texto. Eu quero ser capaz de verificar se uma determinada seqüência ainda não é uma chave no hash. Existe uma melhor maneira de fazer isso por completo?

Aqui está o que eu estou fazendo:

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;
        }
    }
}
Foi útil?

Solução

Eu acredito que para verificar se existe uma chave em um hash você acabou de fazer

if (exists $strings{$string}) {
    ...
} else {
    ...
}

Outras dicas

Gostaria de aconselhar contra o uso if ($hash{$key}) uma vez que não vai fazer o que você espera se a chave existe, mas o seu valor é zero ou vazio.

Bem, o código inteiro pode ser limitado a:

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

Se o valor não estiver lá, ++ operador assumirá que ele seja 0 (e, em seguida, incrementar a 1). Se ele já está lá -. Ele vai simplesmente ser incrementado

Eu acho que esse código deve responder a sua pergunta:

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";
}

Output:

three: 1
one: 1
two: 2

A iteração pode ser simplificada para:

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

(Veja $_ em perlvar .) E você pode algo até escrever assim:

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

Que relatórios cada tecla a primeira vez que ele é encontrado.

Você pode simplesmente ir com:

if(!$strings{$string}) ....
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top