Разница между хешем perl и python

Я новичок в perl, в большинстве мест, где используется хеш, дается ссылка на словари python. Различие, которое я заметил, состоит в том, что хеши не сохраняют порядок элементов. Я хотел бы знать, существуют ли какие-то более конкретные и фундаментальные различия между ними.

Ответ 1

Основное различие заключается в том, что хеш-коды perl не выдают ошибок, если вы обращаетесь к элементам, которых там нет.

$ python -c 'd = {}; print("Present" if d["a"] else "Missing")'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
KeyError: 'a'
$ perl -we 'use strict; my $d = {}; print $d->{"a"} ? "Present\n": "Missing\n"'
Missing
$ 

Perl хэши автоматически создает элементы, в отличие от python

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

Если вы конвертируете perl в python, это основные вещи, которые вас поймут.

Ответ 2

Другим существенным отличием является то, что в Python вы можете иметь (определяемые пользователем) объекты в качестве ключей словаря. Словари будут использовать методы __hash__ и __eq__ объектов для управления этим.

В Perl вы не можете использовать объекты как хеш-ключи по умолчанию. Ключи хранятся в виде строк, а объекты будут интерполированы в строки, если вы попытаетесь использовать их в качестве ключей. (Тем не менее, можно использовать объекты в качестве ключей, используя связанный хеш с модулем, например Tie:: RefHash.)