Хэширование ссылок
Проблема
Если функция keys вызывается для хэша, ключи которого представляют собой ссылки,
то возвращаемые ей ссылки не работают. Подобная ситуация часто возникает при создании
перекрестных ссылок в двух хэшах.
Решение
Воспользуйтесь модулем Tie::RefHash:
use Tie::RefHash;
tie %hash, "Tie::RefHas";
# Теперь в качестве ключей хэша %hash можно использовать ссылки
Комментарий
Ключи хэшей автоматически преобразуются в строки — то есть интерпретируются так, словно они
заключены в кавычки. Для чисел и строк при этом ничего не теряется. Однако со ссылками дело обстоит иначе.
После преобразования в строку ссылка принимает следующий вид:
Class::Somewhere=HASH(Ox72048)
ARRAY(Ox72048)
Преобразованную ссылку невозможно вернуть к прежнему виду, поскольку она перестала быть ссылкой и
превратилась в обычную строку. Следовательно, при использовании ссылок в качестве ключей хэша они
теряют свои «волшебные свойства».
Для решения этой проблемы обычно создается специальный хэш, ключами которого являются ссылки,
преобразованные в строки, а значениями — настоящие ссылки. Именно это и происходит в модуле Tie::RefHash.
Мы воспользуемся объектами ввода/вывода для работы с файловыми манипуляторами и покажем, что даже такие
странные ссылки могут использоваться для индексации хэша, связанного с Tie::RefHash.
Приведем пример:
use Tie::RefHash;
use IO::File;
tie %name, "Tie::RefHash";
foreach $filename ("/etc/termcap","/vmunix", "/bin/cat") {
$fh = IO::File->("< $filename") or next;
$name{$fh} = $filename;
}
print "open files: ", join(", values %name"), "\n";
foreach $file (keys %name) {
seek($file, 0, 2); # Позиционирование в конец файла
printf("%s is %d bytes long.\n", $name{$file}, tell($file));
}
Однако вместо применения объекта в качестве ключа хэша обычно достаточно сохранить уникальный
атрибут объекта (например, имя или идентификатор).
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|