PERL:解析多行结果

时间:2013-11-19 10:23:15

标签: perl parsing

我一直在寻找解析出现在多行的一些文本结果的最佳方法。

结果来自ldapSearch并以这样的方式呈现:

sn: 1234

name: frank

mail: franl@gmail.com

phone: 123 456 7890

sn: 2345

name: john

mail: john@gmail.com

phone: 123 456 7890

虽然可以通过将所有行放在@array然后使用split来获取实际值来轻松完成,但我的问题是,根据特定记录,当不包含任何值时,某些行可能会被省略

所以有些记录可能会显示为:

sn: 3456

name: mary

phone: 234 567 8901 (missing mail attribute)

所以在这种情况下,盲目阅读位置编号无济于事。 想知道一种实际搜索行名然后读取结果的方法吗?

非常感谢, 弗兰克

3 个答案:

答案 0 :(得分:1)

您可以将所有属性读入哈希,

chomp(@array);
my %user = map { split /\s*:\s*/, $_, 2 } @array;

# print $user{name}, $user{phone}

答案 1 :(得分:0)

这可能会实现您的目标:

#!/usr/bin/perl -w
use strict;

my $infile = 'in.txt';
open my $input, '<', $infile or die "Can't open to $infile: $!";

输入:

sn: 1234
name: frank
mail: franl@gmail.com
phone: 123 456 7890
sn: 2345
name: john
mail: john@gmail.com
phone: 123 456 7890
name: bob # This entry has only a name and number
phone: 44 4232 232

-

while (<$input>){
    chomp;
    my ($sn) = /sn: (\d+)/;
    print "Sn: $sn\n" if $sn;
    my ($name) = /name: (\w+)/;
    print "Name: $name\n" if $name; 
    my ($email) = /mail: (.+\@.+)/;
    print "Email: $email\n" if $email;  
    my ($phone) = /phone: (.*)/;
    print "Phone: $phone\n" if $phone;

    # do something with the variables...

}

输出:

Sn: 1234
Name: frank
Email: franl@gmail.com
Phone: 123 456 7890
Sn: 2345
Name: john
Email: john@gmail.com
Phone: 123 456 7890
Name: bob
Phone: 44 4232 232

答案 2 :(得分:0)

我会迭代这些行,寻找当前实体已经改变的指示:

#!/usr/bin/perl -w

use strict;
use warnings;

my %records;
my $sn = 'unknown';

while (my $line = <>) {
    chomp $line;
    next unless $line;

    my ($key,$value) = $line =~ m/^(\w+):\s*(.*)/;

    if ($key eq 'sn') {
        $sn = $value;
    }

    $records{$sn}->{$key} = $value;
}

use Data::Dumper;

print Dumper( \%records );