Я столкнулся с тем, что кажется проблемой с переменной областью, с которой я не сталкивался раньше. Я использую модуль CGI Perl и вызов метода do() DBI. Вот структура кода, немного упрощен:Perl: проблема с переменной областью с модулями CGI и DBI
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 placeholder) или переназначить значение новой переменной (# 3 placeholder)?
Я думаю, что это связано с тем, как функция ReadParse() модуля CGI присваивает области значение% в хеше, но я не знаю, насколько Perl просматривает достаточно хорошо, чтобы понять, почему% in доступен на верхнем уровне, но не из моей инструкции do().
Если кто-то действительно понимает проблему обзора, есть ли лучший способ справиться с этим? Обертывание всех% ссылок в двойных кавычках кажется немного беспорядочным. Создание новых переменных для каждого параметра запроса нереально.
Для того, чтобы быть ясным, мой вопрос касается проблемы с переменными областями. Я понимаю, что ReadParse() не является рекомендуемым методом для захвата параметров запроса с помощью CGI.
Я использую Perl 5.8.8, CGI 3.20 и DBI 1.52. Заранее благодарю всех, кто это читает.
@Pi & @Bob, спасибо за предложения. Предварительное объявление области для% in не имеет эффекта (и я всегда использую строгую). Результат будет таким же, как и раньше: в db col1 имеет значение null, а cols 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);
}
Я думаю, мой вопрос это лучший способ получить% in hash в контексте do()? Еще раз спасибо! Надеюсь, это правильный способ предоставить дополнительную информацию по моему первоначальному вопросу.
@ Dan: Я слышал, что в отношении синтаксиса ReadParse &. Обычно я использовал CGI :: ReadParse(), но в этом случае я думал, что лучше всего точно придерживаться того, как the CGI.pm documentation has it.
объявите его как мой в том же контексте вашего звонка. Вы не назначаете это ни на что. Почему вы используете *, когда вам нужен только хэш? Это очень сложная подпрограмма. Возможно, я смогу работать с вами, чтобы очистить или лучше понять ваши потребности. Можете ли вы показать нам, где вы называете этот суб? – 2008-09-18 02:12:54