在perl上抓取多维数组

时间:2013-12-12 05:28:51

标签: arrays perl multidimensional-array

我试图学习perl来解析文件,但是在解析多维数组时我遇到了一个问题。

>cat files
ge-1/1/1.81     up    up   NODEB_CLUSTER#81
ge-1/1/1.82     up    up   NODEB_CLUSTER#82
ge-1/1/1.2501   up    up   *** OM_nodeB_VLAN_2501 ***
ge-1/1/1.2502   up    up   *** OM_nodeB_VLAN_2502 ***

如果我尝试用分割空格推送它,它会为第一行和第二行创建4列,但为第三行和第四行创建6列。

我们如何拆分并创建这样的输出:

ge-1/1/1.81,up,up,NODEB_CLUSTER#81
ge-1/1/1.82,up,up,NODEB_CLUSTER#82
ge-1/1/1.2501,up,up,*** OM_nodeB_VLAN_2501 ***
ge-1/1/1.2502,up,up,*** OM_nodeB_VLAN_2502 ***

谢谢大家

2 个答案:

答案 0 :(得分:2)

#!/usr/bin/perl 
use warnings;
use strict;

my @array  = <DATA>;
chomp (@array);
foreach (@array)
{
    my @a = split (/\s\s+/,$_);
    foreach (@a)
    {
        print "$_,";
    }
    print "\n";
}

__DATA__
ge-1/1/1.81     up    up   NODEB_CLUSTER#81
ge-1/1/1.82     up    up   NODEB_CLUSTER#82
ge-1/1/1.2501   up    up   *** OM_nodeB_VLAN_2501 ***
ge-1/1/1.2502   up    up   *** OM_nodeB_VLAN_2502 ***

<强>输出:

ge-1/1/1.81,up,up,NODEB_CLUSTER#81,
ge-1/1/1.82,up,up,NODEB_CLUSTER#82,
ge-1/1/1.2501,up,up,*** OM_nodeB_VLAN_2501 ***,
ge-1/1/1.2502,up,up,*** OM_nodeB_VLAN_2502 ***,

注意我的分裂方式。您需要\s\s+,因为***OM之间有空格。

拆分将在2 spaces or more上拆分。所以这样,它就不会分割*** OM... 因为中间只有一个空格。

答案 1 :(得分:0)

Chomping数组并没有做任何好事

您还可以显式匹配2个或更多空格:

use warnings;                                                                                                                                                                                           
use strict;                                                                                                                                                                                             

foreach my $line (<DATA>)                                                                                                                                                                               
{                                                                                                                                                                                                       
    chomp($line); #remove newline                                                                                                                                                                       
    print join( ',',                                                                                                                                                                                    
            split( /\s{2,}/, $line ) #at least 2 spaces                                                                                                                                                 
        ), "\n";                                                                                                                                                                                        
}                                                                                                                                                                                                       

__DATA__                                                                                                                                                                                                
ge-1/1/1.81     up    up   NODEB_CLUSTER#81                                                                                                                                                             
ge-1/1/1.82     up    up   NODEB_CLUSTER#82                                                                                                                                                             
ge-1/1/1.2501   up    up   *** OM_nodeB_VLAN_2501 ***                                                                                                                                                   
ge-1/1/1.2502   up    up   *** OM_nodeB_VLAN_2502 ***