我有一个文件,我正在读一个字符串 然后我的split函数将值读入数组
my @filearray = split(/[(' ') (\n) ([-+*=])] ([/]) ([(]) ([)]) ([;])/, $filestring);
但是,我遇到的问题是拆分不保留分隔符。一个站点建议将分隔符放在()中,这将告诉Perl保留em 但是,这不起作用。
编辑:我想拆分新的行和空格。我也想分开 - ,+,*,/,(,),;同样。我的想法是上面的代码可以工作,但实际上完全删除了所有的分隔符。 〜感谢
答案 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.