2012-05-20 14 views
8

Sono nuovo di perl, nella maggior parte dei posti in cui viene usato l'hash viene dato un riferimento ai dizionari di Python. Una differenza che ho notato è che gli hash non conservano l'ordine degli elementi. Vorrei sapere se ci sono alcune differenze più concrete e fondamentali tra i due.differenza tra l'hash di perl e il dizionario di python

+13

I dizionari Python non mantengono l'ordine degli elementi. –

+6

I dizionari Python non conservano neanche l'ordine degli elementi; sono implementati come tabelle hash. – Philipp

risposta

17

La differenza fondamentale è che gli hash perl non generano errori se si accede a elementi che non sono presenti.

$ 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 hash auto creare elementi troppo a differenza di pitone

$ 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' 
$ 

Se si sta convertendo perl-python quelle sono le cose principali che cattura fuori.

+0

Si dovrebbe 'usare rigoroso; usa gli avvertimenti; in ogni caso, in tutti gli script Perl. Ciò eliminerà anche alcune di queste differenze. Penso che scoprirete che la maggior parte delle differenze significative si trovano in altre parti dei linguaggi, come il paradigma "tutto è un oggetto" di Python e nella gestione delle eccezioni. – tripleee

+9

@triplee 'usa rigorosamente; usa avvertimenti; 'non fa alcuna differenza in questo caso, ti vieta di usare variabili non dichiarate, non voci di dizionario non definite. – ZyX

+0

È possibile eseguire l'emulazione del comportamento Perl con 'collections.defaultdict' in Python, ma è comunque necessario preoccuparsi dei tipi di oggetti. –

8

Un'altra importante differenza è che in Python è possibile avere oggetti (definiti dall'utente) come chiavi del dizionario. I dizionari utilizzeranno i metodi __hash__ e __eq__ degli oggetti per gestirlo.

In Perl, non è possibile utilizzare gli oggetti come hash per impostazione predefinita. Le chiavi vengono memorizzate come stringhe e gli oggetti vengono interpolati alle stringhe se si tenta di utilizzarli come chiavi. (Tuttavia, è possibile utilizzare gli oggetti come chiavi utilizzando un hash legato con un modulo come Tie::RefHash.)

Problemi correlati