此Perl正则表达式中的@
和@@
是什么意思(从C代码中删除注释):
$line =~ s@//.*@@;
与$line =~ s///.*//;
有什么区别?
@
的任何引用
答案 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;