1

我想将一些文本解析成一个表格,如下所示:

Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  10.35.195.1             -   0024.978a.d2d0  ARPA   FastEthernet0/0
Internet  10.35.195.2            73   0002.16a3.9e40  ARPA   FastEthernet0/0
Internet  10.35.195.12          130   0007.0e5b.861a  ARPA   FastEthernet0/0
Internet  10.35.195.14            1   000b.cdc9.7d11  ARPA   FastEthernet0/0
Internet  10.35.195.15            3   0021.5a7b.f2af  ARPA   FastEthernet0/0
Internet  10.35.195.16            0   000c.2909.2298  ARPA   FastEthernet0/0
Internet  10.35.195.17          112   0001.e6a2.5a90  ARPA   FastEthernet0/0
Internet  10.35.195.24          168   0050.564b.ebd4  ARPA   FastEthernet0/0

有固定宽度的文本输入。一些参数,例如“Hardware Addr”,里面有空格。起初,我使用 Text::CSV::Slurp,很难定义分隔符。所以我放弃了。

就想知道,有没有一些perl模块或者嵌入的perl命令(unpack, substr)可以顺利高效的处理这个输入?

4

1 回答 1

4

我会使用Parse::FixedLength模块,它可以正确处理这类问题。这是一个例子:

use strict;
use warnings;
use Parse::FixedLength;

#define your format in the constructor
my $pfl = Parse::FixedLength->new([qw(Protocol:10 Addr:34)], {trim=>1});

open my $file, '<', 'file_to_be_readed.txt' or die $!;
<$file> #if your file has a header, forget it

while( my $line = <$file> ) {
   my $data = $pfl->parse($line);
   my $protocol = $data->{Protocol};
   my $addr = $data->{Addr};
   #...
}

close $file;
于 2013-04-07T09:27:15.623 回答