gpt4 book ai didi

arrays - 将两个或多个数组传递给 Perl 子例程

转载 作者:行者123 更新时间:2023-12-02 04:53:21 25 4
gpt4 key购买 nike

我在传递和读取子例程内的参数时遇到问题,该子例程预计有两个数组。

sub two_array_sum { # two_array_sum ( (1 2 3 4), (2, 4, 0, 1) ) -> (3, 6, 3, 5)
# I would like to use parameters @a and @b as simply as possible
}

# I would like to call two_array_sum here and pass two arrays, @c and @d

我在网上看到并尝试了几个示例,但没有一个对我有用。

最佳答案

有两种方法可以做到这一点:

  1. 按原型(prototype)
  2. 引用

但在我讨论这些之前 - 如果你在问题中所表现的是你想要做的事情的程度 - 让我建议 List::MoreUtils::pairwise

那么,你应该在哪里写这个:

my @sum = two_array_sum( @a, @b )

你只需这样写:

my @sum = pairwise { $a + $b } @a, @b;

按原型(prototype)

这与push类似。 (就像push一样,它要求在某物上有一个@符号)

sub two_array_sub (\@\@) { 
my ( $aref, $bref ) = @_;
...
}

当你这样做时就是这样

two_array_sub( @a, @b );

它有效。而通常它只会作为一个长列表显示在您的子目录中。正如您将在下面的讨论中看到的那样,它们并不适合所有人。

引用

这就是每个人都向您展示的方式。

some_sub( \@a, \@b );

关于原型(prototype)

他们很挑剔。如果您有引用文献,这将不起作用:

two_array_sub( $arr_ref, $brr_ref );

你必须像这样传递它们:

two_array_sub( @$arr_ref, @$brr_ref );

然而,由于数组嵌套很深,制作“数组表达式”很快就会变得很难看,我经常避免 Perl 的麻烦,因为你可以通过将 Perl 放入“字符”中来重载 Perl 所采用的引用类型。类”构造。 \[$@] 表示引用可以是标量或数组。

sub new_two_array_sub (\[$@]\[$@]) { 
my $ref = shift;
my $arr = ref( $ref ) eq 'ARRAY' ? $ref : $$ref; # ref -> 'REF';
$ref = shift;
my $brr = ref( $ref ) eq 'ARRAY' ? $ref : $$ref;
...
}

所以所有这些都有效:

new_two_array_sub( @a, $self->{a_level}{an_array} );
new_two_array_sub( $arr, @b );
new_two_array_sub( @a, @b );
new_two_array_sub( $arr, $self->{a_level}{an_array} );

但是,出于某种原因,Perl 对此仍然很挑剔:

new_two_array_sub( \@a, $b );
OR
new_two_array_sub( $a, [ 1..3 ] );

或者任何其他仍然可以被视为对数组的引用的“构造函数”。幸运的是,您可以使用旧的 Perl 4 &

让 Perl 闭嘴
&new_two_array_sub( \@a, [ 1..3 ] );

然后子程序中的复用代码负责处理两个数组引用。

关于arrays - 将两个或多个数组传递给 Perl 子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5680147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com