ошибка компиляции при определении области видимости переменной - PullRequest
0 голосов
/ 01 ноября 2011

Может ли кто-нибудь указать мне, почему этот фрагмент не скомпилирован:

my $crond = "/etc/init.d/crond";
if( -e $crond ) {
    my $d = "d";
}
my $crond = "/etc/init.d/cron$d";

Ошибка:

"my" variable $crond masks earlier declaration in same scope at /home/andrew/sandbox/processes2cron.pl line 27.
Global symbol "$d" requires explicit package name at /home/andrew/sandbox/processes2cron.pl line 27.

Я пробовал разные варианты с "моим", но все же область действия определена неправильно. Спасибо.

Ответы [ 2 ]

5 голосов
/ 01 ноября 2011

Вы уже объявили переменную $crond в первой строке своего кода. Повторно объявив его в строке 5, вы потеряете предыдущее значение. В этом случае удаление my в строке 5 остановит предупреждение.

Переменная $d объявляется в области действия блока if. Это означает, что он доступен только до конца блока if. Затем вы пытаетесь обратиться к нему за пределами блока if, что вызывает ошибку. Чтобы это исправить, объявите $d перед оператором if во внешней области видимости.

4 голосов
/ 01 ноября 2011
my $crond = "/etc/init.d/crond";
my $d;
if( -e $crond ) {
    $d = "d";
}
$crond = "/etc/init.d/cron$d";

Это как написано в сообщении об ошибке. Вы перераспределяете $cron в той же области видимости, а $d определяется только в блоке if, поэтому компилятор ожидает, что $d будет глобальной переменной, когда вы используете ее в последней строке, и жалуется, когда это не может найти это.

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