Почему некоторые глобальные символы требуют явного имени пакета - PullRequest
2 голосов
/ 28 февраля 2020

Почему в строке 18 требуется явное имя пакета в приведенном ниже коде?

#! /usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw<say state>;

{
    no strict;
    no warnings;

    $myRef{G4143} = 58;
    $myRef{Emily} = 8;
    $myRef{Angela} = 40;

}

#%myRef requires explicit package name
while (my ($key, $value) = each %myRef) {
    say "$key=>$value";
}

exit(0);

Если я добавлю основной пакет в% myRef в строке 18, тогда он будет работать

#! /usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw<say state>;

{
    no strict;
    no warnings;

    $myRef{G4143} = 58;
    $myRef{Emily} = 8;
    $myRef{Angela} = 40;

}
#added package name and now it works
while (my ($key, $value) = each %main::myRef) {
    say "$key=>$value";
}

exit(0);

Почему в этом примере требуется имя пакета?

1 Ответ

4 голосов
/ 28 февраля 2020

Вам необходимо явно указать имя пакета, потому что

  1. strict включено , а
  2. %myRef не было объявлено (с использованием my, our или use vars) в этой области или любой включающей области

Вы не не нуждаетесь в имени пакета в предыдущем блоке, поскольку strict отключен в этом блоке.

Если вы добавите строку my %myRef; (или our %myRef;, если вы хотите, чтобы она была видна вне текущего файла и пакета) перед блоком no strict, то вы будете больше не нужно явное имя пакета, и вам не понадобится no strict внутри блока.

И no warnings уже излишен, поэтому я бы порекомендовал его удалить. В этом блоке нет ничего, что могло бы генерировать предупреждение в любом случае.

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