Должен ли я отдать предпочтение хэшам или hashrefs в Perl?
Я все еще изучаю perl.
Для меня это становится более "естественным" для ссылок на хэши вместо прямого доступа к ним, потому что проще передавать ссылки на sub (одна переменная может быть передана вместо списка). Обычно я предпочитаю такой подход к тому, где прямо обращается к %hashes
".
Вопрос в том, где (в каких ситуациях) лучше использовать простые хэши%, поэтому
$hash{key} = $value;
вместо
$href->{key} = $value
Есть ли какая-нибудь скорость или любая другая вещь, которая предпочитает использовать %hashes
, а не $hashrefs?
Или это только чистое личное предпочтение и TIMTOWTDI? Некоторые примеры, когда лучше использовать %hash
?
Ответы
Ответ 1
Я думаю, что такой вопрос очень закончен: языки программирования, такие как Perl или С++, прошли долгий путь и накопили много исторического багажа, но люди обычно учатся им из аисторических синхронных экспонатов. Поэтому они продолжают задаваться вопросом, почему TIMTOWDI и WTF все эти выборы и что лучше и что должно быть предпочтительным?
Итак, до версии 5 у Perl не было ссылок. Он имел только значения. Ссылки - это дополнение к Perl 4, позволяющее записывать больше материала. Разумеется, типы ценностей должны были быть сохранены, чтобы сохранить обратную совместимость; а также для простоты, потому что часто вам не нужна косвенность, на которую ссылаются.
Чтобы ответить на ваш вопрос:
Не тратьте время на размышления о скорости хеш-списков Perl. Они быстры. Это доступ к памяти. Доступ к базе данных или файловой системе или сети, где обычно тратится ваша программа.
В теории операция разыменования должна занимать крошечный отрезок времени, поэтому крошечное это не имеет значения.
Если вам интересно, тогда benchmark. Не делайте слишком много выводов из различий, которые вы можете видеть. В другом выпуске все может выглядеть по-другому.
Таким образом, нет причин для поддержки ссылок на типы значений или наоборот.
Есть ли другая причина? Я бы сказал, что это вопрос стиля и вкуса. Лично я предпочитаю синтаксис без аксессуаров ->
.
Ответ 2
Если вы можете использовать простые хэши, чтобы описать ваши данные, вы используете простой хэш. Однако, когда ваша структура данных становится немного сложнее, вам нужно будет использовать ссылки.
Представьте себе программу, в которой я храню информацию об элементах инвентаря и сколько у меня на складе. Простой хэш работает достаточно хорошо:
$item{XP232} = 324;
$item{BV348} = 145;
$item{ZZ310} = 485;
Если все, что вы делаете, это создание быстрых программ, которые могут читать файл и хранить простую информацию для отчета, нет необходимости вообще использовать ссылки.
Однако, когда ситуация становится более сложной, вам нужны ссылки. Например, моя программа не просто отслеживает мои акции, я отслеживаю все аспекты моего инвентаря. Элементы инвентаря также имеют имена, компанию, которая их создает, и т.д. В этом случае я хочу, чтобы мои хэши не указывали на одну точку данных (количество элементов, которые у меня есть на складе), но ссылка на хэш
$item{XP232}->{DESCRIPTION} = "Blue Widget";
$item{XP232}->{IN_STOCK} = 324;
$item{XP232}->{MANUFACTURER} = "The Great American Widget Company";
$item{BV348}->{DESCRIPTION} = "A Small Purple Whatzit";
$item{BV348}->{IN_STOCK} = 145;
$item{BV348}->{MANUFACTURER} = "Acme Whatzit Company";
Вы можете делать всевозможные дурацкие вещи, чтобы сделать что-то вроде этого (например, иметь отдельные хэши для каждого поля или поместить все поля в одно значение, разделенные двоеточиями), но просто проще использовать ссылки для хранения этих более сложных структур.
Ответ 3
Для меня основной причиной использования $hashrefs
to %hashes
является возможность дать им значимые имена (связанная идея будет называться ссылками на анонимный хеш), которые могут помочь вам разделить структуры данных от логики программы и упростить чтение и обслуживание.
Если вы закончите с несколькими уровнями ссылок (refs to refs?!), вы начнете потерять это чистое и читаемое преимущество. Кроме того, для коротких программ или модулей или на более ранних этапах разработки, где вы проверяете вещи, когда вы идете, прямой доступ к %hash
может упростить процедуру простой отладки (инструкции print
и т.п.) И избежать случайного "действие на расстоянии", поэтому вы можете сосредоточиться на "итерации" по вашему дизайну, используя ссылки там, где это необходимо.
В общем, хотя я думаю, что это отличный вопрос, потому что TIMTOWDI
и TIMTOCWDI
где C
= "correct". Спасибо, что попросили его и спасибо за ответы.