Perl: переменная область видимости с модулями CGI и DBI - PullRequest
3 голосов
/ 18 сентября 2008

Я столкнулся с проблемой области видимости, с которой раньше не сталкивался. Я использую модуль 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 он имеет точно.

Ответы [ 12 ]

0 голосов
/ 18 сентября 2008

Хорошо, попробуйте это:

use CGI;
my %in;
CGI::ReadParse(\%in);

Это могло бы помочь, поскольку оно фактически использует объявленную вами переменную, и, следовательно, может контролировать область действия (плюс это позволит вам use strict без других мерзостей, которые могли бы испачкать воду)

0 голосов
/ 18 сентября 2008

Попробуйте это

% in = ReadParse ();

но я сомневаюсь в этом. Вы пытаетесь получить параметры запроса или что-то?

...