Pregunta

Tengo un script en Perl que cuenta el número de ocurrencias de varias cadenas en un archivo de texto. Quiero poder comprobar si una determinada cadena aún no es una clave en el hash. ¿Hay una mejor manera de hacer esto por completo?

Esto es lo que estoy haciendo:

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

Solución

Creo que para comprobar si existe una clave en un hash que acaba de hacer

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

Otros consejos

No recomendaría el uso de if ($ hash {$ key}) ya que no hará lo que usted espera si la clave existe, pero su valor es cero o está vacío.

Bueno, su código completo puede limitarse a:

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

Si el valor no está allí, el operador ++ asumirá que es 0 (y luego incrementará a 1). Si ya está allí, simplemente se incrementará.

Supongo que este código debería responder a tu pregunta:

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

Salida:

three: 1
one: 1
two: 2

La iteración se puede simplificar para:

$hash{

Supongo que este código debería responder a tu pregunta:

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

Salida:

three: 1
one: 1
two: 2

La iteración se puede simplificar para:

$hash{

Supongo que este código debería responder a tu pregunta:

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

Salida:

three: 1
one: 1
two: 2

La iteración se puede simplificar para:

$hash{

Supongo que este código debería responder a tu pregunta:

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

Salida:

three: 1
one: 1
two: 2

La iteración se puede simplificar para:

<*>

(Ver $ _ en perlvar .) Y puede incluso escribe algo como esto:

<*>

Que informa de cada clave la primera vez que se encuentra.

}++ for (@keys);

(Ver $ _ en perlvar .) Y puede incluso escribe algo como esto:

<*>

Que informa de cada clave la primera vez que se encuentra.

}++ or print "Found new value:

Supongo que este código debería responder a tu pregunta:

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

Salida:

three: 1
one: 1
two: 2

La iteración se puede simplificar para:

$hash{

Supongo que este código debería responder a tu pregunta:

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

Salida:

three: 1
one: 1
two: 2

La iteración se puede simplificar para:

<*>

(Ver $ _ en perlvar .) Y puede incluso escribe algo como esto:

<*>

Que informa de cada clave la primera vez que se encuentra.

}++ for (@keys);

(Ver $ _ en perlvar .) Y puede incluso escribe algo como esto:

<*>

Que informa de cada clave la primera vez que se encuentra.

.\n" for (@keys);

(Ver $ _ en perlvar .) Y puede incluso escribe algo como esto:

<*>

Que informa de cada clave la primera vez que se encuentra.

}++ for (@keys);

(Ver $ _ en perlvar .) Y puede incluso escribe algo como esto:

<*>

Que informa de cada clave la primera vez que se encuentra.

Puedes ir con:

if(!$strings{$string}) ....
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top