2012-05-20 9 views
8

Soy nuevo en perl, en la mayoría de los lugares donde se usa hash se da una referencia a los diccionarios de python. Una diferencia que he notado es que los hashes no conservan el orden de los elementos. Me gustaría saber si existen diferencias más concretas y fundamentales entre los dos.diferencia entre el hash de perl y el diccionario de python

+13

Los diccionarios de Python tampoco conservan el orden de los elementos. –

+6

Los diccionarios de Python tampoco conservan el orden de los elementos; se implementan como tablas hash. – Philipp

Respuesta

17

La diferencia más fundamental es que los hash de perl no arrojan errores si accede a elementos que no están allí.

$ python -c 'd = {}; print d["a"]' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
KeyError: 'a' 
$ perl -e '$d = {}; print $d->{a}' 
$ 

Perl hashes crear automáticamente los elementos demasiado a diferencia de pitón

$ python -c 'd = dict(); d["a"]["b"]["c"]=1' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
KeyError: 'a' 
$ perl -e '$d = {}; $d->{a}{b}{c}=1' 
$ 

Si está convirtiendo perl-python esas son las principales cosas que te atrapará a cabo.

+0

Deberías 'usar estricto; usa advertencias; 'en todos tus scripts de Perl de todos modos. Eso también eliminará algunas de estas diferencias. Creo que encontrará que la mayoría de las diferencias significativas se encuentran en otras partes de los idiomas, como el paradigma "todo es un objeto" de Python, y en el manejo de excepciones. – tripleee

+9

@triplee 'use strict; use advertencias; 'no hace ninguna diferencia en este caso, le prohíbe utilizar variables no declaradas, no elementos de diccionario indefinidos. – ZyX

+0

Puede ordenar-emular el comportamiento de Perl con 'collections.defaultdict' en Python, pero todavía tiene que preocuparse por los tipos de objetos. –

8

Otra diferencia importante es que en Python puede tener objetos (definidos por el usuario) como claves del diccionario. Los diccionarios utilizarán los métodos de los objetos __hash__ y __eq__ para gestionar esto.

En Perl, no puede usar objetos como teclas hash por defecto. Las claves se almacenan como cadenas y los objetos se interpolarán a cadenas si intenta utilizarlos como claves. (Sin embargo, es posible usar objetos como claves utilizando un hash vinculado con un módulo como Tie::RefHash).

Cuestiones relacionadas