2014-02-22 45 views
-1

while循環我寫了一個簡單的解析器使用以下說明.txt文件:在文件退出特殊字符在Perl

my $file2 = "test.txt"; 
open ($process, "<",$file2) or die "couldn't manage to open the file:$file2!"; 

while (<$process>) 

{ 

... 

} 

在某些文件中,我試圖解析有特殊字符就像右箭頭( - >),我不能從文件中粘貼到這裏。每當解析器擊中那個字符( - >)時,它就退出該文件而不處理它直到結束。

有沒有辦法避免它,並繼續處理文件,直到最後?

我正在使用perl 5.6.1(我不能使用更新的),我需要處理的文件可能有這些特殊字符。

感謝您的幫助。

+0

我認爲一種可能性是文件被編碼。我假設你的意思是' - >'是單個字符(右箭頭)。我不確定如何閱讀Perl 5.6上的編碼文件。希望其他人可以參加或者你可以將你的文件轉換爲純文本。如果你發佈了任何錯誤,它也會很有幫助,你也可以打開'$!'而不是'$ file2'在你的打開的行中來獲得更多的信息。 – chilemagic

+0

我想這是非ASCII字符'→'而不是' - >'。什麼是你的輸入編碼(例如UTF-8)?你應該適當地解碼它。 – amon

+0

感謝大家的幫助。 正確,字符是「→」。該文件應該是ASCII碼,我使用公司專有的工具將其轉換爲ASCII碼,但是我不知道該如何處理這個字符。 你們有什麼建議嗎? 在此先感謝 – Francesco

回答

0

我不認爲這是導致你的問題的Perl,但幾乎可以肯定是在那個中間缺失塊。你是否在文件輸入的while模塊中使用了eval?這是一個小例子,其示出了包含流 - >不引起的困難:

#!/usr/bin/env perl 
use warnings; 
use strict; 

while(<DATA>) { 
    print "Data[$.]: $_"; 
} 

__DATA__ 
this is some data 
this is also some data 
-> this looks fine 
foo->dingle also looks fine 

這產生:

$ perl ./foo.pl 
Data[1]: this is some data 
Data[2]: this is also some data 
Data[3]: -> this looks fine 
Data[4]: foo->dingle also looks fine 

所以, - 在Perl>字符是特殊:

「 - >」是一箇中綴去引用運算符,就像在C和C++中一樣。如果 的右側是[...],{...}或(...)下標,那麼左側必須是對數組的硬或符號引用, 是散列,或子程序。 (或者從技術上講,如果一個 位置能夠保存一個硬引用,如果它是一個數組或散列 引用被用於賦值。)請參閱perlreftut和perlref。

否則,右側是方法名或含有任一方法名稱或子程序參考簡單的標量變量 ,並且 左側必須是一個對象(一個幸福的參考)或類 名(即包名稱)。參見perlobj。

所以,如果我不得不猜測,你肯定會使用eval來試圖解析你的內容,而且它無法解除操作符左側的引用和崩潰。如果您需要進一步的幫助,請提供命令行錯誤消息或while循環中的代碼。

+0

感謝您的回覆。 該文件是ASCII文件,但我有「→」字符,這是非ASCII字符。 循環只是做一個簡單的字符串匹配: $ file_line = $ _; $ line ++; if($ file_line =〜m/$ string /) { @string_match = split(/ \ t /,$ file_line); (定義$ string_match [4]) {\ n $ temp}; print「$ string_match [4] \ n」; $ count ++; } 你有什麼建議如何處理這個角色? 在此先感謝。 – Francesco

+0

我加了binmode($ process);文件打開後,現在它似乎工作。 感謝您的建議。 – Francesco