我想使用正则表达式拆分字符串,但我遇到了一些问题。我有这个字符串:
$text=" one two three";
然后我试着把它分成字母:
#@words=split(" ", $text); #1 this works
@words=split("[^a-zA-Z]", $text); #2 this doesn't work
for $word (@words){
printf "word: |$word|n";
}
所以注释的方法(1)工作正常。如预期的那样,我得到打印:
word: |one|
word: |two|
word: |three|
然而,使用第二种方法(2)我得到这个:
word: ||
word: |one|
word: |two|
word: |three|
因此,尽管逻辑上第二个方法应该与第一个方法等效,但实际上它的行为方式并不相同。为什么呢?
这是Perl的split()
函数中的一个特例。
如perldoc:
所述
split(/PATTERN/, expr, [limit])
如果省略PATTERN,[它]在空格上分割(跳过任何)领先的空格)。
当有正宽度时,将产生空的前导字段匹配字符串的开头;[…)
作为一种特殊情况,指定一个PATTERN的空间(
' '
)将分裂为on空白就像没有参数的分割一样。因此,split(' ')
可以将用于模拟awk的默认行为,而split(/ /)
将用于模拟awk的默认行为给你尽可能多的初始空字段(空字符串)主要空间。