- вот прям реально такие файлы XML поломанный, михалыч (ok), 17:54 , 03-Июл-18 (1)
вот прям реально такие файлы? XML поломанный
- за подобный формат файлов нужно бить табуреткой по голове до просветления откуда, Pahanivo (ok), 11:13 , 04-Июл-18 (2)
> Добрый день. > имеем 2 файла вида: за подобный формат файлов нужно бить табуреткой по голове до просветления. > как выводить мне из двух файлов скриптом следующее > short: host1.shortname откуда вообще взялся данный тег? > только есть один нюанс, если в файле ip в секции > > <group> > <name>GROUP1</name> > <name>GROUP1</name> > </group> > GROUP1=GROUP1 то вывод если у тебя два тега с одинаковыми данными, то да данные этих тегов одинаковы, что ты хотел сказать? > есть у кого идеи? может кто делал такое!! нанять человека который сможет хотя бы внятно объяснить что он хочет
- gt оверквотинг удален я так понимаю что сопоставление сущностей в двух файлах , ыы (?), 11:48 , 04-Июл-18 (3)
>[оверквотинг удален] > </group> > GROUP1=GROUP1 то вывод > -- > hostname: host1.fullname > ip: 721.0.0.1 > short: host1.shortname > proxy: proxy1.fullname > group: GROUP1 > есть у кого идеи? может кто делал такое!! > Спасибо.я так понимаю что сопоставление сущностей в двух файлах идет в порядке их описания в файлах? а разделение блоков сущностей происходит символами "--" ? ну... складываете содержимое файл в массив по разделителю "--", организуете цикл по массиву, в котором у вас теперь элемент - это сущность, делаете примитивный парсер тэгов и сопоставляете нужное.
- ну, что же я ждал, но первозданный XML файл так и не показываютладно, обойдёмся, михалыч (ok), 16:30 , 06-Июл-18 (9)
ну, что же.. я ждал, но первозданный XML файл так и не показываютладно, обойдёмся )) погнали
#!/usr/bin/perluse strict; use warnings; my $host = "host"; my $ip = "ip";
open ( FH1, $host ) or die "couldn't open $host : $!"; open ( FH2, $ip ) or die "couldn't open $ip : $!"; my (@hostname, @addr, @short, @proxy, @group, %unic);
{ local $/ = undef; while ( <FH1> ) { @hostname = m|<host>(.*)</host>|g; @addr = m|<ip>(.*)</ip>|g; @short = m|<name>(.*)</name>|g; @proxy = m|<proxy>.*?>(.*?)</.*?</proxy>|gs; } } my $count = 0; while ( <FH2> ) { $count++ if /--/; if (m|<name>(.*)</name>|) {push @{$group[$count]}, $1 unless $unic{$1}++;} } close FH1; close FH2; for (my $i=0; $i<@addr; $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"; }
комментарии писать лень, и так всё понятно ))) да, можно пойти по пути предложенному ыы #!/usr/bin/perluse strict; use warnings; undef $/;
my $host = "host"; my $ip = "ip"; open ( FH1, $host ) or die "couldn't open $host : $!"; open ( FH2, $ip ) or die "couldn't open $ip : $!"; my @hosts = split(/--/, <FH1>); my @ips = split(/--/, <FH2>);
close FH1; close FH2; my (@hostname, @addr, @short, @proxy, @group, %unic); for (my $i=0; $i<@hosts; $i++) { $hosts[$i] =~ m|<host>(.*)</host>|; push @hostname, $1; $hosts[$i] =~ m|<ip>(.*)</ip>|; push @addr, $1; $hosts[$i] =~ m|<name>(.*)</name>|; push @short, $1; $hosts[$i] =~ m|<proxy>.*>(.*)<.*</proxy>|s; push @proxy, $1; if ($ips[$i] =~ m|<group>.*?>(.*?)<.*?</group>|s) {push @{$group[$i]}, $1 unless $unic{$1}++;} if ($ips[$i] =~ m|<group>.*>(.*)<.*</group>|s) {push @{$group[$i]}, $1 unless $unic{$1}++;} } for (my $i=0; $i<$#hosts; $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"; }
но есть нюанс ))) цикл while vs цикл for вспомнился бородатый анекдот про нюанс http://bfy.tw/IvBU это что так препод садист изголяется?? ух он какой, у-у-ууу.. ps конечно, цикл for можно переписать по другому, более компактно for (my $i=0; $i<@hosts; $i++) { push @hostname, $1 if $hosts[$i] =~ m|<host>(.*)</host>|; push @addr, $1 if $hosts[$i] =~ m|<ip>(.*)</ip>|; push @short, $1 if $hosts[$i] =~ m|<name>(.*)</name>|; push @proxy, $1 if $hosts[$i] =~ m|<proxy>.*>(.*)<.*</proxy>|s; if ($ips[$i] =~ m|<group>.*?>(.*?)<.*?</group>|s) {push @{$group[$i]}, $1 unless $unic{$1}++;} if ($ips[$i] =~ m|<group>.*>(.*)<.*</group>|s) {push @{$group[$i]}, $1 unless $unic{$1}++;} } такие дела
- usr bin perlmy hosts my ips for do local -- STDIN , Аноним (28), 18:48 , 10-Июл-18 (11) +1
#!/usr/bin/perlmy $hosts = {}; my $ips = {}; for( do{ local $/ = "--"; <STDIN> } ){ next unless( my( $ip ) = m/<ip>([^<]+)/ ); if(/<group>/){ $ips->{$ip} = { map { $_ => 0 } m/<name>([^<]+)/g } ; next ; } $hosts->{$ip} = [ m/<host>([^<]+).*<name>([^<]+)/s ]; } for my $ip ( sort{ $hosts->{$a}->[0] cmp $hosts->{$b}->[0] } keys %$hosts ){ my( $short, $long ) = @{ $hosts->{$ip} }; printf qq|hostname: %s\nip: %s\nshort: %s\nproxy: %s\ngroup: %s\n--\n|, $long, $ip, $short, $long, join(", ", sort keys %{ $ips->{$ip} }); } Пользоваться cat host ip | perl script.pl
|