2012-02-29 12 views

答えて

1

使用するメールアドレス::。これらのことは簡単すぎて正しくやるのは難しいです。 oopsは、十分に近くでopを読まなかったが、このコードは電子メールの分割に有効です。

use strict; 
use warnings; 
use Email::Address; 

my $line = '[email protected];[email protected]'; 
my @addresses = Email::Address->parse($line); 
for my $address (@addresses) { 
    print $address->format, "\n"; 
} 
+0

電子メール::アドレスを使用する前にインストールする必要があります。デフォルトでは存在しません。それ以外の場合は、すべての電子メール検証作業のためのクールなモジュールです – Jassi

2

Perlの数値限定子は、デフォルトでは貪欲です。それは彼らができるだけ掴むことを意味します。

何をしたいことは簡単です:

($username, $domain) = ($string =~ /(.*)@(.*)$/); 

あなたは2番目の部分は何@を持っていないことが100%一定にしたい場合は、あなたが使用することができます。

($username, $domain) = ($string =~ /(.*)@([^@]*)$/); 
+1

最後の行には余分なものがあります。よく貪欲な検索と、私はそれが任意の使用があるとは思わない...ので、あなたの最初のコードと2番目のコードは同じ効果があります。おかげで – Jassi

6

だけgreedynessを使用します。

/(.*)@(.*)$/ 

最初の部分は@に遭遇するまでできるだけ多くなります。最後の部分は、@の後ろのすべてを行の終わりまで取ります。

+0

どのくらい効率的ですか?私も同じことを書いていましたが、ファイルからのそのようなメールIDをすべて除外できる優れたソリューションを探していました。ありがとうKoneark for the regex :) – Jassi

+1

「効率的です」という唯一の真の答えは「ベンチマークです」ですが、そのような単純な正規表現をコンパイルすることは問題ではありません。 Perlは実際には正規表現のために作られました。 ] – Konerak

8
my ($username, $domain) = $str =~ /(.*)@(.*)/; 

詳細perlreの情報:

デフォルトでは、定量化サブパターンは、「貪欲」である、すなわち、できるだけそれ意志 一致何度でも(特定の開始位置を与えられる) つつあります残りのパターンが一致するようにします。

2
$str='[email protected]@[email protected]'; 
$user=qw(); 
$domain=qw(); 
while($str=~m/\@/g){ 
    $user=$`; 
    $domain=$'; 
} 
print "user -> $user\n"; 
print "domain->$domain\n"; 
+0

なぜ '$ user'と' $ domain'を初期化するのはなぜですか?他の解決法(多分index + substring?split?)が速いかもしれません。 –

+0

特別な変数をうまく使います。良いもの – Jassi

+0

ありがとう。 uがstrictとwarningsの両方のモジュールを使用している場合は、エラーや警告を受け取るように初期化する必要があります。 – Jassi

関連する問題