2011-03-07 40 views
0

我有一个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}散列的键构建的阵列。奇怪的是

  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; 
    } 
} 

任何想法?谢谢。

+3

请提供您问题的最简单示例。在消除混乱的过程中,您也可能会自己找到解决方案。 – Tim 2011-03-07 01:55:53

+0

我同意,我(不能|不想)找出这里发生的一切。随着您删除不必要的代码,您将自行帮助我们找到违规代码。 – 2011-03-07 02:04:59

+3

如果您可以在循环之外打印$ s的值,但不在循环内,则循环一定不能执行。您是否尝试过打印$ k以确认您正在进入循环?请注意,当作为CGI运行时,可以使用'warn'将调试语句发送到Apache错误日志。然后,尾部error_log查看实际正在进行的操作。一些缩进内部循环也会有助于可读性。 – 2011-03-07 02:31:57

回答

0

我的第一个建议是使用warn/print STDERR来验证实时运行的复制,当通过CGI::Ajax叫,所有的变量($self$s$kw$self->{_bib})的有你期待的值。虽然我是CGI::Ajax的忠实粉丝,但它背后隐藏着一丝神奇的魔力,可能不会像你认为的那样叫outputBib

还请记住,CGI运行在每请求模型,而不是每。当您发送初始页面(并且在该环境中执行所有成功的测试时),您是否可能填充了$self->{_bib},然后期望在AJAX请求进入时它仍然存在?如果是这样,那么你运气不好 - 你需要在你的代码中的outputBib或更早版本的AJAX处理程序中重建它,然后再调用->build_html并将它交给CGI::Ajax

+0

谢谢!傻了,我已经在条件环境中放置了'$ self-> parseBib() ,所以如果一个'CGI'参数表示该页面将成为参考书目,那么它将在构建''BibTeX''文件时解析'BibTeX'文件, HTML'。这足够公平,因为只有这个页面需要'$ self - > {_ bib}'。然而'CGI :: Ajax'不再检查'CGI'参数并且通过它们检查所有条件,所以请求从未被填充过'$ self - > {_ bib}'。所以基本上我试图过于经济,但我认为可以做一些欺骗手段来使它工作。感谢所有的帮助! – holconius 2011-03-07 22:59:00