Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

Re: Parse variables from @output

by Cisco_Dave (Novice)
on Nov 15, 2019 at 08:40 UTC ( #11108720=note: print w/replies, xml ) Need Help??

in reply to Parse variables from @output

Removed the quotation marks to fix second and third values for $VAR1. Just need to figure out the first result now, note the two leading spaces are intentional below, this is how it appears in the output

#!/usr/local/bin/perl ## use strict; use warnings; use Data::Dumper; my @output = ( qq/Hardware\n/ .qq/ cisco Nexus 3048 Chassis ("48x1GE + 4x10G Supervisor)\n/ .qq/ Intel(R) Celeron(R) CPU P450 with 3981680 kB of memory.\n/ , qq/Cisco CISCO2901\/K9 (revision 1.0) with 483328K\/40960K bytes +of memory.\n/ , qq/cisco WS-C3550-48 (PowerPC) processor (revision N0) with 65526 +K\/8192K bytes of memory.\n/ .qq/Model number: WS-C3550-48-SMI\n/ ); print "@output\n"; foreach (@output) { my %details; if (/^Hardware/i) { $details{'Chassis'} = $1 if (/^cisco Nexus (\S+)/i); $details{'Main Memory'} = $1 if (/^Intel (\S+)/i); } if (/^cisco ((Catalyst )?\S+) .* with (\S+) bytes of memory/i) { $details{'Chassis'} = $1; $details{'Main Memory'} = $3; } $details{'Chassis'} = $1 if (/^Model number: (\S+)/i); print Dumper(\%details); }


Hardware cisco Nexus 3048 Chassis ("48x1GE + 4x10G Supervisor) Intel(R) Celeron(R) CPU P450 with 3981680 kB of memory. Cisco CISCO2901/K9 (revision 1.0) with 483328K/40960K bytes of memory +. cisco WS-C3550-48 (PowerPC) processor (revision N0) with 65526K/8192K + bytes of memory. Model number: WS-C3550-48-SMI $VAR1 = {}; $VAR1 = { 'Main Memory' => '483328K/40960K', 'Chassis' => 'CISCO2901/K9' }; $VAR1 = { 'Main Memory' => '65526K/8192K', 'Chassis' => 'WS-C3550-48' };

Replies are listed 'Best First'.
Re^2: Parse variables from @output
by Corion (Pope) on Nov 15, 2019 at 08:54 UTC

    You have:

    .qq/ cisco Nexus 3048 Chassis ("48x1GE + 4x10G Supervisor)\n/

    but your match wants cisco to appear at the start of a line:

    $details{'Chassis'} = $1 if (/^cisco Nexus (\S+)/i);

    You will need to allow for some whitespace in front of cisco, for example by allowing for \s*:

    $details{'Chassis'} = $1 if (/^\s*cisco Nexus (\S+)/i);

    But "start of the line" (^) means "start of the whole string" to Perl unless you also tell it to match after a newline using the /m modifier:

    $details{'Chassis'} = $1 if (/^\s*cisco Nexus (\S+)/mi);

    Adding that, I get:

    $VAR1 = { 'Chassis' => '3048' }; $VAR1 = { 'Main Memory' => '483328K/40960K', 'Chassis' => 'CISCO2901/K9' }; $VAR1 = { 'Chassis' => 'WS-C3550-48', 'Main Memory' => '65526K/8192K' };

      That's spot on thanks. Chassis variable working. Any idea on the memory part?

      $details{'Main Memory'} = $1 if (/^\s* Intel .* with (\S+) kB of memor +y/mi);

        Maybe now is a good moment to look at your regular expression and compare it with the input string.

        For example, there is a space after "Intel" in your regular expression, but no such space in your input string.

        Yeah that was the only issue. Learning curve this is. Top man cheers

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (2)
As of 2021-10-27 04:41 GMT
Find Nodes?
    Voting Booth?
    My first memorable Perl project was:

    Results (91 votes). Check out past polls.