2012-07-31 23 views
0

我有一個Perl腳本讀取三個文件並在讀取每個文件後寫入新文件。一切都是一個線程。Perl腳本陷入終端沒有明顯的原因

在此腳本中,我打開並處理三個文本文件並將內容存儲在散列中。這些文件很大(接近3 MB)。

我使用一個循環來遍歷每個文件(打開 - >閱讀 - >做一些動作(哈希表) - >關閉)

我注意到的是,每當我經過第一掃描文件,我的Cygwin shell中的Perl終端窗口卡住了。當我點擊回車鍵時,我可以看到腳本沒有任何問題地處理剩下的文件。

這很奇怪,因爲在我的腳本中沒有從STDIN讀取。而且,同樣的邏輯適用於所有三個文件,因爲所有內容都在同一個循環中。

有沒有人在這裏遇到類似的問題?處理大文件或大哈希時通常會發生這種情況嗎?

我不能在這裏發佈腳本,但是發表的內容並不多。 這可能是我的Cygwin shell中的問題嗎?

如果這個問題沒有消失,我該如何規避它?就像在腳本進行時提供輸入輸入一樣?更重要的是,我該如何調試這樣的問題?

sub read_set 
{ 
@lines_in_set =(); 
push @lines_in_set , $_[0]; 
while (<INPUT_FILE>) 
    { $line = $_; 
      chomp($line); 
      if ($line=~ /ENDNEWTYPE/i or $line =~ /ENDSYNTYPE/ or eof()) 
      { 
      push @lines_in_set , $line; 
      last; 
      } 
      else 
      { 
      push @lines_in_set , $line;  
      } 
    } 
    return @lines_in_set; 
} 

-------->我想我找到了問題: - 或eof()調用確保腳本將被卡住!不知何故只發生在第一次。我不知道爲什麼

+2

3MB並不是一個巨大的文件。我建議你發佈一些代碼,以便我們可以幫助你。把你現有的代碼放到最短的代碼片段中,然後編輯你的問題來包含代碼。 – DavidO 2012-07-31 21:30:13

+0

3MB不是一個巨大的文件。我們無法查看代碼就無法進行調試;投票結束。 – geoffspear 2012-07-31 21:30:15

+1

@Wooble:給他一分鐘更新它。只有需要更多信息的關閉問題纔會提示用戶在幾分鐘後冗餘地發佈問題並提供更多信息。 – Wug 2012-07-31 21:34:05

回答

2

eof()呼叫是問題。見perldoc -f eof

eof與空括號是指通過while (<>)訪問的僞文件,其中包括或者全部是@ARGV命名的文件,或者STDIN如果有沒有。

,特別是:

請注意,該函數實際上讀入一個字符,然後「ungetc函數」 S,所以是不是在交互的環境中非常有用。

但是你的循環從另一個句柄中讀取,其中一個名爲INPUT_FILE

撥打eof(INPUT_FILE)會更有意義。但即使這可能沒有必要;您的外部循環將在達到INPUT_FILE的末尾時終止。

一些更多的建議,沒有涉及到你所看到的症狀:

添加

use strict; 
use warnings; 

靠近你的腳本的頂部,並更正此產生的任何錯誤信息(perl -cw script-name做了編譯期只檢查)。您需要使用myperldoc -f my)聲明變量。並使用一致的縮進;我建議您可以在大多數Perl文檔中找到相同的樣式。