[英]Perl split pattern
根据perldoc ,split的语法是:
split /PATTERN/,EXPR,LIMIT
但PATTERN
也可以是单引号或双引号字符串: split "PATTERN", EXPR
。 它有什么不同?
编辑:我所知道的差异是分裂反斜杠: split /\\\\/
vs split '\\\\'
。 第二种形式不起作用。
看起来它使用它作为“指定模式的表达式”:
模式/ 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";
除了' '
特殊情况,它看起来就像一个正则表达式。
PATTERN
总是被解释为......好吧,一个模式 - 从不作为文字值。 它可以是正则表达式1或字符串。 字符串被编译为正则表达式。 在大多数情况下,行为是相同的,但双重解释可能会产生微妙的差异。
字符串'\\\\'
仅包含一个反斜杠。 当解释为模式时,就好像你写了/\\/
,这是无效的:
C:\>perl -e "print join ':', split '\\', 'a\b\c'"
Trailing \ in regex m/\/ at -e line 1.
哎呀!
此外,还有两种特殊情况:
//
,在空字符串上分割。 ' '
,在首次修剪任何前导或尾随空格后在空白处分裂。 1.可以通过内联/.../
或通过预编译的qr//
引用字符串提供正则表达式。
我相信没有区别。 字符串模式也被解释为正则表达式。
perl -e 'print join("-",split("[a-e]","regular"))';
r-gul-r
如您所见,分隔符被解释为正则表达式,而不是字符串文字。
所以,它大致相同 - 有一个重要的例外: split(" ",...
)和split(/ /,...
)是不同的。
我更喜欢使用/PATTERN/
以避免混淆,否则很容易忘记它是一个正则表达式。
两个可观察的规则:
split(" ")
等同于split(/\\s+/)
。 split("something")
等于split(/something/)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.