2009-12-15 19 views

Respuesta

19

Consulte How Hashes Really Work para una discusión sobre este tema. En resumen, siempre que cite la clave (sin interpolación q {}), puede usar los caracteres que desee.

Con respecto a la respuesta de Dana, no, no tomará más tiempo para que coincidan las claves más largas: la clave tardará infinitesimalmente más tiempo, pero eso es todo.

de referencia, esta es la función hash en Perl 5.10.0:

#define PERL_HASH(hash,str,len) 
STMT_START { 
    register const char * const s_PeRlHaSh_tmp = str; 
    register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; 
    register I32 i_PeRlHaSh = len; 
    register U32 hash_PeRlHaSh = PERL_HASH_SEED; 
    while (i_PeRlHaSh--) { 
     hash_PeRlHaSh += *s_PeRlHaSh++; 
     hash_PeRlHaSh += (hash_PeRlHaSh << 10); 
     hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); 
    } 
    hash_PeRlHaSh += (hash_PeRlHaSh << 3); 
    hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11); 
    (hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15)); 
} STMT_END 
6

Puede usar cualquier carácter que sea válido en una cadena. La longitud tampoco es un problema. Perl se las arreglará con casi cualquier cosa :)

5

Puede usar cualquier caracter en una clave hash --- una tecla hash es solo una cadena. Pero para algunos personajes, necesitas citar la cadena. En caso de duda, solo ponga comillas alrededor de la clave.

$hash{simplekey}        # fine 
$hash{/var/log/auth.log}      # syntax error --- can't use '/' directly 
$hash{"/var/log/auth.log"}     # quoted string, so can use any character 
my $key = "/var/log/auth.log"; $hash{$key} # variable used, which can contain any character 

No hay un problema especial con el uso de teclas largas que no tenga con cadenas largas.

6

Un punto no se crió sin embargo, es que se puede utilizar cualquier cadena válido como una clave hash. Si intenta utilizar algo distinto de una cadena, se Stringified automáticamente, lo que significa que, por ejemplo,

my $ref = []; 
$hash{$ref} = 'foo'; 

utilizará el "ARRAY (0xLOQUESEA)" cadena (o cualquier dirección) como la tecla de almohadilla, no la referencia de matriz real.

+0

+1 para la dirección :) –

Cuestiones relacionadas