1

我正在搜索所有以@enron.com 结尾的有效电子邮件地址的字符串。

我的任务是以下行:

my $enronAddress =~/^(.+?)@\@enron\.com/i;

这不是做任何任务,所以我想知道我在这里做错了什么。

4

4 回答 4

2

您正在根据正则表达式检查未初始化的变量。这可能不是你想要的。

如果您有一个电子邮件地址$address,您会执行以下操作:

my $address = 'example@enron.com';
if ($address =~ /^(.+)\@enron\.com$/) {
  my $to = $1;
}
于 2012-10-10T21:17:03.467 回答
2

这不是赋值,而是将未初始化的变量与正则表达式进行比较。没有更多上下文,很难修复您的代码,但首先,将其放在脚本的顶部:

use strict;
use warnings;

从现在开始,在您编写的每个新脚本中都这样做。

然后也许像

my $text = <>;
my $addr = $text if $text =~ /\@enron\.com$/;
于 2012-10-10T21:17:24.770 回答
2

您是在寻找字符串中的所有有效地址,还是检查完整的字符串是否为有效地址?我不明白您所说的“这不是进行任何分配”是什么意思,因为您所写的只是正则表达式模式匹配

首先,@您的模式中有两个标志,这显然是错误的

很大程度上取决于您认为有效的电子邮件地址,但首先这将检查内容是否$enronAddress是有效地址

if ( $enronAddress =~ /^[^@\s]+\@enron\.com$/i ) { ... }

这将打印出现在$enronAddress

print "$_\n" for $enronAddress =~ /[^@\s]+\@enron\.com/gi;
于 2012-10-10T21:19:47.383 回答
1

你为什么不先尝试匹配一个简单的“字符串结尾”正则表达式呢?使用 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";
于 2012-10-10T21:15:46.113 回答