Почему не там никакое предупреждение, брошенное для redeclaration $i
в следующем коде?
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
for my $i (1..3) {
my $i = 'DUMMY';
print Dumper $i;
}
Фактически, вы получаете предупреждения только для переопределений в той же области. Написание:
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!
};
Производительность оператора 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
.