2010-04-15 14 views
5

que tienen un hash en Perl que ha sido vertida en algunos de código heredado el nombre de la clave ha cambiado desde la simple reqHdrs a reqHdrs.bla¿Cómo puedo usar una clave hash Perl que tiene un punto literal?

$rec->{reqHdrs.bla} 

Mi problema ahora es que parece que no puede acceder a este ámbito del hash alguna idea? La siguiente es mi error

Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use 
+0

* '¿Cómo puedo utilizar una clave hash en Perl que tiene un punto literal' * - El título es un poco engañoso:? No es el * punto literal * que crea el problema, pero la clave * sin comillas * con un punto en ella. – Wolf

Respuesta

4

Si la clave es una cadena, simplemente:

$rec->{"reqHdrs.bla"} 
+2

... con una ganancia de rendimiento muy pequeña si utiliza una cadena de comillas simples (''') en lugar de una cadena de comillas dobles ('" '); –

+0

@Carl: ¿por qué es una comilla simple más rápida? –

+0

@Eli: Las comillas simples no se interpolan. –

-1

El bareword reqHdrs.bla es en realidad un sinónimo ..., supongo, para una cadena. No estoy del todo seguro, pero creo que deberías poder simplemente usar una cadena, p. 'reqHdrs.bla' como su clave y que debería recuperar su valor OK.

3

Incluya la clave entre comillas:

$rec->{'reqHdrs.bla'} 
17

Como se describe en perldoc perldata:

... Un identificador dentro de tales curlies se ve obligado a ser una cadena, como lo es cualquier identificador simple dentro de una hash subíndice. Tampoco es necesario citar. Nuestro ejemplo anterior , $days{'Feb'} se puede escribir como $days{Feb} y las citas se asumirán automáticamente. Pero cualquier cosa más complicada en el subíndice se interpretará como una expresión. Esto significa, por ejemplo, que $version{2.0}++ es equivalente a $version{2}++, no a $version{'2.0'}++.

En general, si tiene una clave hash con un carácter fuera del rango [A-Za-z0-9_], utilice comillas (simples o dobles) dentro de las llaves. Al igual que con las cadenas normales, contenidos en comillas dobles serán analizados para cualquier contenía las variables, mientras que las cadenas entre comillas sencillas se toman literalmente:

use strict; use warnings; 
use Data::Dumper; 
my $x = 1; 
my %hash = (
    bare_string => 'hi there', 
    "not a bare string" => 'yup', 
); 
$hash{'$x'} = 'foo'; 
$hash{"$x"} = 'bar'; 
print Dumper(\%hash); 

impresiones:

$VAR1 = { 
     'bare_string' => 'hi there', 
     'not a bare string' => 'yup', 
     '$x' => 'foo' 
     '1' => 'bar', 
    }; 
+1

Votación a favor por la respuesta más completa y provechosa del lote. :) –

5

Según perldoc perldata que cuando se utiliza un identificador dentro de curlies, como cuando se accede a un valor hash a través de una clave, se supone que ese identificador es una cadena y se trata como tal. Las cotizaciones se asumirán automáticamente, sin embargo, cualquier cosa más complicada puede interpretarse.

De perldata

De hecho, un identificador dentro de tales curlies se ve obligado a ser una cadena, como es cualquier identificador simple dentro de un hash subíndice. Tampoco es necesario citar. Nuestro ejemplo anterior , $days{'Feb'} puede ser escrito como $days{Feb} y las cotizaciones se asumirán automáticamente. Pero algo más complicado en el subíndice se interpretará como una expresión . Esto significa, por ejemplo, que $version{2.0}++ es equivalente a $version{2}++, no a $version{'2.0'}++.

Dado que el . se utiliza para la concatenación de cadenas, el intérprete que supongo está tratando de combinar esas dos cadenas. A pesar de que siempre es mejor usar comillas para hacerlo explícito, y si tiene strict probablemente lanzará un error "bareword no permitido".

La solución a su problema:

$rec->{'reqHdrs.bla'} 
+0

No vi la publicación anterior que citó el mismo fragmento de perldata. – Logan

Cuestiones relacionadas