Разделение строки с помощью регулярного выражения в Perl, когда в начале строки появляется разделитель - PullRequest
2 голосов
/ 23 ноября 2011

Я хочу разбить строку, используя регулярные выражения , но столкнулся с некоторой проблемой. У меня есть эта строка:

$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 Ответ

10 голосов
/ 23 ноября 2011

Это особый случай в функции Perl split().

Как указано в perldoc :

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

Если PATTERN опущен, [он] разделяется на пробел (после пропуска любого начального пробела).

Пустые начальные поля создаются при наличии совпадений положительной ширины в начале строки;[...]

В особом случае указание ШАБЛОНА пробела (' ') будет разбито на пробел так же, как и без аргументов.Таким образом, split(' ') может использоваться для эмуляции поведения по умолчанию в awk, тогда как split(/ /) даст вам столько начальных пустых полей (пустая строка), сколько имеется ведущих пробелов.

...