Perl жалуется на глобальные символы, которым нужно явное имя пакета, несмотря на то, что строгие и предупреждения отключены - PullRequest
0 голосов
/ 25 июня 2018
use utf8;
use v5.14.0;
@rocks = qw/ bedrock slate rubble granite /;
while( ( $index, $value ) = each @rocks ) {
    say "$index: $value\n";
}

вывод:

C:\Users\J\Documents\Development\perl>perl test.pl
Global symbol "@rocks" requires explicit package name at test.pl line 6.
Global symbol "$index" requires explicit package name at test.pl line 7.
Global symbol "$value" requires explicit package name at test.pl line 7.
Global symbol "@rocks" requires explicit package name at test.pl line 7.
Global symbol "$index" requires explicit package name at test.pl line 8.
Global symbol "$value" requires explicit package name at test.pl line 8.
Execution of test.pl aborted due to compilation errors.

Я прочитал, что исключая использование строгих предупреждений и предупреждений об использовании, позволяет обойти эту проблему.Но я убрал строгие и предупреждения и вот оно.Я знаю, что невероятно опасно не использовать строгий, но я просто играю с кодом.Необходимость набирать

my @rocks = qw/ bedrock slate rubble granite /;
while( (my $index, my $value ) = each @rocks ) {
    say "$index: $value\n";
}

немного раздражает, когда вы просто играете.

Кажется, что

use v5.14.0;

включает строгие или предупреждения;это правда?Если так, то как?И если да, то как мне получить возможность использовать say без префикса каждой переменной sodding с $my?Кажется, я не могу сказать, не имея строки use v5.14.0.; в моем файле.

1 Ответ

0 голосов
/ 28 июня 2018

Кажется, что use v5.14.0; включает строгие или предупреждения;это правда?Если да, то как?

Документы для этого, к сожалению, похоронены в документации use.

use VERSIONтакже лексически включает все функции, доступные в запрашиваемой версии, как определено прагмой функции, отключая любые функции, не входящие в комплект функций запрашиваемой версии.Смотрите функцию. Точно так же, если указанная версия Perl больше или равна 5.12.0, стриктуры включаются лексически как при использовании строгого. Любое явное использование использования строгого или без строгого переопределения использует VERSION, даже если это предшествует этому.Дальнейшее использование use VERSION переопределит все поведение предыдущей версии VERSION, возможно, удалив строгую и функциональную возможность, добавленную с помощью использования VERSION.Использование VERSION не загружает файлы feature.pm или strict.pm.

И если да, то как я могу использовать слово, не имея префикса для каждой переменной soddingс $ my?

Вы можете загружать функции индивидуально с помощью use feature.Так что use feature "say".Вы также можете загрузить пакет функций до 5.12.0 с помощью use v5.10.

Но вы действительно, действительно, очень хотите строго придерживаться.Действительно действительно действительно.Явное объявление переменных с помощью my дает вам две важные функции: защиту от опечаток и лексическую область видимости.Защита от опечаток очевидна, если вы наберете $receiver = 42 и позже print $reciever, вы можете потратить много времени на расчесывание головы, пока не поймете, что у вас есть опечатка.Это более чем компенсирует время, потраченное на ввод my.

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

use strict;

sub foo {
    my $thing = 42;
}

print $thing;  # error

Без my переменные являются глобальными по умолчанию.Любой фрагмент кода в любом месте может в любое время коснуться глобальной переменной.Это делает все, кроме самых маленьких кусочков кода, более сложными и трудными для понимания и превращает их в NIGHTMARES для людей, которым необходимо поддерживать его позже.Вы также рискуете случайно использовать одну и ту же переменную для двух разных целей, особенно с общим именем, таким как $count или $i, таинственным образом перезаписывая значения друг друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...