2014-11-04 3 views
1

Если я использую split так:Perl Split с помощью "*"

my @split = split(/\s*/, $line); 
print "$split[1]\n"; 

с input:

cat dog

я получаю:

a

Однако если я используйте \s+ в split, я получаю:

dog

мне очень интересно, почему они не дают такой же результат? Кроме того, каков правильный способ разделить строку по характеру?

Благодарим за помощь.

ответ

3

\s* эффективно означает ноль или более символов пробега. Между c и a в cat - это нулевые пробелы, дающие результат, который вы видите.

К регулярных выражений, ваша строка выглядит следующим образом:

c 
    zero spaces 
a 
    zero spaces 
t 
    multiple spaces 
d 
    zero spaces 
o 
    zero spaces 
g 

Следуя этой логике, если вы используете \s+ в качестве разделителя, он будет соответствовать только несколько пробелов между cat и dog.

+0

А я вижу. Спасибо, Робби. –

3

* соответствует 0 или более раз. Это означает, что он может соответствовать пустой строке между символами. + соответствует 1 или более раз, что означает, что он должен соответствовать хотя бы одному символу.

Это описано в документации split:

Если PATTERN соответствует пустой строке, то EXPR разделяется на позиции соответствия (между символами).

Кроме того, когда вы разбиваете на пробельных, большую часть времени вы действительно хотите использовать буквальное пространство:

.. split ' ', $line; 

Как описано здесь:

В другом частном случае " split "эмулирует поведение по умолчанию инструмента командной строки awk, когда PATTERN либо опущено, либо буква строка, состоящая из одного пространственного символа r (например, '' или '\ x20 ", , но не, например, "/ /"). В этом случае любое начальное пробельное выражение в EXPR удаляется до расщепления, а PATTERN вместо этого обрабатывается как , если это «/ \ s + /»; в частности, это означает, что любой смежный пробел (а не только один пробел) используется как разделитель. Однако этой специальной обработки можно избежать, указав шаблон «/ /» вместо строки «», тем самым позволяя одиночный пробел быть разделителем.

2

Если вы хотите разделить строку в список отдельных символов, то вы должны использовать пустые регулярки шаблон для split, как этого

my $line = 'cat'; 
my @split = split //, $line; 
print "$_\n" for @split; 

выход

c 
a 
t 

Некоторых люди предпочитают unpack, например

my @split = unpack '(A1)*', $line; 

, который дает точно такой же результат.

Смежные вопросы