PERL:解析多行结果

PERL:解析多行结果,perl,parsing,Perl,Parsing,我正在寻找解析出现在多行上的一些文本结果的最佳方法 结果来自ldapSearch,并以如下方式呈现: sn: 1234 name: frank mail: franl@gmail.com phone: 123 456 7890 尽管将所有行放入@array中,然后使用split获取实际值可以很容易地做到这一点,但我的问题是,根据具体的记录,当不包含任何值时,可能会忽略某些行 因此,一些记录可能显示为: sn: 3456 name: mary phone: 234 567 8901 (

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

结果来自ldapSearch,并以如下方式呈现:

sn: 1234

name: frank

mail: franl@gmail.com

phone: 123 456 7890
尽管将所有行放入@array中,然后使用split获取实际值可以很容易地做到这一点,但我的问题是,根据具体的记录,当不包含任何值时,可能会忽略某些行

因此,一些记录可能显示为:

sn: 3456

name: mary

phone: 234 567 8901 (missing mail attribute)
因此,在这种情况下,盲目地读取职位编号是没有帮助的。 有没有办法搜索行名,然后读取结果

非常感谢,,
弗兰克

这可能会实现你的目标:

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

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


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

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

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

我将遍历这些行,寻找当前实体已更改的迹象:

#!/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 );

您是否考虑过使用CPAN中的LDAP模块?是否尝试重新格式化数据并保存到新文件?或者在Perl中将数据加载到数组/散列中?我需要使用的是从LDAP归档中收集特定字段的脚本。由于并非所有属性都是popilated,我需要能够检测哪些字段是有效的,并根据格式名称区分它们:valueYou-good,谢谢。给我一些时间来实现和测试它,我会给你回复的。我正在试第二张纸条……它不那么神秘了一点。@user3008283-很高兴。记住选择最能达到你目标的答案作为正确答案…我对你的实现有一个问题。我当时用ldapsearch查询了一条广告记录,并将所有结果放在一个@array中,如果我将这个数组馈送给你的字符串,它将在使用时挂起。相反,如果我在$string中收集结果并将其提供给脚本,那么它只解析列表的最后一个属性。这是我从ldapsearch dn:CN=12345,OU=myou CN:12345 sn:Smith部门:我的部门名称:frank mail:Frank@gmail.comIt检测的是姓名和电子邮件,而不是其他字段。问题是否可能是结果不完全在同一行?@array或$string都由多行组成。也许我应该试着删除换行符。谢谢你,mpapec,这个字符串是不够的,因为不是所有的字段都在那里。这取决于广告记录。有些属性可能比其他属性多,脚本必须能够识别them@user3008283你能发布这样数组的内容吗?只解析当前属性。
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
chomp(@array);
my %user = map { split /\s*:\s*/, $_, 2 } @array;

# print $user{name}, $user{phone}
#!/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 );