2010-07-26 150 views
2

之前找到电子邮件地址的部分我在Perl.I中有下面这个问题。我有一个文件,我在其中获取电子邮件列表作为输入。Perl正则表达式在@

我想解析所有电子邮件地址中'@'之前的字符串。 (稍后我会将@之前的所有字符串存储在数组中)

例如,在:[email protected],我想解析电子邮件地址并提取abcdefgh。

我的意图是只在'@'之前得到字符串。现在的问题是如何使用正则表达式来检查它。或者是否有任何其他方法使用substr?

虽然我在Perl中使用正则表达式:$ mail =〜“\ @”,但它并未给出结果。

此外,我将如何查找字符'@'是字符串$ mail的索引?

我很感谢有人能帮助我。

#!usr/bin/perl 

$mail = "[email protected]"; 

if ($mail =~ "\@") { 
    print("my name = You got it!"); 
} 
else 
{ 
    print("my name = Try again!"); 
} 

在上面的代码$邮件=〜 “\ @” 没有给我想要的输出,但($邮件=〜 “ABC”)一样。

$ mail =〜“@”只有在给定的字符串$ mail =“abcdefgh \ @ gmail.com”时才有效。

但在我的情况下,我会得到与其电子邮件地址的输入。

不带转义字符。

感谢,

汤姆

回答

1

,如果你想这是什么:

my $email = '[email protected]'; 

$email =~ /^(.+?)@/; 
print $1 

$ a1将是@前面的一切。

2

@符号是双引号字符串中的元字符。如果你把你的电子邮件地址放在单引号中,你就不会遇到这个问题。

此外,如果您只是在尝试,我应该添加必要的评论,但在生产代码中,您不应使用正则表达式解析电子邮件地址,而应使用诸如Mail::Address之类的模块。

+0

[电子邮件地址](http://p3rl.org/Email::Address)更好。 – daxim 2010-07-26 16:44:52

0

如果你想要一个字符串的索引,你可以使用index()函数。即。

my $email = '[email protected]'; 
my $index = index($email, '@'); 

如果你想返回的电子邮件的前半部分,我会使用split()了正则表达式。

my $email = '[email protected]'; 
my @result = split '@', $email; 
my $username = $result[0]; 

或用substr

my $username = substr($email, 0, index($email, '@')) 
+0

您应该在此代码中使用rindex来查找最后@而不是第一个。根据rfc2822,'@'在本地部分('$ username')中作为引用字符串的一部分是有效的。 – 2010-07-26 21:51:26

6

启用警告甚至更好会指出你的问题:

#!/usr/bin/perl 
use warnings; 

$mail = "[email protected]"; 
__END__ 
Possible unintended interpolation of @gmail in string at - line 3. 
Name "main::gmail" used only once: possible typo at - line 3. 

并启用严格的会从连编译阻止它:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $mail = "[email protected]"; 
__END__ 
Possible unintended interpolation of @gmail in string at - line 4. 
Global symbol "@gmail" requires explicit package name at - line 4. 
Execution of - aborted due to compilation errors. 

换句话说,你的问题不是正则表达式工作或不工作,而是你匹配的字符串包含“abcdefgh.com”,而不是你所期望的。