使用带有斜杠 // 或引号 ''|"" 的拆分模式有什么区别?

w.k*_*w.k 3 regex string perl split

有时我会被非常基本的事情咬伤。我记得split基于PATTERN用作字符串或正则表达式有不同的行为。现在阅读文档似乎没有这样的区别,在整个文档中,只有一种情况(awk-like 行为),其中模式以带引号的字符串形式呈现,在其他所有示例中,模式都在斜杠之间,作为正则表达式。尽管如此,我还是在这里那里找到了示例/教程,例如,哪里提到了基于字符、字符串和模式的拆分的区别。尽管如此,在测试中,除了在斜杠上拆分使用引号 ( split '/', $some_string)更好之外,我没有发现更多差异。

我今天的具体问题是在点上拆分文件名.并期望在字符串模式上拆分。令我惊讶的'.'是,该模式仍被视为正则表达式,因此以下脚本无法实现此目的:

use strict; use warnings; use 5.010;

my ( @x ) = split '.', 'dir/some_file.ext';
say "@x";
Run Code Online (Sandbox Code Playgroud)

我知道,如何修复我的脚本(使用正则表达式模式),但我仍然不知道,使用模式作为字符串 ( '.') 与使用正则表达式 ( /./) 有什么区别?

ike*_*ami 5

无论您使用什么语法,split'第一个操作数必须计算为正则表达式模式。[1]

这样,split '.'split /./两个分割的正则表达式模式.,这意味着字符串返回通过任何字符,但换行分离。

不要注意单引号字符串('...'q'...'q!...!q{...},等),双引号的字符串("..."qq"..."qq!...!qq{...},等),和正则表达式文字(qr/...//.../m/.../s/...//,等)有不同的解析规则。例如split "\+"split /\+/会产生不同的效果,但这只是因为"\+"只是一种奇怪的写作方式"+"

我建议始终在字符串文字上使用匹配运算符(例如/.../)或qr运算符(例如qr/.../)(' '当然,除外)。这些最适合构建正则表达式模式,并且这些信号向您的读者表明您正在生成正则表达式模式。


  1. 两个例外:

    • 匹配运算符被视为正则表达式字符串文字。例如,/.../被视为qr/.../

    • 计算结果为由单个空格(' 'and " ",但不是/ /or qr/ /)组成的字符串的表达式意味着要返回的字符串由空格分隔,并且应忽略前导空格。