0

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

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

数据格式如下:

Name                :John van

Email Address       :john@abc.com

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

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

有人可以帮忙吗?

4

2 回答 2

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;
     }
}

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

更好的方法是哪个?

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

问题是什么?

于 2013-10-14T11:31:44.277 回答
0

绝对有一种更简单的方法,但请尝试:

从输入:

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
于 2013-10-14T10:48:16.143 回答