我一直在寻找解析出现在多行的一些文本结果的最佳方法。
结果来自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)
所以在这种情况下,盲目阅读位置编号无济于事。 想知道一种实际搜索行名然后读取结果的方法吗?
非常感谢, 弗兰克
答案 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 );