2011-03-07 43 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