2012-09-26 18 views
2

我需要采取以下字符串并打破它成大块单个字符串查找多个子:在使用Perl

[ToNode =杯订户] [原因=临界服务是 向下] [FROMNODE =杯子出版商] [AppID =思科UP服务器恢复管理器]

每个块被封装在括号中。我期待在Perl中这样做,并且正在寻找一种方法的方向。

谢谢!

+0

'@chunks =分流/(:\] | ^?)(?:\ [| $)/,$ string'为一个相当快速和肮脏的解 – amon

回答

2

可以在][之间的点拆分使用先行和回顾后声明:

$str = '[ToNode=cup-subscriber][Reason=Critical service is down] 
     [FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]'; 

@pieces = split/(?<=\])(?=\[)/,$str; 

See it

+0

这是我用过的。谢谢! –

5

对正则表达式使用/ g修饰符。无论是在列表环境提取到一个数组:

$data = "[ToNode=cup-subscriber][Reason=Critical service is down][FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]" 
my @chunk = ($data =~ /\[(.*?)\]/g); 

或在while循环遍历组块:

$data = "[ToNode=cup-subscriber][Reason=Critical service is down][FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]" 
while ($data =~ /\[(.*?)\]/g) { 
    process($1); 
} 
0

试试这个:

my $str = '[ToNode=cup-subscriber][Reason=Critical service is down][FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]'; 
my %fields = $str =~ m{\[([^][=]+)=([^][=]+)\]}g; 
say "$_: $fields{$_}" for sort keys %fields; 

或者更冗长:

my $str = '[ToNode=cup-subscriber][Reason=Critical service is down][FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]'; 

# Capture all occurrences of ... 
my %fields = $str =~ m{ 
      \[    # Open bracket 
      ([^][=]+)  # Sequence of 1 or more non ][= characters 
      =    # Equals 
      ([^][=]+)  # Sequence of 1 or more non ][= characters 
      \]    # Close bracket 
     }xg; 

# Dump contents of %fields 
say "$_: $fields{$_}" for sort keys %fields;