При знаке (@) в регулярном выражении Perl - PullRequest
0 голосов
/ 23 июня 2019

Что означает @ и @@ в этом регулярном выражении Perl (, которое удаляет комментарий из кода C ):

$line =~ s@//.*@@;

В чем отличие от $line =~ s///.*//;?

Не удалось найти ссылку на @ в документации

Ответы [ 3 ]

6 голосов
/ 23 июня 2019

Что означает @ и @@ в этом регулярном выражении Perl

Это не имеет никакого значения.Оператор s (замена) может использовать любой разделитель, в частности для парных разделителей ({}, <>, [], ()).То же самое можно записать как s,//.*,,, s#//.*## или s{//.*}{}.

Если бы / не был заменен @ или другим разделителем, его пришлось бы экранировать врегулярное выражение и замена, которые дали бы что-то уродливое, например s/\/\/.*//.

. Все это задокументировано в «Операторы цитирования и цитирования» на странице руководства perlop(1) -включая специальную обработку разделителя одинарных кавычек ('), который предотвращает интерполяцию переменных.

В чем отличие от $line =~ s///.*//;?

Разницачто этот пример не работает и не работает.

2 голосов
/ 24 июня 2019

@ не появляется в регулярном выражении. Он используется в качестве разделителя в операторе замещения.

Оператор подстановки обычно записывается как s/PATTERN/REPLACEMENT/. PATTERN является регулярным выражением, а REPLACEMENT рассматривается как строка в двойных кавычках. В стандартной версии оператора в качестве разделителя используется символ косой черты (/), но Perl позволяет программисту выбирать практически любой символ в качестве разделителя. Обычно это делается для того, чтобы избежать экранирования символов, которые появляются либо в шаблоне, либо при замене.

В вашем примере кода программист решил использовать символ @ в качестве разделителя. Это немного необычный выбор: -)

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

$line =~ s/\/\/.*//;

Это выглядит ужасно, и использование другого разделителя - хороший выбор. Я бы пошел с менее запутанным персонажем, как |.

$line =~ s|//.*||;
1 голос
/ 23 июня 2019

Это просто другой символ, который вам не нужно избегать / в самом регулярном выражении.Также может быть любой другой специальный символ:

$line =~ s#//.*##g;
$line =~ s!//.*!!g;
$line =~ s&//.*&&g;
$line =~ s|//.*||g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...