我想使用正则表达式拆分字符串,但我遇到了一些问题。我有这个字符串:
$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|
因此,虽然逻辑上第二种方法应该等同于第一种方法,但实际上它的行为方式并不相同。那是为什么?
答案 0 :(得分:10)
这是Perl的split()
函数中的一个特例。
如perldoc中所述:
split(/PATTERN/, expr, [limit])
如果省略PATTERN,[it]会在空格上分割(在跳过任何空格后) 领先的空白)。
当存在正宽度时会产生空的前导字段 匹配字符串的开头; [...]
作为特殊情况,指定空间的模式(
' '
)将分开 白色空间就像没有参数的分裂一样。因此,split(' ')
可以 用于模拟awk的默认行为,而split(/ /)
将用于模拟awk的默认行为 给你尽可能多的初始空字段(空字符串) 领先的空间。