2010-10-14 63 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结果直接写。

相关问题