我是 PERL 新手(尽管我在 reg-ex 方面有很好的背景),我正在浏览一个 Perl 脚本,它有一个字符类
$alwayssep = "[\\?!()\";/\\|‘]";
谁能向我解释一下这是什么意思?我可以看到它意味着任何字符,包括?, !, (,),",;,/,|,'
但我不明白为什么问号和管道之前有两个反斜杠?通常我们只使用一个反斜杠来转义,在perl中有什么不同吗?
答案1
由于不幸使用双引号插值来定义正则表达式,代码变得一团糟;这qr/.../
操作员应该改用。人们可以调试正则表达式,而不是将找出插值规则作为代码清理的一部分:
#!/usr/bin/env perl
use strict;
use warnings;
use re 'debugcolor';
my $blah = "[\\?!()\";/\\|‘]";
print "something\n" if "not important" =~ m/$blah/;
此运行将正则表达式显示为[\?!()%";/\|%x{e2}%x{80}%x{98}]
,其中古怪的%x
位表明‘
确实是一个智能引用;一些软件(可能)已经破坏了这段代码。乐趣!至于修复,请重写代码以使用qr
,然后使用 验证新代码re
:
#!/usr/bin/env perl
use strict;
use warnings;
use re 'debugcolor';
my $blah = qr#[?!()";/|']#;
use Data::Dumper; warn Dumper $blah;
print "something\n" if "not important" =~ m/$blah/;
我将让您决定是否\
应该成为正则表达式的一部分,并思考为什么它似乎被列出了两次。该代码有单元测试和文档,对吧?