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;" | [reply] [d/l] [select] |
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.
| [reply] [d/l] |
A bit late now, but for the future a useful node to point
people wanting to do a multi-dimensional split at is
Supersplit. | [reply] |