Аргумент подпрограммы явно потерян в цикле - PullRequest
0 голосов
/ 07 марта 2011

У меня есть скрипт CGI, извлекающий библиографические данные из файла BibTeX, сборка HTML из него.Он использует CGI::Ajax для вызова подпрограммы ниже с одним или двумя аргументами.В большинстве случаев это будет поисковый термин, который передается как $s, но если я пропущу строку через мою HTML форму, подпрограмма не будет полностью ей довольна.Существует цикл foreach, проверяющий записи и пересекающий записи, которые не совпадают.Теперь я могу напечатать аргумент вне этого цикла, но сам цикл ничего не напечатает для $s и не найдет записи, соответствующие ему.Если бы внутри цикла $s были просто пустыми, подпрограмма напечатала бы всю библиографию, но это не так.

По сути, это так, как если бы $s, переданный в качестве аргумента, разрывал цикл, тогда какЯвное определение в подпрограмме работает отлично.

Вот упрощенная версия моего кода.Пожалуйста, извините за неаккуратное или неосведомленное кодирование, я просто балуюсь Perl.

sub outputBib {
    my ( $self,$s,$kw ) = @_;
    my @k;
    @k = ('foo','bar'); # this is fine
    @k = keys (%{$self->{_bib}}); # this causes problems
    foreach my $k (@k) {
        $output .= "Key = $k<br/>";
        $output .= "Search Term = $s<br/>";
    }
    return $output;
}

Проблема, похоже, заключается в массиве, построенном из ключей хеша $self->{_bib}.Странно, что

  1. цикл в порядке, когда $s не пропущен через CGI::Ajax.Все элементы обрабатываются.
  2. , как только подпрограмма вызывается с $s, цикл ничего не возвращает.
  3. , если @k определен как простой массив, цикл работаети $s можно напечатать в цикле;

Я строю $self->{_bib} примерно так:

sub parseBib {
    my ( $self ) = @_;
    while (my $e = new Text::BibTeX::Entry $self->{_bibFileObject}) {
        next unless $e->parse_ok;
        my %entry_hash;
        $entry_hash{'title'} = $e->get('title');
        $entry_hash{'keywords'} = $e->get('keywords');
        $self->{_bib}{$e->key} = \%entry_hash;
    }
}

Есть идеи?Спасибо.

1 Ответ

0 голосов
/ 07 марта 2011

Моим первым предложением было бы использовать warn / print STDERR для проверки работающей копии, что при вызове через CGI::Ajax все ваши переменные ($self, $s, $kw,$self->{_bib}) имеют значения, которые вы ожидаете.Несмотря на то, что я большой поклонник CGI::Ajax, он творит чудеса за вашей спиной и может не вызывать outputBib так, как вы думаете.

Также имейте в видучто CGI работает по модели запроса , а не по странице .Возможно, вы заполняете $self->{_bib}, когда отправляете начальную страницу (а также проводите все ваши успешные тесты в этой среде), и ожидаете, что она все еще будет присутствовать, когда поступят запросы AJAX?Если это так, вам не повезло - вам нужно перестроить его в обработчике AJAX, либо в outputBib или ранее в вашем коде, прежде чем вызывать ->build_html и передать его на CGI::Ajax.

...