Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl返回长度未知的数组引用列表_Perl - Fatal编程技术网

Perl返回长度未知的数组引用列表

Perl返回长度未知的数组引用列表,perl,Perl,我在Perl中有一个sub,它需要返回数组引用列表,以与包的其余部分相适应。问题是我事先不知道将生成多少数组引用。我通常的方法是将生成的数组引用推送到一个数组中,然后返回对该数组的引用,这与代码的其余部分不起作用,如果不破坏一些遗留内容,我就无法更改这些引用 sub subTrackTable { my ($self, $experimentName, $subTrackAttr) = @_; # return nothing if no subtracks required

我在Perl中有一个sub,它需要返回数组引用列表,以与包的其余部分相适应。问题是我事先不知道将生成多少数组引用。我通常的方法是将生成的数组引用推送到一个数组中,然后返回对该数组的引用,这与代码的其余部分不起作用,如果不破坏一些遗留内容,我就无法更改这些引用

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,它只是在幕后处理这些东西,所以很高兴知道我哪里出错了。