我试图学习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 ***
谢谢大家
答案 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 ***