Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Regular Expressions question

by CJXJ220 (Initiate)
on Oct 29, 2012 at 20:20 UTC ( #1001417=note: print w/ replies, xml ) Need Help??


in reply to Regular Expressions question

Thanks for the suggestions.

I switched my join statement to use concatenation but it is giving the same output.

Switching while(<@check>) with for(@check) does not match anything as the script now returns no interfaces. Do I now need to change how I am checking for the patterns within @check?

Updated code and script output below:
use Net::Ping; use Net::Telnet::Cisco; use Getopt::Long; my $host = ""; my $interface = ""; my $PRIList = ""; my $T1List = ""; my $T1Count = 0; my $PRICount = 0; GetOptions("host:s" => \ $host); if (!$host) { print "usage: perl regexp_test.pl --host=(IPAddress)"; exit; } my $p = Net::Ping->new(); if ($p->ping($host)) { print "\nDevice is online, connecting...\n\n"; my $session = Net::Telnet::Cisco->new(Host => $host); $session->login('user', 'password'); $session->cmd("term len 0"); print "Retrieving T1 controller details...\n\n"; my @check = $session->cmd("sh run | s controller T1"); print "@check\n"; for (@check) { # match an interface number e.g. 0/0/0, 0/1/0, etc if (m^\G[0-9]/[0-9]/[0-9]^) { $interface = $_; $T1Count++; $T1List = $T1List . $interface . "\n"; } # check if the interface is a PRI (pri-group timeslots 1-24) if (m^\Gpri-group^) { $PRICount++; $PRIList = $PRIList . $interface . "\n"; } } if ($T1Count > 0) { print "T1 Controller Summary:\n\n"; print "$T1Count total T1 interfaces\n"; print $T1List; print "$PRICount total voice PRI(s)\n"; print $PRIList; } else { print "No T1 interfaces found"; } $session->close; } else { print "\nDevice OFFLINE!! Connection aborted!!\n\n"; } $p->close();
C:\perl scripts>perl regexp_test.pl --host 10.22.49.19 Device is online, connecting... Retrieving T1 controller details... controller T1 0/0/0 framing esf linecode b8zs cablelength long 0db pri-group timeslots 1-24 controller T1 0/0/1 framing esf linecode b8zs cablelength long 0db controller T1 0/1/0 framing esf linecode b8zs cablelength long 0db controller T1 0/1/1 framing esf linecode b8zs cablelength long 0db No T1 interfaces found
Thanks again for your help


Comment on Re: Regular Expressions question
Select or Download Code
Re^2: Regular Expressions question
by NetWallah (Abbot) on Oct 29, 2012 at 20:49 UTC
    I think the "\G" in the regex is preventing the match. I'm not clear on what it's purpose is.
    Try "\b" instead - to me that makes more sense.

                 "By three methods we may learn wisdom: First, by reflection, which is noblest; Second, by imitation, which is easiest; and third by experience, which is the bitterest."           -Confucius

Re^2: Regular Expressions question
by 2teez (Priest) on Oct 29, 2012 at 21:02 UTC

    Assumption:

    • the data after __DATA__, were what you have in your array variable named @check
    • You have only T1 interface in your data

    If true, then try this:
    use warnings; use strict; my $host = ""; my $interface = ""; my $PRIList = ""; my $T1List = ""; my $T1Count = 0; my $PRICount = 0; my @check = grep { chomp $_; $_ } <DATA>; for (@check) { if (m{([0-9]/[0-9]/[0-9])$}) { $T1Count++; $interface = $1; $T1List .= $interface . "\n"; } elsif (m{pri-group}) { $PRICount++; $PRIList .= $interface . "\n"; } } if ( $T1Count > 0 ) { print "T1 Controller Summary:\n\n"; print "$T1Count total T1 interfaces\n"; print $T1List; print "$PRICount total voice PRI(s)\n"; print $PRIList; } else { print "No T1 interfaces found"; } __DATA__ controller T1 0/0/0 framing esf linecode b8zs cablelength long 0db pri-group timeslots 1-24 controller T1 0/0/1 framing esf linecode b8zs cablelength long 0db controller T1 0/1/0 framing esf linecode b8zs cablelength long 0db controller T1 0/1/1 framing esf linecode b8zs cablelength long 0db
    OUTPUT:
    T1 Controller Summary: 4 total T1 interfaces 0/0/0 0/0/1 0/1/0 0/1/1 1 total voice PRI(s) 0/0/0
    NOTE: Please, the script above apply to OP originally modified script starting from the for loop.
    Hope, this helps.

    If you tell me, I'll forget.
    If you show me, I'll remember.
    if you involve me, I'll understand.
    --- Author unknown to me
      Here is the equivalent code, done using OO:
      use warnings; use strict; my $host = ""; my (@T1_list, $current_T1); my @check = grep { chomp $_; $_ } <DATA>; for (@check) { if (m{([0-9]/[0-9]/[0-9])$}) { push @T1_list, $current_T1 = T1->new (INTERFACE=>$1) } elsif (m{pri-group}) { $current_T1->isPRI (1); } } if ( @T1_list ) { print "T1 Controller Summary:\n\n"; print scalar(@T1_list) . " total T1 interfaces\n"; $_->PrintName for @T1_list; print scalar(grep $_->isPRI(), @T1_list) ." total voice PRI(s)\n"; $_->PrintName for (grep $_->isPRI(), @T1_list); } else { print "No T1 interfaces found"; } { package T1; sub new{ my ($class, %att) = @_; return bless ( {PRI=>0, INTERFACE=>'', %att}, $class); } sub isPRI{ my ($self, $val) = @_; defined $val or return $self->{PRI}; $self->{PRI} = $val; } sub PrintName{ print $_[0]->{INTERFACE}, "\n"; } 1; } # End of T1

                   "By three methods we may learn wisdom: First, by reflection, which is noblest; Second, by imitation, which is easiest; and third by experience, which is the bitterest."           -Confucius

      my @check = grep { chomp $_; $_ } <DATA>;

      Map should be used for this not grep. Consider the following.

      use warnings; use strict; my @check = grep { chomp $_; $_ } <DATA>; print ">>@check<<" __DATA__ line1 0 line3

      The output is:

      >>line1 line3<<

      Grep looks at the value the block returns and if true it returns $_. Map is used to do something to each element and pass along the result from each.

      To me it is clearer and simpler to do this:

      my @check = <DATA>; chomp @check;

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1001417]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (6)
As of 2014-12-20 21:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (99 votes), past polls