Perl分割模式

5
根据perldoc,split的语法如下:
split /PATTERN/,EXPR,LIMIT

但是PATTERN也可以是单引号或双引号括起来的字符串:split "PATTERN", EXPR。这有什么区别吗?

编辑:我知道的一个区别是在反斜杠上进行分割:split /\\/split '\\'。第二种形式不起作用。


你看到的差异是由插值引起的。/\\/ 是一个包含单个反斜杠的模式。'\\' 是一个包含单个反斜杠的字符串。当该字符串被解释为模式时,就好像你写了 /\/,这是无效的。要获得相同的行为,您必须加倍反斜杠:'\\\\' - Michael Carman
@Michael:这些被称为反斜杠转义序列,而不是插值。 - Eugene Yarmash
5个回答

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

除了特殊情况' ',它看起来就像一个普通的表达式。

一个例子是不适用的:split /\\/split '\\' - planetp
1
更准确地说,split EXPR, ...(其中EXPR不是文字/.../)大致相当于do { my $pattern = EXPR; split /$pattern/, ... }(除了' '特殊情况)。这就是为什么'\\'无法工作的原因;生成的$pattern只包含1个反斜杠,而您需要2个才能有一个有效的正则表达式。 - cjm

2

PATTERN总是被解释为模式,而不是字面值。它可以是正则表达式1或字符串。字符串被编译成正则表达式。大部分行为相同,但双重解释可能会导致微妙的差异。

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

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

糟糕!

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

  • 空模式//,它会在空字符串上进行分割。
  • 单个空格' ',它会在首先修剪任何前导或尾随空格后,在空格上进行分割。

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


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

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

因此,它基本上是相同的 - 但有一个重要的例外:split(" ",...)和split(/ /,...)是不同的。

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


1

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


0
两个可观察规则:
1. 特殊情况split(" ") 相当于 split(/\s+/)。     2. 对于其他情况(看起来如此-不要责难我),split("something") 等同于 split(/something/)

它根本不使用\Q\E处理它,而只将其视为/something/ - Jim Davis
这不正确。字符串的行为就像标准正则表达式一样。 - krakover
split ' '就像split /\s+/一样,只是前者跳过了一个开头的空字段。 - ysth

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