【问题标题】:grab multidimensional array on perl在perl中抓取多维数组
【发布时间】:2013-12-12 23:21:23
【问题描述】:

我正在尝试学习 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 ***

谢谢大家

【问题讨论】:

    标签: arrays perl multidimensional-array


    【解决方案1】:
    #!/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 个空格。

    【讨论】:

    • 或者你可以split(/\s+/, $_, 4) 在四个值后停止拆分。
    • TMTOWTDI。这就是 perl 的美妙之处。
    • s+ 是 2 个空格或更多?
    • 没有。 \s+ 如果是一个或多个空格。因此我必须在\s+ 之前添加\s,这意味着在2 or more 空格上拆分。
    【解决方案2】:

    咀嚼数组并没有什么好处

    您还可以显式匹配 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 ***                                    
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2019-06-12
    • 2014-03-16
    • 2014-11-09
    • 2011-06-26
    相关资源
    最近更新 更多