根据perldoc -f split,split()函数的第一个参数是一个正则表达式/PATTERN/。所以如果你要写这个:
split('some text', $string)
相当于:
split( m/some text/, $string )
如果some text 包含正则表达式中的特殊字符,那么它们将被视为特殊字符。所以你的线:
@arr = split('(', $test_str);
将被视为:
@arr = split( m/(/, $test_str );
这可能不是你想要的,因为m/(/ 是一个无效的(你可以说是不完整的)正则表达式。要匹配文字 (,您需要使用反斜杠对其进行转义,因此请改用:
@arr = split( m/\(/, $test_str );
现在你已经注意到 Perl 试图通过将你的第一个参数从字符串 '(' 转换为正则表达式模式 m/(/ 来提供帮助。虽然你可以传入一个字符串作为第一个参数,但我不推荐它——改用m/PATTERN/。
我推荐的原因是因为:
- 模式清楚地表明第一个参数是正则表达式模式,而不仅仅是任何旧字符串。
- 根据
perldoc -f split,有一种特殊情况可以传入一个字符串作为第一个参数:
作为一种特殊情况,指定空格 (' ') 的 PATTERN 将
在空白处拆分就像没有参数的“拆分”一样。
因此,"split(' ')" 可以用来模拟 awk 的默认值
行为,而 "split(/ /)" 会给你尽可能多的 null
初始字段,因为有前导空格。一个“分裂”
"/\s+/" 就像一个 "split(' ')" 除了任何前导
空白产生一个空的第一个字段。没有的“分裂”
arguments 确实在内部执行了“split(' ', $_)”。
最好不要混淆这两者。因此,当您想使用在空格上分割的特殊情况时,请使用' ' 作为split() 的第一个参数,并使用m/PATTERN/ 作为其他所有情况的第一个参数。