#arrays #perl #hash
#массивы #perl #хэш
Вопрос:
Я могу создавать двумерные массивы в Perl. Насколько 2d-массивы отличаются от Hash? Почему хэш является примитивной структурой данных в perl, когда мы можем имитировать функции хэша с помощью массивов?
Комментарии:
1. Не существует 2d-массивов, есть массив массивов
2. В PDL есть 2D-массивы, но я знаю, что это не то, что имел в виду OP. (Также они предназначены только для чисел)
3. Вы также можете имитировать массив с помощью хэша, но от этого никому не стало бы лучше, если бы массив не был примитивным типом данных.
Ответ №1:
Вероятно, вы имеете в виду, что у вас может быть структура данных, подобная этой:
my $array_hash = [
[ "key1", "value1" ],
[ "key2", "value2" ],
];
Для небольших данных это работает хорошо, но рассмотрим случай, когда такой массив содержит около 1000 записей. Затем, чтобы найти конкретную запись по ее ключу, вы должны выполнить поиск по всему массиву, что является медленным.
Примитивный тип хэша позволяет выполнять быстрый поиск, и это именно то, для чего он используется.
Еще одна причина, по которой хэш-таблицы встроены в Perl, заключается в том, что они являются полезными структурами данных, поэтому не каждому программисту нужно внедрять свои собственные.
Ответ №2:
При создании многих типов объектов new
методу может быть передан список аргументов, которые могут отображаться как хэш, но на самом деле это просто массив, где каждое четное число является ключом, а каждое нечетное число — значением.
my $obj = Some::New::Class->new(
name => 'Sam',
age => 0,
email => 'sam@localhost'
);
Это эквивалентно:
my $obj = Some::New::Class->new(
'name', 'Sam',
'age', 0,
'email', 'sam@localhost'
);
Однако вы можете указать new() искать хэш, который будет выглядеть скорее как:
my $obj = Some::New::Class->new({
name => 'Sam',
age => 0,
email => 'sam@localhost'
});
Если это не ответ на ваш вопрос, я надеюсь, что я, по крайней мере, предоставил некоторое представление.
Комментарии:
1. в вашем последнем примере вы передаете ссылку на хэш, а не на хэш: таким образом, код для разыменования будет отличаться в реализации new(). (Вы, вероятно, знали это, но просто для пояснения.)