Что значит "с!" оператор в Perl делать? - PullRequest
4 голосов
/ 08 августа 2009

У меня есть этот фрагмент Perl из сценария, который я перевожу на Python. Я понятия не имею, что это такое! оператор делает; какая-то подстановка регулярных выражений. К сожалению, поиск таких операторов в Google или Stackoverflow не дает много полезных результатов.

 $var =~ s!<foo>.+?</foo>!!;
 $var =~ s!;!/!g;

Что делает каждая строка? Я хотел бы знать, если я снова столкнусь с этим оператором.

И какими будут эквивалентные утверждения в Python?

Ответы [ 7 ]

15 голосов
/ 08 августа 2009

s!foo!bar! совпадает с более распространенным s/foo/bar/, за исключением того, что foo и bar могут содержать косые черты без экранирования, не вызывая проблем. Что он делает, так это заменяет первое вхождение регулярного выражения foo на bar. Версия с g заменяет все вхождения.

13 голосов
/ 08 августа 2009

Это делает точно так же, как $var =~ s///. выполнение поиска и замены в переменной $var.

В Perl вы можете определить символ-разделитель после s. Зачем ? Так, например, если вы сопоставляете «/», вы можете указать другой символ-разделитель (в данном случае «!»), И вам не придется экранировать или вставлять символ, который вам соответствует. В противном случае вы получите (скажем)

s/;/\//g;

, что немного сбивает с толку.

Perlre имеет больше информации об этом.

10 голосов
/ 08 августа 2009

Perl позволяет вам выбрать разделитель для многих его конструкций. Это облегчает понимание того, что происходит в выражениях типа

$str =~ s{/foo/bar/baz/}{/quux/};

Как видите, не все разделители имеют одинаковые эффекты. Символы в скобках (<>, [], {} и ()) используют разные символы для начала и конца. И ?, когда используется как разделитель регулярных выражений, заставляет регулярные выражения совпадать только один раз между вызовами оператора reset().

Может оказаться полезным прочитать perldoc perlop (в частности, разделы на m/PATTERN/msixpogc, ?PATTERN? и s /PATTERN/REPLACEMENT/msixpogce).

3 голосов
/ 08 августа 2009

s - оператор замещения. Обычно он имеет форму s/foo/bar/, но вы можете заменить // символы-разделители на некоторые другие символы, такие как ! . Использование других символов-разделителей может значительно упростить работу с такими объектами, как пути, поскольку вам не нужно экранировать разделители путей.

См. справочную страницу для получения дополнительной информации.

Подобную функциональность для python вы можете найти в re-module .

2 голосов
/ 08 августа 2009

s! - синтаксический сахар для «правильного» оператора s///. По сути, вы можете заменить любой разделитель, какой захотите, вместо '/'s.

Что касается того, что делает каждая строка, первая строка соответствует вхождениям регулярного выражения <foo>.+?</foo> и заменяет весь лот ничем. Второй соответствует регулярному выражению ; и заменяет его на /.

s/// является оператором замены. Требуется регулярное выражение и строка подстановки.

s/regex/replace string/;

Он поддерживает большинство (все?) Нормальных переключателей регулярных выражений, которые используются обычным образом (добавляя их в конец оператора).

2 голосов
/ 08 августа 2009

s - оператор замещения. Обычно для разделителя используется «/»:

s/foo/bar/

, но это не обязательно: вместо этого в качестве разделителей можно использовать ряд других символов. В этом случае, '!' был использован в качестве разделителя, по-видимому, чтобы избежать необходимости экранировать символы '/' в реальном тексте, который нужно заменить.

В вашем конкретном случае в первой строке удаляется сопоставление текста '. +?'; то есть он удаляет теги 'foo' с содержимым или без него.

Вторая строка заменяет все ';' символы с символами '/', глобально (все случаи).

Эквивалентный код на Python использует модуль re:

f=re.sub(searchregx,replacement_str,line)
0 голосов
/ 08 августа 2009

И эквивалент Python должен использовать модуль re.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...