我有一個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