2014-11-22 44 views
0

當我運行一個Perl腳本,我得到這個錯誤:在mysscript.plPerl的死在大的XML文件,並使用標準輸入

$twig->parse(\*STDIN); 

unclosed token at line 1, column 0, byte 0 at /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/XML/Parser.pm line 187. 

at mysscript.pl line 8. 

繼承人行8我試圖像其他一些變化:

$twig->parse(\*STDIN); 
$twig->parse(*STDIN); 

但他們沒有工作,我知道它也說我的perl系統文件有問題,但id可以肯定的是,我發現有人有同樣的問題,他不得不修復他的代碼。

回答

1

這是一個XML錯誤,而不是Perl錯誤。它確實表明你已經破壞了XML。 您可以通過解析中的eval來捕獲它。

但實際上 - 考慮這個問題 - 問題可能是您只需要閱讀STDIN的第一行以及parse。 嘗試增加:

{ 
    local $/; 
    $twig -> parse (<STDIN>); 
} 

然而,對於大的XML文件,我很喜歡XML::Twig,因爲它有一個purge方法,它可以讓你扔掉XML你已經處理。 XML的一個缺點是它的內存佔用空間大約是原始文件大小的10倍。所以如果你的文件特別大,你可能會耗盡內存。

+0

我猜它耗盡內存,這是愚蠢的。 – FailedKorv 2014-11-22 20:41:25

+0

檢查我的編輯 - 我想這是因爲你只是閱讀XML的第一行。無論如何你的檔案有多大? – Sobrique 2014-11-22 20:49:03

+0

我不認爲這是問題,STDIN應該用這個語法正確解析 – mirod 2014-11-22 21:09:38

0

$twig->parse(\*STDIN)是正確的語法,所以這不是導致錯誤的原因。

所以它看起來像是你的XML存在問題或者是某個地方存在bug。您是否嘗試檢查XML(使用xmlwfxmllint或類似工具)?如果解析,那麼XML的編碼是什麼?如果它是UTF-16,那麼這可能是問題,libexpat(基於XML :: Twig)似乎遇到了這種編碼問題。

+0

'$ twig-> parse(* STDIN)'*錯誤*。 'parse'方法需要一個包含有效XML文檔的字符串,而不是文件句柄。一般來說,通過使用'* STDIN'或'\ * STDIN',一個*文件句柄*可以作爲參數傳遞,但是有些情況下只能接受其中一個或另一個,而後者是最常見的。 – Borodin 2014-11-22 21:52:18

+0

糟糕! SO gremlins吃了我的反斜槓(實際上,我輸入了它,但沒有在帖子中顯示)。我修好了它。 – mirod 2014-11-23 05:09:14

+0

我道歉,並已得到糾正:'parse'方法罰款(引用)文件句柄。 – Borodin 2014-11-23 17:14:54

0

XML::Twig模塊僅具有兩個要被解析的讀取XML基本方式:

  • parse,一個希望將包含XML數據作爲參數

  • parsefile,這預計字符串指定要讀取的XML文件的名稱(和路徑)

的是沒有選項來傳遞一個打開的文件句柄,如果你寫$twig->parse(\*STDIN)$twig->parse(*STDIN)那麼你將被傳遞(像)分別弦GLOB(0x44b574)*main::STDIN,這顯然不是有效的XML。

我認爲你可以從那裏弄清楚你的電話應該是什麼樣子。如果您傳遞文件名作爲命令行參數,然後最簡單的辦法是寫

$twig->parsefile(shift) 

,但沒有更多的信息,我不能幫你了。

+1

實際上,[XML :: Twig](http://search.cpan.org/dist/XML-Twig/)_does_支持爲'parse'方法提供了一個文件句柄。這裏是perldoc的相關摘錄:「$ source參數應該是一個包含整個XML文檔的字符串,或者它應該是一個開放的IO :: Handle(又名文件句柄)。」 – 2014-11-23 05:43:38

+1

@SamChoukri:謝謝你糾正我。我想我忽略了這一點,因爲在文檔中沒有傳遞文件句柄的例子。 – Borodin 2014-11-23 17:13:48

相關問題