• Publicidad

Problema con hash

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con hash

Notapor natxo » 2008-09-21 08:17 @387

Tengo este hash:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %abbreviation_of = (
        'value addedd tax'                      => 'vat',
        'belasting over de toegevoedge waarde'  => 'btw',
        'impuesto sobre el valor añadido'       => 'iva',
        );
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y si lo recorro con each() funciona como quiero:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ((my $key, my $value) = each(%abbreviation_of)) {
    print "$key\t$value\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora bien, si hago esto otro:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "$abbreviation_of{value added tax}\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y lo ejecuto entonces tengo este fallo:

Código: Seleccionar todo
Bareword "tax" not allowed while "strict subs" in use at cascade.pl line 18.
Execution of cascade.pl aborted due to compilation errors.


Aquí todo el código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;
use warnings;

my $input = shift;

my %abbreviation_of = (
        'value addedd tax'                      => 'vat',
        'belasting over de toegevoedge waarde'  => 'btw',
        'impuesto sobre el valor añadido'       => 'iva',
        );

while ((my $key, my $value) = each(%abbreviation_of)) {
    print "$key\t$value\n";
}

print "$abbreviation_of{value added tax}\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Alguna idea de por qué falla? He probado con comillas simples, dobles, sin comillas, ..., se me acabaron las ideas.
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Publicidad

Notapor explorer » 2008-09-21 08:45 @406

Sí, debes entrecomillar la clave, pero... ahí no está el problema...

El problema está en que has puesto una 'd' demás en la palabra 'added' en %abbreviation_of.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor natxo » 2008-09-21 08:50 @410

aggggggh :shock:

Disculpen las molestias provocadas por mis dedos gordos.
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Notapor explorer » 2008-09-21 09:47 @449

Tranquilo, este es uno de los errores más difíciles de detectar al escribir en Perl. Debido a la autovivificación de las claves de los hash, Perl no nos avisa cuando se encuentra con una clave distinta a la que queríamos usar, porque piensa que es una clave nueva.

Una forma de solventarlo es usando módulos como Hash::Util, que ayuda a restringir las claves que podemos usar con nuestro hash.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;

use Hash::Util qw(lock_hash);

my %abbreviation_of = (
        'value added tax'                      => 'vat',
        'belasting over de toegevoedge waarde' => 'btw',
        'impuesto sobre el valor añadido'      => 'iva',
        );

lock_hash(%abbreviation_of);

while ((my $key, my $value) = each(%abbreviation_of)) {
    print "$key\t$value\n";
}

print "$abbreviation_of{'value addedd tax'}\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sale:
Código: Seleccionar todo
belasting over de toegevoedge waarde    btw
value added tax vat
impuesto sobre el valor añadido iva
Attempt to access disallowed key 'value addedd tax' in a restricted hash at ./kk.pl line 20.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron