我无法确定为什么我的正则表达式失败了。这是我的代码:
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:
有人可以告诉我我的错误。
答案 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,但我不想掩盖我想要的观点。