Есть ли способ сделать компиляцию perl неудачной, если хэш-ключ не был определен в начальном определении хэша?

#perl #hash #compiler-errors

#perl #хэш #ошибки компилятора

Вопрос:

Все используемые ключи должны присутствовать в начальном определении%hash.

 use strict;
my %hash = ('key1' => 'abcd', 'key2' => 'efgh');
$hash{'key3'} = '1234'; ## <== I'd like for these to fail at compilation. 
$hash{'key4'}; ## <== I'd like for these to fail at compilation.
  

Есть ли способ сделать это?

Комментарии:

1. Существует нечто, называемое классом. Это может вам понадобиться.

Ответ №1:

Модуль Hash:: Util является частью Perl с версии 5.8.0. И это включает в себя функцию ‘lock_keys’, которая каким-то образом реализует то, что вы хотите. Это выдает ошибку времени выполнения (не во время компиляции), если вы пытаетесь добавить ключ к хэшу.

 #!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Hash::Util 'lock_keys';

my %hash = (key1 => 'abcd', key2 => 'efgh');
lock_keys(%hash);
$hash{key3} = '1234'; ## <== I'd like for these to fail at compilation. 
say $hash{key4}; ## <== I'd like for these to fail at compilation.
  

Ответ №2:

Tie::StrictHash умирает при попытке назначить новый хэш-ключ, но он делает это во время выполнения, а не во время компиляции.

Комментарии:

1. Похоже, что он выполняет то же самое, что и стандартная функция Hash :: Util::lock_keys .

Ответ №3:

 use strict; 
my %hash = ('key1' => 'abcd', 'key2' => 'efgh'); 
my $ke = 'key3';
if (!exists $hash{$ke}) {
exit;
}
  

Комментарии:

1. Если вам действительно это требуется во время компиляции, поместите его в BEGIN блок.

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