2012-03-16 85 views
4
^0806EA^0406F0^^^^^^EF07F7--^E3DC03--^EAFE02-- 
^0406F0^^^FFE209^^^DFF107^^^F6F508^^^E4DE01^^^EF07F7--^E803E6-- 

在上面的代码中,我想拆分这^但问题是,这个十六进制数据具有相同的模式^。如何拆分和保存到阵列

我想要的结果是这样的:

^0806EA ^0406F0^^^^^ ^EF07F7-- ^E3DC03-- ^EAFE02-- 
^0406F0^^ ^FFE209^^ ^DFF107^^ ^F6F508^^ ^E4DE01^^ ^EF07F7-- ^E803E6-- 

或:

0806EA 0406F0^^^^^ EF07F7-- E3DC03-- EAFE02-- 
0406F0^^ FFE209^^ DFF107^^ F6F508^^ E4DE01^^ EF07F7-- E803E6-- 

回答

2

既然你不想在分割用完任何字符 - 而你也似乎并不想让他们作为一个群体自己,你需要的是所谓的“零宽度断言”。由于我们正在谈论插入符号,字边界不起作用。它不在一条线的起点或终点,因此唯一可以工作的ZWA是前瞻或后视。

既然你要打破你的块在特定模式的前,我建议在先行,包括:插入符+非插入符号或字符串的结尾,就像这样:

split /(?=\^(?:[^^]|$))/; 

如下图所示:

while (<DATA>) { 
    my @list = split /(?=\^(?:[^^]|$))/; 
    say "@list"; 
} 

__DATA__ 
^0806EA^0406F0^^^^^^EF07F7--^E3DC03--^EAFE02-- 
^0406F0^^^FFE209^^^DFF107^^^F6F508^^^E4DE01^^^EF07F7--^E803E6-- 

输出:

^0806EA ^0406F0^^^^^ ^EF07F7-- ^E3DC03-- ^EAFE02-- 

^0406F0^^ ^FFE209^^ ^DFF107^^ ^F6F508^^ ^E4DE01^^ ^EF07F7-- ^E803E6-- 
+0

我测试你的代码与我有的数据和结果像我想要的。 完美....非常感谢。 – dummys01 2012-03-16 13:58:24

2

方式一:

perl -pe 's/(?<=.)(?=\^\w)/ /g' infile 

说明:

s/regex/replacement  # Substitution command. 
(?<=.)     # Positive look-behind for any char. 
(?=\^\w)     # Positive look-ahead for '^' plus a word character. 
          # Add a space between them. 

结果:

^0806EA ^0406F0^^^^^ ^EF07F7-- ^E3DC03-- ^EAFE02-- 
^0406F0^^ ^FFE209^^ ^DFF107^^ ^F6F508^^ ^E4DE01^^ ^EF07F7-- ^E803E6--