Perl Regex:at符号@是否需要转义?

时间:2013-07-07 22:03:22

标签: regex perl

我无法确定为什么我的正则表达式失败了。这是我的代码:

my $email = "rise@dawn.com";
my ($found) = $email =~ /(rise@dawn\.com)/;
print "Found: $found";

这导致输出:

C:\scripts\perl\sandbox>regex.pl
Found: rise.com

如果我逃脱了@符号,那么我根本就没有输出:

my $email = "rise@dawn.com";
my ($found) = $email =~ /(rise\@dawn\.com)/;
print "Found: $found";

C:\scripts\perl\sandbox>regex.pl
Found:

有人可以告诉我我的错误。

4 个答案:

答案 0 :(得分:7)

始终use strict; use warnings;位于脚本的顶部!

它会警告你有一个未声明的全局变量@dawn。数组也可以插入到双引号字符串中,因此需要

my $email = "rise\@dawn.com";
my ($found) = $email =~ /(rise\@dawn\.com)/;
print "Found: $found";

答案 1 :(得分:7)

您正在插入的$email声明中的

@dawn 这是由于引用。

为避免任何麻烦,只需使用如下单引号:

my $email = 'rise@dawn.com';
my ($found) = $email =~ /(rise\@dawn\.com)/;
print "Found: $found";

答案 2 :(得分:5)

在Perl中的双引号字符串或正则表达式中,后跟单词的@被视为数组的名称,其值将以空格分隔,插入到字符串或正则表达式中位置,类似于"scalar $variables in strings"的处理。因此,您需要在@ 正则表达式中转义$email以使代码正常工作。

答案 3 :(得分:1)

仅供参考,根据perldoc

  

如果使用单引号s''',那么正则表达式和替换将被视为单引号字符串。

所以以下内容也适用:

my $email = q{rise@dawn.com};
my ($found) = $email =~ m'(rise@dawn\.com)';
print "Found: $found";

我通常使用\Q...\E来处理那个字面时期,BTW,但我不想掩盖我想要的观点。