http://www.perlmonks.org?node_id=990303


in reply to Split() first 3 elements of @array

Select the first 3 elements of an array as:

@array[0..2]

exerting care in case there are less than 3 elements.

use feature ":5.14"; use warnings FATAL => qw(all); use strict; use Data::Dump qw(dump); my @RouterOutput = split /\n/, << 'END'; 1 AAAA BBBB CCCC 2 AAAA BBBB CCCC 3 AAAA BBBB CCCC 4 AAAA BBBB CCCC END for(@RouterOutput[0..2]) {say "@{[split]}[0,3,2,1]" if $_; }

Produces

1 CCCC BBBB AAAA
2 CCCC BBBB AAAA
3 CCCC BBBB AAAA

Replies are listed 'Best First'.
Re^2: Split() first 3 elements of @array
by hmb104 (Sexton) on Aug 28, 2012 at 19:10 UTC

    Thanks for the suggestions. I have tried 2 ways and I still can't get some of the info. Lets assume the lines that I store at my @array are the following:

    Device ID: switch1.Core-3750.abc.com Entry address(es): IP address: 10.10.10.10 Platform: cisco WS-C3750G-12S, Capabilities: Router Switch IGMP Interface: GigabitEthernet1/0/28, Port ID (outgoing port): GigabitEth +ernet2/0/7 Holdtime : 145 sec Version : Cisco IOS Software, C3750 Software (C3750-IPSERVICESK9-M), Version 12. +2(55)SE4, RELEASE SOFTWARE (fc1) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2011 by Cisco Systems, Inc. Compiled Tue 06-Sep-11 02:59 by prod_rel_team advertisement version: 2 Protocol Hello: OUI=0x00000C, Protocol ID=0x0112; payload len=27, val +ue=00000000FFFFFFFF01022507000000000000A8B1D400F080FF0000 VTP Management Domain: 'networks' Native VLAN: 1 Duplex: full

    I can extract the switch name but I cannot sxtract the IP address for the switch for some reason

    foreach $Line ( @RouterOutput ) { if ( $Line =~ m/^Device / ) { @Data = split( ' ', $Line ); $SwitchName = $Data[ 2 ] ; last ; } if ( $Line =~ m/^IP / ) { @Data = split( ' ', $Line ); $SwitchIP = $Data[ 2 ] ; last ; } }
      I cannot sxtract the IP address for the switch for some reason

      The third line, with the IP address is indented: there is some whitespace at the beginning of the line, but your regular expression is looking for 'IP' at the beginning of the line: /^IP/. Change that to accept some leading whitespace and you should get a match: /^\s*IP/

        use Modern::Perl; use Modern::Perl; say ' IP address: 10.10.10.10' =~ /IP\s+address:\s+([^\s]+)/; say 'IP address: 10.10.10.10' =~ /IP\s+address:\s+([^\s]+)/; say ' IP address: 10.10.10.10' =~ /^\s*IP\s+address:\s+([^\s]+)/; say 'IP address: 10.10.10.10' =~ /^\s*IP\s+address:\s+([^\s]+)/;

        Output:

        10.10.10.10 10.10.10.10 10.10.10.10 10.10.10.10

        Update: Ah! hmb104 was referring to using split, not the regex (which isn't attempting to match at the beginning of a line and is fully anchored w/o mentioning the spaces before "IP address:").

      Try the following:

      use Modern::Perl; my @RouterOutput = <DATA>; my $RouterOutput = join ' ', @RouterOutput; my ( $SwitchName, $SwitchIP ) = $RouterOutput =~ /Device\s+ID:\s+([^\s]+).+IP\s+address:\s+([^\s]+)/ +s; say "$SwitchName\n$SwitchIP"; __DATA__ Device ID: switch1.Core-3750.abc.com Entry address(es): IP address: 10.10.10.10 Platform: cisco WS-C3750G-12S, Capabilities: Router Switch IGMP Interface: GigabitEthernet1/0/28, Port ID (outgoing port): GigabitEth +ernet2/0/7 Holdtime : 145 sec Version : Cisco IOS Software, C3750 Software (C3750-IPSERVICESK9-M), Version 12. +2(55)SE4, RELEASE SOFTWARE (fc1) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2011 by Cisco Systems, Inc. Compiled Tue 06-Sep-11 02:59 by prod_rel_team advertisement version: 2 Protocol Hello: OUI=0x00000C, Protocol ID=0x0112; payload len=27, val +ue=00000000FFFFFFFF01022507000000000000A8B1D400F080FF0000 VTP Management Domain: 'networks' Native VLAN: 1 Duplex: full

      Output:

      switch1.Core-3750.abc.com 10.10.10.10