in reply to Need help with a nested IF statement

Why are you printing the IP address when you have haven't found one (i.e. when the inner if hasn't been entered)? Don'thide errors. Please use use strict; use warnings;!

use strict; use warnings; my $ifconfig = "ifconfig -a"; my @nic = qx |$ifconfig| or die("Can't get info from ifconfig: $!\n"); for (@nic){ if (my ($device) = /^fjgi(\d)/){ if (my ($ip) = /inet ([\d.]+)/){ print "Device $device has the IP Address of $ip\n"; } } }

I have two IF statements that work on their own but when I place them both into my foreach loop, the second IF gets skipped over

Are you sure there's a line that both starts with fjgi and contains inet? I'm not familiar with the output of ifconfig, but I suspect that isn't the case.

Replies are listed 'Best First'.
Re^2: Need help with a nested IF statement
by MikeDexter (Sexton) on Nov 02, 2009 at 17:09 UTC

    Hi there. I tried changing my IF's to resemble your example but when I run the script I don't get any output. This script from the top will first identify the operating system and then dump into the appropriate loop per the os it finds. For Solaris, $opsys is not true for linux so we jump to the else statement. There is the code as per your suggestion. When I run the script on Solaris is says I am on Solaris but no other data is printed at all.

    Would you mind taking another look to see if I missed something?

    use strict; use warnings; my($opsys) = "$^O"; print "Hello, your operating system is: $opsys" . "\n"; if ($opsys =~ /linux/) { my $ifconfig = "/sbin/ifconfig"; my @nic = qx |$ifconfig| or die ("Can't get info from ifconfig: $!\ +n"); for(@nic){ if (my ($device) = /eth(\d)/){ if (my ($ip) = /net addr:([\d.]+)/){ print "Device $device has the IP Address of $ip\n"; } } } } else { my $ifconfig = "ifconfig -a"; my @nic = qx |$ifconfig| or die ("Can't get info from ifconfig: $!\ +n"); for (@nic){ if (my ($device) = /^fjgi(\d)/){ if (my ($ip) = /inet ([\d.]+)/){ print "Device $device has the IP Address of $ip\n"; } } } }

      I tried changing my IF's to resemble your example but when I run the script I don't get any output.

      Of course. You haven't fixed the problem of the inner "if" not matching

      Would you mind taking another look to see if I missed something?

      You seem to have missed the question in my earlier post. ( I see you addressed that in a separate post. Replying to that post now )

Re^2: Need help with a nested IF statement
by MikeDexter (Sexton) on Nov 02, 2009 at 17:15 UTC

    the ifconfig -a prints the following. The device name and ip are NOT on the same line. I don't know how to say look for x on line 1 and tell me y on line 2 after the second regex find..... Can I do that in Perl?

    output of command

    cccadm@redsox::perl: ifconfig -a lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu +8232 index 1 inet 127.0.0.1 netmask ff000000 fjgi0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 ind +ex 2 inet 10.254.190.232 netmask ffffff00 broadcast 10.254.190.255 fjgi1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 ind +ex 3 inet 10.254.140.221 netmask ffffff00 broadcast 10.254.140.255

      The device name and ip are NOT on the same line.

      Since you process each line one at a time, that's a problem.

      The easiest solution is to look at entire records.

      use strict; use warnings; my $opsys = $^O; print "Hello, your operating system is: $opsys\n"; if ($opsys =~ /linux/) { my $nics = qx|/sbin/ifconfig| or die("Can't get info from ifconfig: $!\n"); my @nics = split /(?<=\n)(?=\w)/, $nics; for (@nics){ my ($device) = /^eth(\d)/ or next; my ($ip) = /\bnet addr:([\d.]+)/ or next; print "Device $device has the IP Address of $ip\n"; } } else { my $nics = qx|ifconfig -a| or die("Can't get info from ifconfig: $!\n"); my @nics = split /(?<=\n)(?=\w)/, $nics; for (@nics){ my ($device) = /^fjgi(\d)/ or next; my ($ip) = /\binet ([\d.]+)/ or next; print "Device $device has the IP Address of $ip\n"; } }

      There's some redundancy here, but I can't figure how to eliminate cleanly.

        That worked very well. Can you tell me what \b is looking for when you write "/\bnet"? What is considered a Word boundry? Also your split line, what is it doing logic-wise. I am pretty new to Perl and Regex still confuses me slightly. Thanks.

        I am building on this script to capture more information and be able to spit out the information captured. Eventually this script will be used to change the ip address on a machine. So I built on the earlier version to see if I could capture Netmask and Broadcast address. I know there is something with my regex parameters because I am getting no output again. In the Else loop I think I am searching for inet, one or many data, space, netmask, data, space, broadcast, one or many data. But I am getting nothing. Having tagged each item I am looking for I wonder if I am not properly calling my tags in the print line.

        Can someone take a look please?

        use strict; use warnings; my $opsys = $^O; print "Hello, your operating system is: $opsys" . "\n"; if ($opsys =~ /linux/) { my $nics = qx |/sbin/ifconfig| or die("Can't get info from ifconfig: $!\n"); my @nics = split /(?<=\n)(?=\w)/, $nics; for (@nics){ my ($interface) = /^eth(\d)/ or next; my ($ip) = /\binet addr:([\d.]+)/ or next; print "Interface $interface has the IP Address of $ip\n"; } } else { my $nics = qx |ifconfig -a| or die("Can't get info from ifconfig: $!\n"); my @nics = split /(?<=\n)(?=\w)/, $nics; for (@nics){ my ($interface) = /^fjgi(\d)/ or next; my (@ip) = /\binet ([\d.]+)\snetmask ([\d]+)\sbroadcast ([\d.] ++)/ or next; print "Interface $interface has the IP Address of $ip[0]\n \tN +etmask: $ip[1]\n \tBroadcast $ip[2]\n"; } }

        Here is another variation I have tried that is finding nothing

        my ($ip, $mask, $bcast) = /\binet ([\d.]+)\snetmask ([\d]+)\sb +roadcast ([\d.]+)/ or next; print "Interface $interface has the IP Address of $ip\n \tNetm +ask: $mask\n \tBroadcast $bcast\n";

        How do I print $_ to see what I am actually finding? I tried this and was getting a not declared error