Perl返回长度未知的数组引用列表
我在Perl中有一个sub,它需要返回数组引用列表,以与包的其余部分相适应。问题是我事先不知道将生成多少数组引用。我通常的方法是将生成的数组引用推送到一个数组中,然后返回对该数组的引用,这与代码的其余部分不起作用,如果不破坏一些遗留内容,我就无法更改这些引用Perl返回长度未知的数组引用列表,perl,Perl,我在Perl中有一个sub,它需要返回数组引用列表,以与包的其余部分相适应。问题是我事先不知道将生成多少数组引用。我通常的方法是将生成的数组引用推送到一个数组中,然后返回对该数组的引用,这与代码的其余部分不起作用,如果不破坏一些遗留内容,我就无法更改这些引用 sub subTrackTable { my ($self, $experimentName, $subTrackAttr) = @_; # return nothing if no subtracks required
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"]);
}
问题是,因为我从数据库动态获取值,所以我不知道会有多少。只要返回\@subtrackTable,这将是我通常的策略,就会破坏其余的代码。如果我事先知道会有多少人,我也可以这样做
my $a1 = [":$value1", $value1];
my $a2 = [":$value2", $value2];
...
my $an = [":$valuen", $valuen];
return($a1, $a2,...$an);
但我不知道如何在数量未知的ArrayRef中实现这一点
谢谢你的帮助 看起来你只需要
return @subtrackTable;
还有这条线
my $subtrack = [':$value', $value];
必须更改为使用双引号,如下所示
my $subtrack = [ ":$value", $value ];
看起来你只需要
return @subtrackTable;
还有这条线
my $subtrack = [':$value', $value];
必须更改为使用双引号,如下所示
my $subtrack = [ ":$value", $value ];
为什么不返回一个arrayref,然后在调用者中取消引用它呢?为什么不直接返回列表(如果“代码的其余部分”希望这样做的话)?我试图理解问题的起因,“代码的其余部分”如何期望提供其参数?为什么不返回一个arrayref,然后在调用者中取消引用它?为什么不直接返回列表(如果“代码的其余部分”期望的是这样的话)?我试图理解问题是从哪里产生的,“代码的其余部分”如何期望提供其参数?谢谢-双引号在我的工作副本中是正确的,这是一个打字错误。返回@subtrackTable而不是\@subtrackTable修复了它,但我不明白为什么-你能给我一个解释吗?我不经常使用Perl,有时arrayref和数组之间的差异让我感到困惑!看起来您的代码是这样调用的:
@values=subTrackTable(…)
因此调用方需要一个值列表,然后将其存储在数组中。返回@subTrackTable
会执行此操作。如果返回\@subTrackTable
,则返回单个值,该值是对数组的引用。然后调用方的@values
数组只得到一个分配给它的元素,这根本不是它所期望的。@Kathryn:如果返回数组引用,则只返回一个标量值,该标量值指向在子例程中填充的数组@subtrackTable
。所有信息仍然存在,但是调用代码必须期望引用能够使用它。使用return@subtrackTable
只会将数组的内容作为列表返回,这与您的伪return
语句所做的操作相对应,您说这很有效。感谢您的解释。我主要写Python,它只是在幕后处理这些东西,所以很高兴知道我哪里出错了。谢谢-双引号在我的工作副本中是正确的,这是一个打字错误。返回@subtrackTable而不是\@subtrackTable修复了它,但我不明白为什么-你能给我一个解释吗?我不经常使用Perl,有时arrayref和数组之间的差异让我感到困惑!看起来您的代码是这样调用的:@values=subTrackTable(…)
因此调用方需要一个值列表,然后将其存储在数组中。返回@subTrackTable
会执行此操作。如果返回\@subTrackTable
,则返回单个值,该值是对数组的引用。然后调用方的@values
数组只得到一个分配给它的元素,这根本不是它所期望的。@Kathryn:如果返回数组引用,则只返回一个标量值,该标量值指向在子例程中填充的数组@subtrackTable
。所有信息仍然存在,但是调用代码必须期望引用能够使用它。使用return@subtrackTable
只会将数组的内容作为列表返回,这与您的伪return
语句所做的操作相对应,您说这很有效。感谢您的解释。我主要是写Python,它只是在幕后处理这些东西,所以很高兴知道我哪里出错了。