繁体   English   中英

Perl分裂模式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM