Шаблон расщепления Perl - PullRequest
       1

Шаблон расщепления Perl

5 голосов
/ 08 января 2011

Согласно perldoc , синтаксис для split:

split /PATTERN/,EXPR,LIMIT

Но PATTERN также может быть строкой в ​​одинарных или двойных кавычках: split "PATTERN", EXPR. Какая разница?

Редактировать: Различие, о котором я знаю, заключается в разделении на обратную косую черту: split /\\/ против split '\\' Вторая форма не работает.

Ответы [ 5 ]

6 голосов
/ 08 января 2011

Похоже, он использует это как "выражение для определения шаблонов":

Шаблон / PATTERN / может быть заменен с выражением для указания шаблонов которые меняются во время выполнения. (Делать время выполнения компиляция только один раз, используйте / $ variable / o.)

редактировать: я проверил это с:

my $foo = 'a:b:c,d,e';
print join(' ', split("[:,]", $foo)), "\n";
print join(' ', split(/[:,]/, $foo)), "\n";
print join(' ', split(/\Q[:,]\E/, $foo)), "\n";

За исключением специального случая ' ', он выглядит как регулярное выражение.

2 голосов
/ 08 января 2011

PATTERN всегда интерпретируется как ... ну, шаблон - никогда как буквальное значение. Это может быть регулярное выражение 1 или строка. Строки компилируются в регулярные выражения. По большей части поведение такое же, но могут быть тонкие различия, вызванные двойной интерпретацией.

Строка '\\' содержит только одну обратную косую черту. Когда интерпретируется как шаблон, это как если бы вы написали /\/, что недопустимо:

C:\>perl -e "print join ':', split '\\', 'a\b\c'"
Trailing \ in regex m/\/ at -e line 1.

Oops!

Кроме того, есть два особых случая:

  • Пустой шаблон //, который разбивается на пустую строку.
  • Один пробел ' ', который разделяется на пробел после первой обрезки любого ведущие или конечные пробелы.

1. Регулярные выражения могут быть либо встроенными /.../, либо через предварительно скомпилированную строку qr// в кавычках.

1 голос
/ 08 января 2011
perl -e 'print join("-",split("[a-e]","regular"))';
r-gul-r

Как видите, разделитель интерпретируется как регулярное выражение, а не как строковый литерал.

Итак, в основном это одно и то же - с одним важным исключением: split(" ",...) и split(/ /,...) различаются.

Я предпочитаю использовать /PATTERN/, чтобы избежать путаницы, легкозабудь, что это регулярное выражение в противном случае.

1 голос
/ 08 января 2011

Я верю, что нет никакой разницы. Шаблон строки также интерпретируется как регулярное выражение.

0 голосов
/ 08 января 2011

Два наблюдаемых правила:

  • особый случай split(" ") эквивалентен split(/\s+/).
  • для всего остального (кажется - не гвозди меня), split("something") равно split(/something/)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...