Perl分裂模式

时间:2011-01-07 21:33:01

标签: regex perl

根据perldoc,split的语法是:

split /PATTERN/,EXPR,LIMIT

PATTERN也可以是单引号或双引号字符串:split "PATTERN", EXPR。它有什么不同?

编辑:我所知道的差异是分裂反斜杠:split /\\/ vs split '\\'。第二种形式不起作用。

5 个答案:

答案 0 :(得分:6)

看起来它使用它作为“指定模式的表达式”:

  

可以替换图案/ PATTERN /   用表达式来指定模式   在运行时变化。 (做运行时   只编译一次,使用   / $ variable / o。)

编辑:我用它测试了它:

my $foo = 'a:b:c,d,e';
print join(' ', split("[:,]", $foo)), "\n";
print join(' ', split(/[:,]/, $foo)), "\n";
print join(' ', split(/\Q[:,]\E/, $foo)), "\n";

' '特殊情况外,它看起来就像正则表达式。

答案 1 :(得分:2)

PATTERN总是被解释为......好吧,一个模式 - 从不作为文字值。它可以是正则表达式 1 或字符串。字符串被编译为正则表达式。在大多数情况下,行为是相同的,但双重解释可能会产生微妙的差异。

字符串'\\'只包含一个反斜杠。当解释为模式时,就好像你写了/\/,这是无效的:

C:\>perl -e "print join ':', split '\\', 'a\b\c'"
Trailing \ in regex m/\/ at -e line 1.

糟糕!

此外,还有两种特殊情况:

  • 空模式//,它分隔空字符串。
  • 单个空格' ',在首次修剪任何空格后分割为空格  领先或尾随空白。

<子> 1。可以通过内联/.../或通过预编译的qr//引用字符串提供正则表达式。

答案 2 :(得分:1)

我相信没有区别。字符串模式也被解释为正则表达式。

答案 3 :(得分:1)

perl -e 'print join("-",split("[a-e]","regular"))';
r-gul-r

如您所见,分隔符被解释为正则表达式,而不是字符串文字。

所以,它大致相同 - 有一个重要的例外:split(" ",...)和split(/ /,...)不同。

我更喜欢使用/PATTERN/来避免混淆,否则很容易忘记它是一个正则表达式。

答案 4 :(得分:0)

两条可观察的规则:

  • 特殊情况split(" ")相当于split(/\s+/)
  • 其他一切(似乎没有指甲),split("something")等于split(/something/)