Над заявлением о печати поставьте my @myid = 'a';
и закомментируйте глобус output_file
следующим образом:
print # output_file
"create...
Поставьте exit 0;
после оператора print, например:
...
insert into todel values (NULL, '@myid');";
exit 0;
Вы должны увидеть это:
create table todel (id int not null auto_increment, name varchar(100), primary key (id));
insert into todel values (NULL, '24');
select a:=last_insert_id();
insert into todel values (NULL, a);
Таким образом, вы должны увидеть содержимое массива @myid
, заменяющего строку @myid
.
Теперь закомментируйте объявление @myid
и вставьте его в начало скрипта:
use strict;
use warnings;
и запустите его. Под 5.12 вы должны увидеть:
Possible unintended interpolation of @myid in string at - line nn.
Possible unintended interpolation of @myid in string at - line nn.
Global symbol "@myid" requires explicit package name at - line nn.
Global symbol "@myid" requires explicit package name at - line nn.
Execution of - aborted due to compilation errors.
Как вы думаете, если бы вы использовали strict
, эти ошибки сказали бы вам достаточно? Даже если бы вы не поняли «интерполяция», поиск в Google «Perl интерполяция» очень помог бы.
Теперь, раскомментируйте объявление my @myid = 'a';
, когда вы запустите его, вы увидите тот же вывод, что и раньше, но без сообщений об ошибках.
Это означает, что когда Perl видит $
или @
в двойной кавычке (на самом деле, ищите "perl interpolation" или perldoc perlop
) это заменяет переменную с тем же именем в этой строке. Он заимствует из мира UNIX идею интерполяции кавычек ("
)
и не интерполирующие кавычки ('
), а в ситуации интерполирующих кавычек вы должны экранировать символ ('$'
или '@'
), и тогда Perl будет обращаться с ним как с буквальным символом.
Еще одна вещь, которую вы можете сделать, чтобы исправить весь беспорядок, - это использовать не интерполирующую кавычку оператор . Поскольку в SQL вы используете одинарную кавычку, мы не можем просто использовать одинарную кавычку, чтобы избежать интерполяции. Вместо этого мы можем использовать оператор q
. Поместите q{
вверху SQL и }
внизу, например:
print output_file
q{create ...
...
insert into todel values (NULL, @myid);
};
Действительно, нажмите на ссылку perldoc.