^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--
解决方法
由于您不希望在拆分中使用任何字符 – 而且您似乎也不希望它们本身成为一个组,因此您需要所谓的“零宽度断言”.由于我们谈论的是插入符号,因此字边界不起作用.它不在一条线的开头或结尾,因此唯一可行的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--