输入第一个非空格字符串

时间:2013-12-03 00:06:39

标签: perl

我最近刚问了一个关于从文件中读取并拆分每一行的问题,可以找到here

现在,我有另一个问题。在找到非空格/制表符/空白字符之前,如何读取读取输入?

以下是代码:

#!/usr/bin/perl
 open (ReadFrom, 'data.txt');
 open (WriteTo, '>>data2.txt');
 while (<ReadFrom>) {
 chomp;
 ($hop, $skipme, $ip, $time1) = split(/ /);
 print WriteTo "Hop: $hop\n";
 print WriteTo "IP: $ip\n";
 print WriteTo "Time: $time1\n";
 }
 close (ReadFrom);
 exit;

这是一个输入文件,例如: http://i.imgur.com/QA7dyKz.png

正如您将注意到的,在数字1和9之间,数字前面有一个空格,这显然被视为一个分割,这些数字被用作跳过值而不是跳数值。其余的(10+)工作正常,因为数字前面没有空格。我想要弄清楚的是忽略每个空白字符,直到它找到一个非空白字符然后开始分裂或其他东西。

这是我使用当前代码获得的输出:

Hop: traceroute
IP: www.totalnet.com.ar
Time: (200.123.156.209),
Hop: 
IP: 
Time: www.undisclosed.com
Hop: 
IP: 
Time: www.undisclosed.com
Hop: 
IP: 
Time: www.undisclosed.com
Hop: 
IP: 
Time: www.undisclosed.com
Hop: 
IP: 
Time: www.undisclosed.com
Hop: 
IP: 
Time: ae1x19.wsu5.mich.net
Hop: 
IP: 
Time: xe-4-1-1x76.eq-chi2.mich.net
Hop: 
IP: 
Time: ae-4.584.chic0.tr-cps.internet2.edu
Hop: 
IP: 
Time: xe-2-2-0.0.ny0.tr-cps.internet2.edu
Hop: 10
IP: 64.57.20.74
Time: (64.57.20.74)
Hop: 11
IP: NSS-S-A.TenGigabitEthernet8-3.ar1.EZE1.gblx.net
Time: (64.208.7.70)
Hop: 12
IP: customer-static-210-110-65.iplannetworks.net
Time: (190.210.110.65)
Hop: 13
IP: customer-static-210-110-54.iplannetworks.net
Time: (190.210.110.54)
Hop: 14
IP: customer-static-210-110-141.iplannetworks.net
Time: (190.210.110.141)
Hop: 15
IP: 190.210.125.85
Time: (190.210.125.85)
Hop: 16
IP: mx.radioelectron.com.ar
Time: (200.123.156.209)

1 个答案:

答案 0 :(得分:1)

根据请求发布评论作为答案。

您会收到此行为,因为您使用空格/ /拆分正则表达式而不是文字空间' ',这几乎与/\s+/一样,除了它会删除前导空格。< / p>

此外,像这样的输入并不总是适合解析。另一方面,通常有一个模块可以完成这项工作。我找到了这个,例如:Net::Traceroute