2010-07-26 1 views
2

У меня есть эта проблема ниже в Perl.I есть файл, в котором я получаю список писем в качестве ввода.Perl RegEx, чтобы найти часть адреса электронной почты до @

Я хотел бы проанализировать строку перед «@» всех адресов электронной почты. (Позже я буду хранить всю строку перед @ в массиве)

Для примера. в: [email protected], я хотел бы проанализировать адрес электронной почты и извлечь abcdefgh.

Мое намерение состоит в том, чтобы получить только строку перед «@». Теперь вопрос в том, как проверить это, используя регулярное выражение. Или есть ли другой метод, использующий substr?

В то время как я использую регулярное выражение: $ mail = ~ "\ @" в Perl, это не дает мне результата.

Также, как я нахожу, что символ «@» есть в каком индексе строки $ 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";

Но в моем случае я получаю вход с адресом электронной почты как свой.

Не с escape-символом.

Спасибо,

Том

ответ

1

Что делать, если вы пытались это:

my $email = '[email protected]'; 

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

$ 1 будет все перед @.

2

Знак @ - это метасимвол в строках с двойными кавычками. Если вы поместите свой адрес электронной почты в одинарные кавычки, вы не получите эту проблему.

Кроме того, я должен добавить обязательный комментарий, что это нормально, если вы просто экспериментируете, но в производственном коде вы не должны анализировать адреса электронной почты с использованием регулярных выражений, а вместо этого использовать такой модуль, как Mail::Address.

+0

[Email: Адрес] (http://p3rl.org/Email::Address) лучше. – daxim

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 в этом коде для поиска последнего @ не первого. '@' действителен в локальной части ('$ username') как часть строки с кавычками в соответствии с rfc2822. –

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», а не то, что вы ожидали.

Смежные вопросы