Не заменяет определенные переменные - PullRequest
0 голосов
/ 25 июля 2011

Следующий раздел кода работает как положено ...

create table todel (id int not null auto_increment, name varchar(100), primary key (id));
insert into todel values (NULL, '24');
select @myid:=last_insert_id();
insert into todel values (NULL, @myid);

mysql> select * from todel;
+----+------+
| id | name |
+----+------+
|  1 | 24   |
|  2 | 1    |
+----+------+

Но тот же код не работает, когда я пытаюсь обернуть его в код Perl.

vi myperl.pl

#!D:\Perl\bin\perl

open (output_file, ">myperl.txt");
@Program_ID = '24';
print output_file
"create table todel (id int not null auto_increment, name varchar(100), primary key (id));
insert into todel values (NULL, '@Program_ID');
select @myid:=last_insert_id();
insert into todel values (NULL, '@myid');";

close(output_file);

Генерирует код, как показано ниже. Имя переменной mysql @myid отсутствует.

# cat myperl.txt
create table todel (id int not null auto_increment, name varchar(100), primary key (id));
insert into todel values (NULL, '24');
select :=last_insert_id();
insert into todel values (NULL, '');

Как я могу сообщить perl, что я не хочу заменять переменную mysql? Я хочу заменить переменную @Program_ID, хотя.

Ответы [ 4 ]

3 голосов
/ 25 июля 2011

Попробуйте

insert into todel values (NULL, '\@Program_ID');
select \@myid:=last_insert_id();
insert into todel values (NULL, '\@myid');";
1 голос
/ 25 июля 2011

Над заявлением о печати поставьте 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.

1 голос
/ 25 июля 2011

Вам нужно экранировать @ в @myid, иначе Perl будет рассматривать его как массив с именем myid.

0 голосов
/ 25 июля 2011

Как и другие говорили, @ сбивает с толку переводчика.Вот почему (IMO) это хорошая привычка заключать в кавычки строку, если она не включает переменные интерполяции.

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