Почему я не получаю предупреждение при переопределении переменной управления Perl foreach? - PullRequest
10 голосов
/ 16 февраля 2010

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

#!/usr/bin/perl

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

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

Ответы [ 2 ]

9 голосов
/ 16 февраля 2010

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

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 голосов
/ 16 февраля 2010

Вы получите предупреждение, если переопределите переменную 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.

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