Не следует ли получать доступ к @Whatever:: независимо от того, что вы выдаете хотя бы предупреждение вместо пустого массива?

В следующем коде:

use strict;
use warnings;
use Data::Dumper;

my %hash = %Whatever::whatever;
my @array = @Whatever::whatever;
print Dumper \@array;
print Dumper \%hash;

Я понимаю, что @Whatever:: независимо от того, что обращается к таблице символов, и не создает сообщение об ошибке, потому что таблица символов является хешем. Но почему нет хотя бы предупреждающего сообщения для доступа к несуществующему элементу?

Ответ 1

(адаптация/переход от комментария)

Вместо этого я бы сказал, что @Whatever::whatever идентифицирует массив с динамическим охватом с именем @whatever в пакете Whatever, а не тот, который "получает доступ к таблице символов... [несколько как] хэш".

Квалифицированные идентификаторы всегда избегали стриктур (см. документы для strict 'vars').

Ответ 2

Потому что почти невозможно поймать глобальную переменную в состоянии небытия в Perl. Как только вы упоминаете одного по имени - даже просто, чтобы сделать ссылку на него - он существует. И поскольку массивы и хеши отличаются от скаляров; появляется скаляр, содержащий значение undef, которое запускает предупреждение "использование неинициализированного значения" при использовании для большинства целей; но массивы и хеши появляются как пустые массивы и хеши, а пустой массив или хеш не является достаточно исключительным, чтобы предупреждать!