У меня есть скрипт 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}
.Странно, что
- цикл в порядке, когда
$s
не пропущен через CGI::Ajax
.Все элементы обрабатываются. - , как только подпрограмма вызывается с
$s
, цикл ничего не возвращает. - , если
@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;
}
}
Есть идеи?Спасибо.