Подтвердить что ты не робот

Почему я не получаю предупреждение, когда я переопределяю переменную управления Perl foreach?

Почему в следующем коде не появляется предупреждение о переопределении $i?

#!/usr/bin/perl

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

for my $i (1..3) {
  my $i = 'DUMMY';
  print Dumper $i;
}
4b9b3361

Ответ 1

Собственно, вы получаете предупреждения только для переопределений в той же области. Запись:

use warnings;
my $i;
{
  my $i;
  # do something to the inner $i
}
# do something to the outer $i

отлично действует.

Я не уверен, что внутренности Perl обрабатывают его таким образом, но вы можете думать о своем цикле for как о том, как разбираться как

{
  my $i;
  for $i ( ... ) { ... }
  # the outer scope-block parens are important!
};

Ответ 2

Вы получите предупреждение, если вы обновите переменную my, our или state в текущей области или инструкции. Первый $i на самом деле не является лексической переменной. Вы можете доказать это с помощью Devel::Peek:

use Devel::Peek;   

for my $i (1) {
    Dump $i;
}  

SV = IV(0x81178c8) at 0x8100bf8
REFCNT = 2
FLAGS = (IOK,READONLY,pIOK)
IV = 1

В FLAGS нет флага PADMY, который указывает, что $i является лексической переменной, объявленной с помощью my.