在Perl中传递数组

在Perl中传递数组,perl,Perl,好吧,我会尽力解释我到目前为止做了什么。我使用Parellel::ForkManager从URL数组中获取数据,然后将其存储在变量(value1、value2、value3)中 然后,我从所有这些进程中收集数据,并使用$pm->run\u on\u finish显示数据 #... my $pm = new Parallel::ForkManager(10); $pm->run_on_finish ( sub { my @info = @{$data_structu

好吧,我会尽力解释我到目前为止做了什么。我使用Parellel::ForkManager从URL数组中获取数据,然后将其存储在变量(value1、value2、value3)中

然后,我从所有这些进程中收集数据,并使用
$pm->run\u on\u finish
显示数据

#...
my $pm = new Parallel::ForkManager(10);

$pm->run_on_finish (
    sub {
        my @info = @{$data_structure_reference};

        print $info[0];
        print $info[1];
        print $info[2];
    }
);

for my $var (@urls) {

    $pm->start and next;
    #...
    @returned = &something($var);
    #...
    $pm->finish(0, \@returned);

}

sub something {

    #... getting data from each URL and storing it in variables

    my @array = (
        $value1,
        $value2,
        $value3
    );
    return @array;
}
现在,我要做的是传递一个数组,
@value4
,然后仅在数组中有内容时显示该数据。所以,我希望它看起来像这样:

sub something {

    #... getting data from each URL and storing it in variables

    my @array = (
        $value1,
        $value2,
        $value3,
        @value4
    );
    return @array;
}
然后我想让它打印那个数组,只要里面有东西


不幸的是,我不完全确定该如何做。

我不完全确定您在问什么,但是为了在Perl中向函数传递多个数组,必须通过引用传递

my @array1 = (1, 2, 3);
my @array2 = ('a', 'b', 'c');

&fn(\@array1, \@array2);
为了仅在数组有值的情况下打印数组,只需检查数组是否有值并打印即可:

print "@array" if @array;
不过,
“@array”
的好功能是,如果
@array
没有值,则
“@array”
的计算结果为
”。这使您可以将前面的语句简化为:

print "@array"

我假设您要问的是如何返回一个数组以及从
something()
sub返回的三个标量,并将其打印出来

我还假设这三个标量在
@info
中被称为存在

在我看来,最简单的方法似乎是简单地将它们固定到您返回的数组的末尾,使用前三个值,如果还剩下什么,也打印出来

$pm->run_on_finish (
    sub {
        my @info = @{$data_structure_reference};

        print splice @info, 0, 3;
        print @info if (@info);
    }
);

sub something {
    return (
            $value1,
            $value2,
            $value3,
            @value4
        );
}
正如您所注意到的,您不需要为返回值填充虚拟数组,只需在参数内返回值即可。不需要取消对数组的引用,因为如果剪接前三个值,可以直接使用
@info
数组


我喜欢简单。如果可行。

我之前已经提供了一个解决这个问题的简单方法。它可以使用线程(
使用线程;
)或进程(
使用forks;

子系统中要完成的工作是通过
处理请求来完成的

sub process_request {
    # ...

    return [
        $value1,
        $value2,
        $value3,
        \@value4,
    ];
}
结果将被传递到父级中的
过程\u响应

sub process_response {
    my ($value1, $value2, $value3, $value4) = @{ $_[0] };
    ...
}

将数组@value4传递给哪个函数?请澄清。@hexcoder澄清已到达?我认为塞斯皮诺扎的回答很有帮助。我要看看我能用它做些什么。。。然后可能投票/accept@Aelfhere你为什么要为推荐信烦恼呢?使用前三个值,数组中剩下的是
@value4
数组中的任何值。@Aelfhere ok,如果答案合适,可以。(对我来说,还不清楚您真正想要什么,但这已经不再相关了)。@hexcoder每个fork运行
something()
子命令并获取值,然后将这些值打印在
finish()
语句中。他想知道如何通过
finish()
语句传递值。这正是我需要的。它的简单性说明了我对lol语言所知甚少。非常感谢+1伟大的原型代码@Aelfhere:使用参考资料更优雅这很好。我可以用TLP的答案来回答这个问题,但只是为了好玩,我玩了你的答案,效果也不错。谢谢@我会记得要优雅。。。将来:)@hexcoder,@Aelfhere,我已经更新了我的代码,这样一来,结果将由父级处理,而不是等待所有的工作完成。(未经测试,与原始代码一样。)
sub process_response {
    my ($value1, $value2, $value3, $value4) = @{ $_[0] };
    ...
}