8

我无法确定我的正则表达式失败的原因。这是我的代码:

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

4 回答 4

8

在你的声明中$email你正在插值@dawn 这是由于引用。

为避免任何麻烦,只需使用这样的单引号:

my $email = 'rise@dawn.com';
my ($found) = $email =~ /(rise\@dawn\.com)/;
print "Found: $found";
于 2013-07-07T22:07:50.183 回答
7

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

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

my $email = "rise\@dawn.com";
my ($found) = $email =~ /(rise\@dawn\.com)/;
print "Found: $found";
于 2013-07-07T22:06:10.973 回答
6

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

于 2013-07-07T22:06:28.150 回答
1

仅供参考,根据perldoc

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

因此,以下内容也将起作用:

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

顺便说一句,我通常会\Q...\E用来处理那个字面时期,但我不想掩盖我试图表达的观点。

于 2013-07-08T05:03:30.540 回答