繁体   English   中英

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

[英]At sign (@) in Perl Regular Expression

这个 Perl Regex( 从 C 代码中删除注释 )中@@@的含义是什么:

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

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

文档中找不到对@任何引用

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

它没有任何意义。 s (替代)运算符可以使用任何分隔符,但成对分隔符( {}<>[]() )的特殊情况。 同样可以写成s,//.*,, , s#//.*##s{//.*}{}

如果/没有被@或其他分隔符替换,则必须在正则表达式和替换中对其进行转义,这会产生像s/\\/\\/.*//这样丑陋s/\\/\\/.*//

这一切都记录在perlop(1)联机帮助页中的“Quote and Quote-like Operators”下——包括对单引号 ( ' ) 分隔符的特殊处理,它可以防止变量插值。

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

不同之处在于该示例已损坏且不起作用。

@没有出现在正则表达式中。 它被用作替换运算符中的分隔符。

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

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

由于模式包含/字符,如果使用标准分隔符,则需要对它们进行转义:

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

这看起来很难看,使用不同的分隔符是一个不错的选择。 我会选择一个不那么令人困惑的角色,比如| .

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM