Должен ли я отдать предпочтение хэшам или 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". Спасибо, что попросили его и спасибо за ответы.