我正在尝试编写一个Perl脚本来解析一个充满电子邮件和名称的目录,并提取一个电子邮件地址和相应的名称。
目前我正在解析单词Email Address :
然后提取该行,但这就是我被困住的地方。
数据采用以下格式:
Name :John van
Email Address :john@abc.com
我需要将这些数据转换为两个变量,例如$name
和$email
。
有没有更好的方法来解析文件以获取电子邮件地址和名称?我如何处理字符串并重新安排它们。
有人可以帮忙吗?
答案 0 :(得分: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
]
如果你想以行为基础,我的方法是:(未经测试 - sharpshoot):)
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;
}
}
有没有更好的方法来解析文件以获取电子邮件地址和 命名
一个更好的方式?
我如何处理字符串并重新排列。
问题是什么?
答案 1 :(得分: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