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

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

#!/usr/bin/perl

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

for my $i (1..3) {
  my $i = 'DUMMY';
  print Dumper $i;
}
10
задан Eugene Yarmash 28 July 2011 в 13:22
поделиться

2 ответа

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

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!
};
9
ответ дан 4 December 2019 в 01:00
поделиться

Производительность оператора IF EXISTS

IF EXISTS(SELECT 1 FROM mytable WHERE someColumn = someValue)

зависит от имеющихся индексов, удовлетворяющих запросу.

-121--1292552-

Лучший способ понять копирование на C++ часто НЕ пытаться создать искусственный пример и инструмент его - компилятору разрешено как удалять, так и добавлять вызовы конструктора копирования, более или менее, как он считает нужным.

Итог - если вам нужно вернуть значение, верните значение и не беспокойтесь ни о каких "расходах".

-121--2185300-

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

2
ответ дан 4 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: