Question

J'ai un script Perl qui compte le nombre d'occurrences de différentes chaînes dans un fichier texte. Je veux pouvoir vérifier si une certaine chaîne n'est pas encore une clé dans le hachage. Existe-t-il un meilleur moyen de le faire?

Voici ce que je fais:

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;
        }
    }
}
Était-ce utile?

La solution

Je crois que pour vérifier si une clé existe dans un hachage que vous venez de faire

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

Autres conseils

Je vous déconseille d'utiliser si ($ hash {$ key}) car il ne fera pas ce que vous attendez si la clé existe mais que sa valeur est zéro ou vide.

Eh bien, tout votre code peut être limité à:

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

Si la valeur n'est pas présente, l'opérateur ++ suppose qu'elle est égale à 0 (puis incrémentée à 1). Si elle existe déjà, elle sera simplement incrémentée.

Je suppose que ce code devrait répondre à votre question:

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

Sortie:

three: 1
one: 1
two: 2

L'itération peut être simplifiée comme suit:

$hash{

Je suppose que ce code devrait répondre à votre question:

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

Sortie:

three: 1
one: 1
two: 2

L'itération peut être simplifiée comme suit:

$hash{

Je suppose que ce code devrait répondre à votre question:

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

Sortie:

three: 1
one: 1
two: 2

L'itération peut être simplifiée comme suit:

$hash{

Je suppose que ce code devrait répondre à votre question:

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

Sortie:

three: 1
one: 1
two: 2

L'itération peut être simplifiée comme suit:

<*>

(Voir $ _ dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:

<*>

Qui signale chaque clé la première fois qu'elle est trouvée.

}++ for (@keys);

(Voir $ _ dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:

<*>

Qui signale chaque clé la première fois qu'elle est trouvée.

}++ or print "Found new value:

Je suppose que ce code devrait répondre à votre question:

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

Sortie:

three: 1
one: 1
two: 2

L'itération peut être simplifiée comme suit:

$hash{

Je suppose que ce code devrait répondre à votre question:

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

Sortie:

three: 1
one: 1
two: 2

L'itération peut être simplifiée comme suit:

<*>

(Voir $ _ dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:

<*>

Qui signale chaque clé la première fois qu'elle est trouvée.

}++ for (@keys);

(Voir $ _ dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:

<*>

Qui signale chaque clé la première fois qu'elle est trouvée.

.\n" for (@keys);

(Voir $ _ dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:

<*>

Qui signale chaque clé la première fois qu'elle est trouvée.

}++ for (@keys);

(Voir $ _ dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:

<*>

Qui signale chaque clé la première fois qu'elle est trouvée.

Vous pouvez simplement aller avec:

if(!$strings{$string}) ....
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top