如何分割并保存到数组

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个回答

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--

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--

我用我手头的数据测试了你的代码,结果正是我想要的。非常感谢。 - dummys01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接