in reply to need help with for loop within an xml

#!/usr/bin/perl use strict; use XML::Simple; use Net::Netmask; my @block; my %seen; my $xml = do {local $/='';<DATA>} ; my $servers = XMLin($xml, ForceArray => 1); foreach my $server (@{$servers->{server}}) { my $br_ip = $server->{BR_IP}; my $num = $server->{CoreLanNum}; #print "Searching for $br_ip\n";; for my $n (1..$num){ my $ip = $server->{'CoreLanIP_'.$n.'__1'}; if ($ip eq $br_ip){ my $mask = $server->{'CoreLanNetmask_'.$n}; # do what you want here with $n $ip or $mask my $block = new Net::Netmask($ip,$mask); push @block,$block unless $seen{$block}++; } } } print $_."\n" for @block; __DATA__ <xml> <server NodeName__1="blr92-nds-rds" CoreLanNum="8" CoreLanIP_1__1="192.169.72.3" CoreLanNetmask_1="255.255.255.0" CoreLanIP_2__1="192.169.72.3" CoreLanIP_3__1="192.169.75.1" CoreLanNetmask_3="255.255.255.0" CoreLanIP_4__1="192.169.75.1" CoreLanNetmask_4="255.255.255.0" CoreLanIP_5__1="192.169.74.1" CoreLanNetmask_5="255.255.255.0" CoreLanIP_6__1="192.169.74.1" CoreLanNetmask_6="255.255.255.0" BR_IP="192.169.73.3" BRLAN="y" CoreLanIP_7__1="192.169.73.3" CoreLanNetmask_7="255.255.255.0" CoreLanIP_8__1="192.169.73.3" CoreLanNetmask_8="255.255.255.0" RouteIP_1__1="192.169.75.0" RouteNetmask_1__1="255.255.255.0"> </server> </xml>
poj

Replies are listed 'Best First'.
Re^2: need help with for loop within an xml
by deep27ak (Novice) on Sep 15, 2015 at 07:22 UTC
    Thanks very much for your reply. I understood this loop
    for my $n (1..$num){ my $ip = $server->{'CoreLanIP_'.$n.'__1'}; if ($ip eq $br_ip){ my $mask = $server->{'CoreLanNetmask_'.$n};

    which did solve one of my problem of searching all the values as per 'corelannum'

    As of now
    foreach my $n (1..$num){ my $corebrip = $server->{'CoreLanIP_'.$n.'__1'} ; my $brmask = $server->{'CoreLanNetmask_'.$n} ."\n"; if ($corebrip eq $br_ip){ print join ("/", $br_ip, $brmask);
    I get the below output
    192.169.73.1/255.255.255.0 192.169.73.1/255.255.255.0 192.169.73.2/255.255.255.0 192.169.73.2/255.255.255.0 192.169.73.3/255.255.255.0 192.169.73.3/255.255.255.0 192.169.73.4/255.255.255.0 192.169.73.4/255.255.255.0 192.169.73.5/255.255.255.0 192.169.73.5/255.255.255.0 192.169.73.6/255.255.255.0 192.169.73.6/255.255.255.0
    so it is searching the complete xml at once as the data I have posted is only one block...so How can I make the script to search block by block?

    For each block it should search for all these variables and perform as I say then move to next block as I guess that would simplify things?

    like for each block I will have different br_ip, CoreLanIP_'.$n.'__1' and  CoreLanNetmask_'.$n

    So for each block it should search corelanip and if it matches br_ip then use the equivalent corelannetmask

      for each block I will have different br_ip

      I don't understand what you mean, your output has different br_ips. Un-comment this to see each block being searched

       #print "Searching for $br_ip\n";
      poj
        Yeah sorry my bad I just verified with different with different subnet values and it IS picking the correct values.

        Can you please help me understand the modification you made to XML:Simple

        as below
        my $xml = do {local $/='';'file.xml'} ; #my $servers = XMLin('file.xml'); my $servers = XMLin($xml, ForceArray => 1);
        What does this do?