在Perl中使用Split函数但保留分隔符

时间:2018-02-06 16:39:14

标签: perl

我有一个文件,我正在读一个字符串 然后我的split函数将值读入数组

my @filearray = split(/[(' ') (\n) ([-+*=])] ([/]) ([(]) ([)]) ([;])/, $filestring);

但是,我遇到的问题是拆分不保留分隔符。一个站点建议将分隔符放在()中,这将告诉Perl保留em 但是,这不起作用。

编辑:我想拆分新的行和空格。我也想分开 - ,+,*,/,(,),;同样。我的想法是上面的代码可以工作,但实际上完全删除了所有的分隔符。 〜感谢

2 个答案:

答案 0 :(得分:4)

我认为问题在于你的模式。首先,我认为你无意中创建了一个角色类。 [ ]中的内容列出了可能匹配的字符:

 [(' ') (\n) ([-+*=])]

我不知道你想要匹配什么,所以我不知道如何解决这个问题。

之后我认为你正在努力工作:

([/]) ([(]) ([)]) ([;])

我认为你试图分裂任何这些角色,但你为每个角色制作角色类。你必须逃脱开场线,否则它会开始一个子捕获。我想你想要改变。垂直条|分隔了各种可能性:

/|\(|)|;

要捕获它们,你可以用括号包围整个事物。括号中捕获的任何内容都将成为split

输出列表的一部分
(/|\(|)|;)

这看起来有点难看。您可以使用/x修饰符(split /.../x, ...)使文字空白无关紧要,这样您就可以展开模式以便于阅读:

( / | \( | ) | ; )

如果您展示一些样本数据,也许有人可以提供更多帮助。

答案 1 :(得分:1)

你是对的,括号保持分隔但你的正则表达式被破坏了。明确说明你想要实现什么,然后你就可以得到一个解决方案。

  

如果PATTERN包含捕获组,则对于每个分隔符,   为a捕获的每个子字符串生成一个附加字段   group(按照指定组的顺序,按照   反向引用);如果任何组不匹配,那么它会捕获   "为undef"值而不是子字符串。另外,请注意任何此类   只要有分隔符,就会产生额外的字段   是,每当发生分裂时),这样的附加字段确实如此   不计入LIMIT。请考虑以下表达式   在列表上下文中进行评估(每个返回的列表都在   相关评论):

            split(/-|,/, "1-10,20", 3)
            # ('1', '10', '20')

            split(/(-|,)/, "1-10,20", 3)
            # ('1', '-', '10', ',', '20')

            split(/-|(,)/, "1-10,20", 3)
            # ('1', undef, '10', ',', '20')

            split(/(-)|,/, "1-10,20", 3)
            # ('1', '-', '10', undef, '20')

            split(/(-)|(,)/, "1-10,20", 3)
            # ('1', '-', undef, '10', undef, ',', '20')
$ perl 
my @filearray = split(/[(' ') (\n) ([-+*=])] ([/]) ([(]) ([)]) ([;])/, $filestring);
Invalid [] range "[-+" in regex; marked by <-- HERE in m/[(' ') (\n) ([-+ <-- HERE *=])] ([/ at - line 1.