我有一个CGI
脚本从BibTeX
文件中拉取参考文献数据,从它的建筑物HTML
。它使用CGI::Ajax
以一个或两个参数调用下面的子例程。大多数情况下,它将作为$s
传递的搜索字词,但如果我通过我的HTML
表单传递字符串,则子例程将不会完全满意。有一个foreach
循环检查条目并跳过不匹配的条目。现在我可以在这个循环之外打印参数,但是循环本身不会打印任何内容,也不会找到与它匹配的任何条目。如果在循环内$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;
}
}
任何想法?谢谢。
请提供您问题的最简单示例。在消除混乱的过程中,您也可能会自己找到解决方案。 – Tim 2011-03-07 01:55:53
我同意,我(不能|不想)找出这里发生的一切。随着您删除不必要的代码,您将自行帮助我们找到违规代码。 – 2011-03-07 02:04:59
如果您可以在循环之外打印$ s的值,但不在循环内,则循环一定不能执行。您是否尝试过打印$ k以确认您正在进入循环?请注意,当作为CGI运行时,可以使用'warn'将调试语句发送到Apache错误日志。然后,尾部error_log查看实际正在进行的操作。一些缩进内部循环也会有助于可读性。 – 2011-03-07 02:31:57