Kathryn Kathryn - 3 months ago 12
Perl Question

Perl return list of array refs of unknown length

I have a sub in Perl that needs to return a list of array refs to fit in with the rest of the package. The problem is that I don't know in advance how many array refs I will generate. My usual method of pushing the array refs that I generate into an array and returning a reference to that doesn't work with the rest of the code, which I can't change without breaking some legacy stuff.

sub subTrackTable {
my ($self, $experimentName, $subTrackAttr) = @_;

# return nothing if no subtracks required
if ($subTrackAttr eq 'no_sub') {
return;
}

# get distinct values for subtrack attr (eg antibody) from db
my $dbh = $self->dbh();
my $sh = $dbh->prepare("SELECT DISTINCT * blah sql");
$sh->execute();
my @subtrackTable;
while (my ($term, $value) = $sh->fetchrow_array()) {
my $subtrack = [':$value', $value];
push (@subtrackTable, $subtrack);
}
$sh->finish();

# this is hard-coded for one experiment and does what I want
# Want to loop through @subtrackTable and return a list of all the array refs it contains
# Returning nested array refs doesn't work with external code
return ([":H3K4me3", "H3K4me3"],[":H4K20me3", "H4K20me3"]);
}


The problem is that because I am dynamically getting values from a database, I don't know how many there will be. Just returning \@subtrackTable, which would be my usual strategy breaks the rest of the code. If I knew in advance how many there would be I could also do something like

my $a1 = [":$value1", $value1];
my $a2 = [":$value2", $value2];
...
my $an = [":$valuen", $valuen];
return($a1, $a2,...$an);


but I can't see how to make this work with an unknown number of arrayrefs.

Help appreciated!

Answer

It looks like you just need to

return @subtrackTable;

Also, this line

my $subtrack = [':$value', $value];

must be changed to use double quotes, like this

my $subtrack = [ ":$value", $value ];
Comments