【问题标题】:Extract email-ids and names using perl使用 perl 提取电子邮件 ID 和名称
【发布时间】:2013-10-14 10:42:03
【问题描述】:

我正在尝试编写一个 Perl 脚本来解析一个充满电子邮件和姓名的目录,并提取一个电子邮件地址和相应的姓名。

目前我正在解析单词Email Address :,然后提取该行,但这就是我卡住的地方。

数据格式如下:

Name                :John van

Email Address       :john@abc.com

我需要将这些数据放入两个变量中,例如 $name$email

有没有更好的方法来解析文件以获取电子邮件地址和姓名?如何处理字符串并重新排列它们。

有人可以帮忙吗?

【问题讨论】:

  • 请给我们看一小部分输入文件。然后我可以帮助你。
  • 我在我的问题中给出了文件的摘录作为示例

标签: perl email extract


【解决方案1】:

数据:(\n 只是为了理解而隐含)

Name                :John van\n
\n 
Email Address       :john@abc.com\n
\n

基于正则表达式:

use Data::Dumper;    
my @data = m/Name\s*:([A-Za-z\s]*)\n\nEmail Address\s*:([A-Za-z\s]*@[A-Za-z\s]*.[A-Za-z]*)\n/g;
print Dumper @data;

会给

$VAR = [
           John van,
           john@abc.com
       ]

如果你想根据行来做,我的方法是:(未测试 - 锐枪):)

 my @data = (
                'Name                :john van',
                '',
                'Email Address       :john@abc.com',
                ''
            );
 my (@persons, $name, $email);
 my $gotName = 0;
 my $gotEmail = 0;
 while(@data) { # data is your read in filehandle
     if (/^Name/) {
         $name = $_;
         $name =~ s/.*://;
         chomp($name);
         $gotName++;
     }
     if (/^Email/) {
         $mail= $_;
         $mail=~ s/.*://;
         chomp($mail);
         $gotEmail++;
     }
     if ($gotName == 1 and $gotEmail == 1) {
         push(@persons, ($name,$email));
         $gotName = 0;
         $gotEmail = 0;
     }
}

有没有更好的方法来解析文件以获取电子邮件地址和 名字?

哪个更好?

如何处理字符串并重新排列它们。

问题是什么?

【讨论】:

    【解决方案2】:

    肯定有更简单的方法,但请尝试:

    来自输入:

    Name:   John Van
    
    Email Address:  john@abc.com
    
    Name:   John Doe
    
    Email Address:  johnD@123.com
    
    
    #!/usr/bin/perl
    use warnings;
    use strict; 
    
    my $emails = 'email.txt';
    open my $input, '<', $emails or die "Can't open $emails: $!";
    
    my (%data, @name, @email);
    while(<$input>){
        push @name, $1 if /Name:\s+(.*)/;
        push @email, $1 if /Email Address:\s+(.*)/;
        $data{$name[$_]} = $email[$_] for 0 .. $#name;
    }
    
    for my $name (keys %data){
        my $email = $data{$name};
        print "$name\t$email\n"
    }
    

    输出:

    John Doe    johnD@123.com
    John Van    john@abc.com
    

    【讨论】:

    • 我需要类似:$name = John van 和 $email = john@abc.com
    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多