in reply to Re^2: Need help with a nested IF statement
in thread Need help with a nested IF statement

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.

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

    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.

      Can you tell me what \b is looking for when you write "/\bnet"?

      To prevent it from matching "foonet"

      What is considered a Word boundry?

      Between a \W and a \w,
      between a \w and a \W,
      between the start of string and a \w, and
      between a \w and the end of string.

      As a regex pattern:

      /(?<=\w)(?!\w)|(?<!\w)(?=\w)/

      Also your split line, what is it doing logic-wise.

      It splits between a \n and a \w.

Re^4: Need help with a nested IF statement
by MikeDexter (Sexton) on Nov 02, 2009 at 20:24 UTC

    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

      'f' is not a digit.

      By the way, \d works fine outside of character classes ([]).

        That was a great lesson in Regex. Thank you so much. I can see I have a long way to go before mastering this stuff. I expected to see a digit and for some reason the output was alpha as you pointed out. Thanks again.

        I also pickup on your second comment. I believe though have not yet tested you are telling my I can look for \d instead of the word "netmask" or "broadcast" So I will try this too.