当分隔符出现在字符串的开头时,在Perl中使用正则表达式拆分字符串

时间:2011-11-23 14:53:23

标签: regex string perl split delimiter

我想使用正则表达式拆分字符串,但我遇到了一些问题。我有这个字符串:

$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|

因此,虽然逻辑上第二种方法应该等同于第一种方法,但实际上它的行为方式并不相同。那是为什么?

1 个答案:

答案 0 :(得分:10)

这是Perl的split()函数中的一个特例。

perldoc中所述:

  

split(/PATTERN/, expr, [limit])

     

如果省略PATTERN,[it]会在空格上分割(在跳过任何空格后)   领先的空白)。

     

当存在正宽度时会产生空的前导字段   匹配字符串的开头; [...]

     

作为特殊情况,指定空间的模式(' ')将分开   白色空间就像没有参数的分裂一样。因此,split(' ')可以   用于模拟awk的默认行为,而split(/ /)将用于模拟awk的默认行为   给你尽可能多的初始空字段(空字符串)   领先的空间。