in reply to problem with split command

my $d = [[],[], [], []];

You don't need to pre-initialise your deep data structures. They'll pop up automagically when you first use them. It's called autovivification. So a

my $d;

should suffice.

Update: To avoid repetitive pushes you could define this function:

sub pushsome { my $AoAref = shift; for (my $i = 0 ; $i <= $#_ ; $i++) { push @{$AoAref->[$i]}, $_[$i]; } }

and then

while ( <DATA> ) { chomp; pushsome $d, split /,/; }

However in this case you need to pre-define $d as an array reference (my $d = [];) ; first-level autovivification can't work through subroutine calls.

Better off IMO is to get rid of the "reference to an array of arrays" ($r) and use an up-front @AoA. Here's your revamped code:

#!/usr/bin/perl use strict; use warnings; use PDL; use PDL::Matrix; sub pushsome { my $AoAref = shift; for (my $i = 0 ; $i <= $#_ ; $i++) { push @{$AoAref->[$i]}, $_[$i]; } } sub fetchdata { my $file = shift; my @AoA; open(DATA, $file) || die "Error: Unable to open $file:$!\n"; while (<DATA>) { chomp; pushsome \@AoA, split /,/; } close DATA; PDL::Matrix->pdl(\@AoA); } # main program @ARGV or die "Please supply a data file on the command line!\n"; my $d = fetchdata( shift ); # ...

Replies are listed 'Best First'.
Re^2: problem with split command
by Angharad (Pilgrim) on Sep 06, 2005 at 14:24 UTC
    Hey, thanks a lot. Much appreciated.