子程序参数显然在循环中丢失

时间:2011-03-07 01:54:14

标签: perl foreach arguments

我有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}哈希的键构建的数组。很奇怪

  1. $s未通过CGI::Ajax时,循环正常。处理所有元素。
  2. 一旦使用$s调用子例程,循环就不会返回任何内容。
  3. 如果将@k定义为一个简单的数组,则循环起作用并且$s可以在循环中打印;
  4. 我像这样构建$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 :(得分:0)

我的第一个建议是使用warn / print STDERR来验证正在运行的副本,当通过CGI::Ajax调用时,所有变量($self), $s$kw$self->{_bib})具有您期望的值。虽然我是CGI::Ajax的忠实粉丝,但它背后却有一点魔力,而且可能没有像你想象的那样调用outputBib

另请注意,CGI在per 请求模型上运行,而不是按。您是否可以在发送初始页面时填充$self->{_bib}(并且还在该环境中执行所有成功的测试),然后期望在AJAX请求进入时它仍然存在?如果是这样,那你就不幸了 - 在调用outputBib并将其移交给{{{}}之前,您需要在代码中的->build_html内或之前的AJAX处理程序中重建它。 1}}。