我有CGI
脚本从BibTeX
文件中提取参考书目数据,从中构建HTML
。它使用CGI::Ajax
用一个或两个参数调用下面的子例程。大多数情况下,它将是一个以$s
传递的搜索词,但是如果我通过HTML
形式传递一个字符串,子例程将不会完全满意。有一个foreach
循环检查条目并跳过不匹配的条目。现在我可以在这个循环之外打印参数,但是循环本身不会为$s
打印任何内容,也不会找到与之匹配的任何条目。如果在循环$s
内只是空的,子程序将打印整个参考书目,但事实并非如此。
基本上,就好像$s
作为参数传递一样会破坏循环,而子例程中的显式定义可以正常工作。
这是我的代码的简化版本。请原谅邋or或无知的编码,我只是在涉及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;
}
}
有什么想法吗?感谢。
答案 0 :(得分:0)
我的第一个建议是使用warn
/ print STDERR
来验证正在运行的副本,当通过CGI::Ajax
调用时,所有变量($self
), $s
,$kw
,$self->{_bib}
)具有您期望的值。虽然我是CGI::Ajax
的忠实粉丝,但它背后却有一点魔力,而且可能没有像你想象的那样调用outputBib
。
另请注意,CGI在per 请求模型上运行,而不是按页。您是否可以在发送初始页面时填充$self->{_bib}
(并且还在该环境中执行所有成功的测试),然后期望在AJAX请求进入时它仍然存在?如果是这样,那你就不幸了 - 在调用outputBib
并将其移交给{{{}}之前,您需要在代码中的->build_html
内或之前的AJAX处理程序中重建它。 1}}。