Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I wish to split a command line argument into a two dimensional array of variable sizes.
My perl knowledge is obviously limited, and Im sure this can be done...

(typical $argv = :a1:b1:c1:d1;:a2:b2:c2;:a3;:a4;:a5:b5;:a6:b6:c6;:a7:b7)
note- 7 rows use ";" delimiter, and a variable number of cols use ":" delimiter.
desired 2D array format is $squad[$row][$col]
also note- $squad[$row][0] will be null coz of a preceding delimiter, I wish to remove (shift) this if possible


I have easily split my command line argument into 1st array..
@squad = split (/;/, $ARGV[0]);

From there on I have trouble, but can you correct this for me please..

for ($row=0;$row<7;$row++) { # same as foreach $row (0..$#squad) I presume? @squad[$row] = split(/:/, $squad[$row]); # wrong syntax ?! shift(@squad[$row]); # remove 1st null eleme +nt (wrong again?!) foreach $col (0..$#{$squad[$row]}) { print "$squad[$row][$col]"; } print "\n"; }

Replies are listed 'Best First'.
(crazyinsomniac) Re: Split into 2-D Array
by crazyinsomniac (Prior) on Dec 24, 2001 at 08:11 UTC
    map is your friend, oneliner F:\dev\oeufmayo>perl -MData::Dumper -e"print Dumper [ map{[split(':',$_)]} split(';',shift) ]" a1:a2;b1:b2;c1:c2; and, more than one line
    #!/usr/bin/perl -w use strict; use Data::Dumper; my $string = shift; # equivalent to shift @ARGV; my @DD = ( map { [ split( ':' , $_ ) ] } split( ';' , $string ) ); print Dumper \@DD; __END__ $>perl DD.pl a1:a2;b1:b2;c1:c2;11:22:33:44:55:;3:4:5; $VAR1 = [ [ 'a1', 'a2' ], [ 'b1', 'b2' ], [ 'c1', 'c2' ], [ '11', '22', '33', '44', '55' ], [ '3', '4', '5' ] ]; $>
    If any of the above isn't clear, please read perlfunc:map, perlfunc:split, perlman:perlref, and perlman:perldata.

    Also, if you do not wish to use map, but instead continue with your for loop deal, you should take the time and read perlfunc:push, that way you do not have to keep an index of any of your arrays.

     
    ___crazyinsomniac_______________________________________
    Disclaimer: Don't blame. It came from inside the void

    perl -e "$q=$_;map({chr unpack qq;H*;,$_}split(q;;,q*H*));print;$q/$q;"

Re: Split into 2-D Array
by talexb (Chancellor) on Dec 24, 2001 at 07:56 UTC
    This is how I'd split the arguments up. Comments in the code should provide enough explanation.
    my $ArgV = "a1:b1:c1:d1;:a2:b2:c2;:a3;:a4;:a5:b5;:a6:b6:c6;:a7:b7"; my @Array; my ( $ThisRow, $ThisCol ); # Split data into rows on the ';' character. $ThisRow = 0; foreach my $Row ( split ( ';', $ArgV ) ) { # Split the columns on the ':' character. $ThisCol = 0; foreach my $Element ( split ( ':', $Row ) ) { # Skip blank elements; then insert data into the appropriate # Row, Column element then move on to the next column. next if ( $Element eq "" ); $Array[ $ThisRow ][ $ThisCol++ ] = $Element; } # Move on to the next row. $ThisRow++; } # Now print out the array to show that we've got # the right stuff in the right spot. for ( my $RowNow = 0; defined ( $Array[ $RowNow ] ); $RowNow++ ) { for ( my $ColNow = 0; defined ( $Array[ $RowNow ][ $ColNow ] ); $Col +Now++ ) { print "[ $RowNow ][ $ColNow ]: $Array[ $RowNow ][ $ColNow ]. "; } print "\n"; }

    "Excellent. Release the hounds." -- Monty Burns.

Re (tilly) 1: Split into 2-D Array
by tilly (Archbishop) on Jan 03, 2002 at 09:17 UTC
    A bit late now, but for the future a useful node to point people wanting to do a multi-dimensional split at is Supersplit.