据我所知,执行程序时它会将 $words 拆分为空格
这是不正确的。
split 将匹配运算符视为 qr// 运算符,允许提供预编译模式,甚至在 qr// 出现之前。
虽然空模式通常对匹配和替换运算符具有特殊含义,但对于用作qr// 运算符split 的匹配运算符而言,情况并非如此。空模式具有始终匹配的通常含义。[1]
因此,split // 导致 split 将字符串拆分为单个字符。
$ perl -M5.010 -e'say join ":", split(//, "abcd")'
a:b:c:d
在您的情况下,第三个参数将 split 限制为一次剪切。
$ perl -M5.010 -e'say join ":", split(//, "abcd", 2)'
a:bcd
所以$first 接收$words 中字符串的第一个字符,$second 接收字符串的其余部分。
所以剩下$first =~ //i。
匹配运算符的空模式会导致使用最后一个成功匹配的正则表达式。
$ perl -M5.010 -e'$_ = "foo"; /(.)oo/; /(.)ar/; "moo" =~ //; say $1;'
m
一开始它是一个不起眼的功能,在这里它是在split 之后使用的。这是可怕的代码。 split 执行的匹配算吗?测试表明答案是否定的。
所以我们无法从您发布的代码中判断 $first =~ //i 做了什么,因为它使用了之前未显示的匹配模式。
-
这应该很清楚为什么:
"aaaaa" =~ /(?:aaa)/ # Matches 3 chars at pos 0.
"aaaaa" =~ /(?:aa)/ # Matches 2 chars at pos 0.
"aaaaa" =~ /(?:a)/ # Matches 1 chars at pos 0.
"aaaaa" =~ /(?:)/ # Matches 0 chars at pos 0.