Как я могу принудительно вызвать ошибку на неопределенном хэш-ключе? - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь использовать код из make perl shout при попытке получить доступ к неопределенному хеш-ключу , но он не работает.

Я предполагаю, что что-то изменилось в том, как tie работает за последние 10 лет.

Я получаю ошибку:

Safe::Hash must define either a TIEHASH() or a new() method at /home/bennett/work/stock/Indicator.pm line 97.

Мне нужно это только для примерно 5% хэшей, которые я использую, и я надеюсь использовать что-то, что не меняет интерфейс (т.е. $foo{bar}). То есть я бы предпочел не использовать Moose или что-то, включающее методы доступа.

И вот почему: я хочу включить его для отладки и разработки, а в противном случае отключить. Программа и компьютер работают достаточно медленно.

Любой исправленный код (см. Ссылку выше) или другие решения приветствуются.

Это Perl 5, версия 16, Subversion 3 (v5.16.3), созданная для x86_64-Linux-thread-multi

1 Ответ

2 голосов
/ 28 июня 2019

Для несуществующего хеш-ключа, который отличается от хеш-ключа, который существует, но имеет неопределенное значение, вы можете использовать lock_hash из Hash :: Util . Обратите внимание, что это также ограничивает любые значения от изменения. К сожалению, lock_keys, который в противном случае ближе к тому, что вы запрашиваете, не вызывает ошибку при доступе к несуществующему ключу, если вы не попытаетесь установить его.

use strict;
use warnings;
use Hash::Util 'lock_hash';
my %foo = (a => 1, b => 2);
lock_hash %foo;
print $foo{c}; # error

Это тот же базовый механизм, который используется Const :: Fast для хэшей только для чтения, но это немного сбивает с толку, поскольку он пытается действовать как только для чтения (существующие значения не могут быть изменен) и ограничен (несуществующие ключи недоступны).

...