2010-10-14 62 views
3

我正在寫一個簡單的Perl腳本(在Windows上),以將對URL的獲取請求的響應下載到文件中。非常直接。除了寫入輸出文件時,我會得到額外的換行符。因此,像代替:爲什麼我會在使用Perl下載的網頁中獲得額外的換行符?

<head> 
    <title>title</title> 
    <link .../> 
</head> 

我得到

<head> 

    <title>title</title> 

    <link .../> 

</head> 

這裏的Perl腳本:

use LWP::Simple; 

my $url = $ARGV[0]; 
my $content = get($url); 

open(outputFile, '+>', $ARGV[1]); 

print outputFile $content; 

close(outputFile); 

我想我可以只得到wget for Windows,但現在這是困擾我。我如何擺脫那些額外的換行符?

+1

爲什麼''+>''爲什麼不是'LWP :: Simple :: getstore'? – 2010-10-14 14:23:14

回答

12
  1. 在示例代碼中,>+模式沒有任何理由。只是說。
  2. LWP::Simple有一個getstore方法。如果您使用LWP::Simple,爲什麼不使用它?
  3. 默認情況下,在win32上運行時將打開:crlf I/O層,該層將\n轉換爲\r\n。但是你正在編寫的數據已經有\r\n,所以你最終會有太多的換行符。如果您希望逐字寫入數據,則應使用binmode,或以:raw開頭。 LWP已經做到了這一點。
-4

chomp($ content)是我的猜測。因爲它看起來好像已經有一些\ n在其中。

編輯: 對不起,我只是意識到,chomp將無法正常工作,除非您將文件分割成行,然後chomp每行,因爲chomp只會chomp輸入字符串的結尾,我的解決方案不會幫助但是,在這種情況下,您可以將其拆分爲\ n \ n,然後加入? 我的確喜歡解決方案在下面的答案中返回的字符串上使用正則表達式。不過對於我來說這是一個小修改:包括一些額外的修改,所以它仍然會分隔線條,但它會檢查2+ \ n或2+ \ r或兩者的任意組合。然後返回一個\ n在這個地方,這樣它只會有一個新行每行(希望)

$ content =〜s/[\ n \ r] +/\ n/g;

EDITED再次上面,不小心把一個!在那裏出於某種原因....不知道爲什麼

4

我猜$content已經包括CRLF換行符和Perl的IO層正在做LF - > CRLF轉換。 (在內部,「\ n」是Perl中的單個字符,通常是LF)。我的open後添加

binmode(outputFile); 

禁用該轉換和$content結果直接寫。

相關問題