Я столкнулся с проблемой области видимости, с которой раньше не сталкивался. Я использую модуль Perl CGI и вызов метода DBI do (). Вот структура кода, немного упрощенная:
use DBI;
use CGI qw(:cgi-lib);
&ReadParse;
my $dbh = DBI->connect(...............);
my $test = $in{test};
$dbh->do(qq{INSERT INTO events VALUES (?,?,?)},undef,$in{test},"$in{test}",$test);
Переменная-заполнитель # 1 оценивается как неинициализированная. Две другие переменные-заполнители работают.
Вопрос: почему% в хэше недоступен в контексте do (), если я не заключу его в двойные кавычки (заполнитель # 2) или не переназначу значение в новую переменную (заполнитель # 3)
Я думаю, что это как-то связано с тем, что функция ReadParse () модуля CGI назначает область видимости для% в хэше, но я не знаю достаточно хорошо Perl, чтобы понять, почему% in доступен на верхнем уровне, но не из в моем утверждении do ().
Если кто-то понимает проблему определения объема, есть ли лучший способ справиться с этим? Заключение всех% в ссылках в двойные кавычки кажется немного грязным. Создание новых переменных для каждого параметра запроса нереально.
Просто чтобы прояснить, мой вопрос о проблеме переменной области видимости. Я понимаю, что ReadParse () не рекомендуется для получения параметров запроса с помощью CGI.
Я использую Perl 5.8.8, CGI 3.20 и DBI 1.52. Заранее спасибо всем, кто читает это.
@ Pi & @Bob, спасибо за предложения. Предварительное объявление области для% in не имеет никакого эффекта (и я всегда использую строгое). Результат тот же, что и раньше: в БД col1 равно нулю, а для столбцов 2 и 3 установлено ожидаемое значение.
Для справки, вот функция ReadParse (см. Ниже). Это стандартная функция, которая является частью CGI.pm. Насколько я понимаю, я не собираюсь инициализировать% в хэше (кроме удовлетворения строгого) в целях установки области видимости, поскольку мне кажется, что функция справляется с этим:
sub ReadParse {
local(*in);
if (@_) {
*in = $_[0];
} else {
my $pkg = caller();
*in=*{"${pkg}::in"};
}
tie(%in,CGI);
return scalar(keys %in);
}
Полагаю, мой вопрос в том, как лучше всего получить% в хэше в контексте do ()? Еще раз спасибо! Я надеюсь, что это правильный способ предоставить дополнительную информацию к моему первоначальному вопросу.
@ Дэн: Я слышал о синтаксисе & ReadParse. Я бы обычно использовал CGI :: ReadParse (), но в этом случае я подумал, что лучше всего придерживаться того, как в документации CGI.pm он имеет точно.