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 |