我正在搜索所有以@enron.com 结尾的有效电子邮件地址的字符串。
我的任务是以下行:
my $enronAddress =~/^(.+?)@\@enron\.com/i;
这不是做任何任务,所以我想知道我在这里做错了什么。
您正在根据正则表达式检查未初始化的变量。这可能不是你想要的。
如果您有一个电子邮件地址$address
,您会执行以下操作:
my $address = 'example@enron.com';
if ($address =~ /^(.+)\@enron\.com$/) {
my $to = $1;
}
这不是赋值,而是将未初始化的变量与正则表达式进行比较。没有更多上下文,很难修复您的代码,但首先,将其放在脚本的顶部:
use strict;
use warnings;
从现在开始,在您编写的每个新脚本中都这样做。
然后也许像
my $text = <>;
my $addr = $text if $text =~ /\@enron\.com$/;
您是在寻找字符串中的所有有效地址,还是检查完整的字符串是否为有效地址?我不明白您所说的“这不是进行任何分配”是什么意思,因为您所写的只是正则表达式模式匹配
首先,@
您的模式中有两个标志,这显然是错误的
很大程度上取决于您认为有效的电子邮件地址,但首先这将检查内容是否$enronAddress
是有效地址
if ( $enronAddress =~ /^[^@\s]+\@enron\.com$/i ) { ... }
这将打印出现在$enronAddress
print "$_\n" for $enronAddress =~ /[^@\s]+\@enron\.com/gi;
你为什么不先尝试匹配一个简单的“字符串结尾”正则表达式呢?使用 Perl 的调试器:
DB<3> x 'foo@enron.com' =~ /\@enron\.com$/
0 1
DB<4> x 'foo@enrn.com' =~ /\@enron\.com$/
empty array
这些表明您正在寻找正确的模式。然后为其添加捕获:
DB<5> x ($user) = ('foo@enron.com' =~ /(.+)\@enron.com$/)
0 'foo'
DB<6> x $user
0 'foo'
在代码中它看起来像:
#!/usr/bin/perl
my ($user) = ('foo@enron.com' =~ /(.+)\@enron\.com$/);
print "$user\n";