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

在Perl中使用Split函数但保留分隔符,perl,Perl,我有一个文件,我正在读成一个字符串 然后,我的split函数将值读入数组 my @filearray = split(/[(' ') (\n) ([-+*=])] ([/]) ([(]) ([)]) ([;])/, $filestring); 但是,我遇到的问题是,拆分没有保留分隔符。一个站点建议将分隔符放在其中,以告诉Perl保留em 然而,这不起作用 编辑:我想在新行和空格上拆分。我还想在-,+,*,/,,上拆分,,,;也我的想法是上面的代码可以工作,但实际上完全删除了所有分隔符。 ~Th

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

my @filearray = split(/[(' ') (\n) ([-+*=])] ([/]) ([(]) ([)]) ([;])/, $filestring);
但是,我遇到的问题是,拆分没有保留分隔符。一个站点建议将分隔符放在其中,以告诉Perl保留em 然而,这不起作用

编辑:我想在新行和空格上拆分。我还想在-,+,*,/,,上拆分,,,;也我的想法是上面的代码可以工作,但实际上完全删除了所有分隔符。
~Thank

您说得对,括号保留分隔符,但您的regexp已损坏。清楚地说明你想要实现什么,然后你可能会得到一个解决方案

如果模式包含捕获组,则对于每个分隔符, 为每个由 按照指定组的顺序分组,如 反向参考;如果任何组不匹配,则它将捕获 未定义值,而不是子字符串。此外,请注意,任何此类 只要有一个分隔符 是,每当发生拆分时,这样一个附加字段 不计入极限。考虑下面的表达式 在列表上下文中计算每个返回的列表在 相关评论:

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

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

 [(' ') (\n) ([-+*=])]
我不知道你想匹配什么,所以我不知道如何为你解决这个问题

在此之后,我认为您正在努力工作两个方面:

([/]) ([(]) ([)]) ([;])
我想你是在尝试分割这些角色中的任何一个,但是你为每个角色创建了角色类。您必须退出打开选项,否则它将启动子选项。我想你需要一个替代品。竖条|分隔了以下可能性:

/|\(|)|;
为了捕捉它们,你可以用括号把整个东西括起来。括号中捕获的任何内容都将成为拆分输出列表的一部分:

这看起来有点难看。可以使用/x修改器拆分/../x。。。要使文字空白变得无关紧要,以便展开模式以使其更易于阅读,请执行以下操作:

( / | \( | ) | ; )

如果您展示一些示例数据,也许有人能提供更多帮助。

这是一个难看的正则表达式,可能有点过头了。将正则表达式括起来告诉它捕获确实有效,但是如果没有一些示例数据和期望的结果,就很难确定。
(/|\(|)|;)
( / | \( | ) | ; )