Как я отключаю autovivification в Perl?

Пожалуйста, проверьте как это

$dateValues = array_column($countOfDailyRegisteredUsersForAMonth, "date");
$maxDate    = max($dateValues);
$likeYouWant=[];
for ($i = 1; $i <= $maxDate; $i++)
{
    $likeYouWant[] = ["date" => $i, "count" => in_array($i, $dateValues) ? $countOfDailyRegisteredUsersForAMonth[array_search($i, $dateValues)]["count"] : 0];
}
print_r($likeYouWant);
8
задан Беров 21 April 2011 в 21:11
поделиться

5 ответов

Возможно, вы захотите использовать объект вместо хеша (см. Moose ) или использовать строгий связанный хеш . Или вы можете превратить предупреждения в ошибки, если вы действительно хотите:

use warnings NONFATAL => 'all', FATAL => 'uninitialized';
15
ответ дан 5 December 2019 в 04:34
поделиться

Я проголосовал @zoul , но вы должны сделай еще один шаг вперед.

Написать тесты

Ваш код должен быть покрыт тестами, и вам следует запустить некоторые из этих тестов с

use warnings FATAL => 'uninitialized';

, объявленным в самом тестовом примере. Это единственный способ решить проблему, связанную с тем, что разработчики не проверяют все заранее. Убедитесь, что их код проверен.

И сделайте еще один шаг вперед и упростите запуск ваших тестов под Devel :: Cover , чтобы получить отчет о покрытии.

cover -delete
PERL5OPT='-MDevel::Cover' prove -l 
cover -report Html_basic 

И затем проверьте, что строки кода и операторы выполняются тестами, в противном случае, если сделать эти предупреждения фатальными, код просто внезапно умрет.

Cover , чтобы получить отчет о покрытии.

cover -delete
PERL5OPT='-MDevel::Cover' prove -l 
cover -report Html_basic 

И затем проверьте, что строки кода и операторы выполняются тестами, в противном случае, если сделать эти предупреждения фатальными, код просто внезапно умрет.

Cover , чтобы получить отчет о покрытии.

cover -delete
PERL5OPT='-MDevel::Cover' prove -l 
cover -report Html_basic 

И затем проверьте, что строки кода и операторы выполняются тестами, в противном случае, если сделать эти предупреждения фатальными, код просто внезапно умрет.

3
ответ дан 5 December 2019 в 04:34
поделиться

Другой вариант - использовать Data :: Diver для доступа к вашим структурам данных.

if( 1 == Dive($some_ref, qw/ deep structures are not autovivified now / )) {
    Do_Stuff();
}
2
ответ дан 5 December 2019 в 04:34
поделиться

Вы можете заблокировать хеш, используя одну из функций из Hash :: Util (основной модуль).

use Hash::Util qw( lock_keys unlock_keys );

my $some_ref = { akey => { deeper => 1 } };
lock_keys %$some_ref;

print "too deep" if $some_ref->{deep}{shit} == 1;

Теперь последний оператор выдаст исключение:

Attempt to access disallowed key 'deep' in a restricted hash

Недостатком является, конечно, то, что вы должны быть очень осторожны при проверке ключей в хэше, чтобы избежать исключений, т.е. используйте lof «, если существует ... », чтобы проверить ключи до доступа к ним.

Если вам понадобится снова добавить ключи к хешу, вы можете разблокировать его:

unlock_keys %$some_ref;
$some_ref->{foo} = 'bar'; # no exception
9
ответ дан 5 December 2019 в 04:34
поделиться

Относительно новым является модуль автовивификации , который позволяет делать следующее:

no autovivification;

Довольно просто.

21
ответ дан 5 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: