#!/usr/bin/perluse strict;
use warnings;
use XML::LibXML;
use File::Temp qw(tempfile);
my $host = "host";
my $ip = "ip";
## объявляем массивы для складирования готовой продукции ))
my (@hostname, @addr, @short, @proxy, @group, %unic);
## вспомогательные массивы
my (@f, @f_pre, @f1, @f2);
open ( FH1, $host ) or die "couldn't open $host : $!";
open ( FH2, $ip ) or die "couldn't open $ip : $!";
## исправляем синтаксис XML файлов и сливаем их в один
{local $/ = undef;
while (<FH1>){
s|--|</tag>\n<tag>|g;
@f1 = m|(.*)|s;
}
while (<FH2>){
s|(.*)--|$1</tag>\n</f>|s;
s|--|</tag>\n<tag>|g;
@f2 = m|(.*)|s;
}
}
close FH1;
close FH2;
@f_pre = ("<f>\n<tag>\n");
@f = (@f_pre, @f1, @f2);
## это то, что и будем скармливать модулю XML::LibXML
#print "\n\tthis is a dirty corrected version of the xml file\n\n", @f, "\n\tEOF\n\n\n";
## создаём временный манипулятор и файл (при выходе удаляем его)
my ($fh, $file) = tempfile(UNLINK => 1);
open $fh, ">", $file;
print $fh @f;
close $fh;
## теперь делаем вещи с помощью XPath и метода findnodes
my $parser = XML::LibXML->new;
my $doc = $parser->parse_file("$file");
my @hostnames = $doc->findnodes("/f/tag/host");
foreach my $hn (@hostnames) {
push @hostname, $hn->firstChild->data;
}
my @addrs = $doc->findnodes("/f/tag/ip");
foreach my $ad (@addrs) {
push @addr, $ad->firstChild->data;
}
my @shorts = $doc->findnodes("/f/tag/name");
foreach my $sh (@shorts) {
push @short, $sh->firstChild->data;
}
my @proxys = $doc->findnodes("/f/tag/proxy/name");
foreach my $pr (@proxys) {
push @proxy, $pr->firstChild->data;
}
for (my $i=0; $i<@hostname; $i++) {
my @groups = $doc->findnodes("/f/tag/
dns[text()='$hostname[$i]']/
../group/name/text()");
foreach my $gr (@groups) {
push @{$group[$i]}, $gr->data unless $unic{$gr->data}++;
}
}
for (my $i=0; $i<@hostname; $i++) {
print "--\n";
print "hostname: $hostname[$i]\n";
print "ip: $addr[$i]\n";
print "short: $short[$i]\n";
print "proxy: $proxy[$i]\n";
print "group: ", join(", ", @{$group[$i]}),"\n";
}