Perl正则表达式中的符号(@)

时间:2019-06-23 13:54:16

标签: regex perl

此Perl正则表达式中的@@@是什么意思(从C代码中删除注释):

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

$line =~ s///.*//;有什么区别?

documentation

中找不到对@的任何引用

3 个答案:

答案 0 :(得分:6)

  

此Perl正则表达式中@@@的含义是什么

它没有任何意义。 s(替代)运算符可以使用任何定界符,对成对的定界符({{1},{}<>[])有特殊情况。可以将其写为()s,//.*,,s#//.*##

如果未用s{//.*}{}或其他定界符替换/,则必须在正则表达式和替换中对其进行转义,这会给类似{{1} }。

这全部记录在@联机帮助页的"Quote and Quote-like Operators"下-包括对单引号(s/\/\/.*//)分隔符的特殊处理,以防止变量插值。

  

perlop(1)有什么区别?

区别在于该示例已损坏且无法正常工作。

答案 1 :(得分:2)

@未出现在正则表达式中。它被用作替换运算符中的定界符。

替换运算符通常写为s/PATTERN/REPLACEMENT/PATTERN是正则表达式,REPLACEMENT被视为双引号字符串。在标准版本的运算符中,斜杠字符(/)被用作分隔符,但是Perl允许程序员选择几乎任何字符作为分隔符。通常这样做是为了避免转义出现在模式或替换中的字符。

在您的示例代码中,程序员选择使用@字符作为分隔符。这是一个不寻常的选择:-)

由于该模式包含/个字符,因此,如果使用了标准定界符,则需要对它们进行转义:

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

这看起来很丑,使用其他定界符是一个不错的选择。我本来会比较容易混淆,例如|

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

答案 2 :(得分:1)

这只是一个不同的符号,您不必在正则表达式本身中转义/。几乎也可以是其他任何特殊符号:

$line =~ s#//.*##g;
$line =~ s!//.*!!g;
$line =~ s&//.*&&g;
$line =~ s|//.*||g;