如何使用对元素对的数组引用

How to use an array reference to pairs of elements

我正在考虑这个 ,它使用点的单个数组引用,其中点是对二元素数组的引用。 我的问题的原始代码(函数 extract-crossing)使用两个单独的数组 $x$y 我这样称呼它们:

my @x = @{ $_[0] }; my @y = @{ $_[1] };
...
return extract_crossing(\@x, \@y);

下面基于的新代码采用(x, y)和returns单一数据类型,这里x截取点:

use strict; use warnings;    
use Math::Geometry::Planar qw(SegmentLineIntersection);
use Test::Exception;

sub x_intercepts {
   my ($points) = @_;

   die 'Must pass at least 2 points' unless @$points >= 2;

   my @intercepts;
   my @x_axis = ( [0, 0], [1, 0] );

   foreach my $i (0 .. $#$points - 1) {
     my $intersect = SegmentLineIntersection([@$points[$i,$i+1],@x_axis]);
     push @intercepts, $intersect if $intersect;
   }

   return \@intercepts;
}

我试着这样称呼它:

my @x = @{ $_[0] }; my @y = @{ $_[1] };  
...
my $masi = x_intercepts(\@x);
return $masi; 

但是,代码没有意义。 我对将 "double array" 传递给 x_intercepts() 函数感到困惑。

怎样才能让示例代码更清晰地还原到原来的设置?

如果我理解这里的问题,@ThisSuitIsBlackNot++ 已经编写了一个函数(x_intercepts 在线程中可用:)期望它的参数是对列表的引用数组引用。 x_intercepts 子例程依次使用 Math::Geometry::Planar 中的函数,该函数期望线段的点作为数组 references/anonymous 数组的系列传递,每个数组包含 x,y 值观点。

同样 - 它不是 完全 清楚 - 但似乎你的数据在两个不同的数组中:一个包含所有 x 值和一个具有相应的 y 值。是这样吗?如果这不正确,请发表评论,我将删除此答案。

如果这是您问题的根源,那么您可以 "munge" 或在将数据传递给 x_intercepts 之前转换您的数据,或者 - 正如@ThisSuitIsBlackNot 建议的那样 - 您可以重写该函数。下面是将现有数据修改为“@input_list”以传递给 x_intercepts 的示例。

my @xs = qw/-1 1 3/;
my @ys = qw/-1 1 -1 /;

my @input_list ;
foreach my $i ( 0..$#ys ) {
   push @input_list,  [ $xs[$i], $ys[$i] ]  ;
}

my $intercept_list = x_intercepts(\@input_list)  ;
say join ",", @$_ for @$intercept_list ;

将上面的行添加到您的脚本会产生:

输出:

0,0
2,0

你必须非常小心地做这种事情,使用测试来确保你以预期的方式传递正确转换的数据是个好主意。


我认为一个更普遍的困难是,在您熟悉 perl 之前,有时很难轻松地看到子例程期望的值类型、它们在传入后的最终位置以及如何访问它们.

对 perl 数据结构的扎实掌握可以对此有所帮助 - 例如,我 认为 你所谓的 "double array" 或 "double element" 这里是一个"array of arrays". There are ways to make it easier to see where default arguments passed to a subroutine (in @_) are going (notice how @ThisSuitIsBlackNot has passed them to a nicely named array reference: "($points)"). Copious re-reading of perldocperbsub 可以让事情看起来更明显。

References 是理解 perl 子例程的关键,因为要将数组或散列传递给子例程,您需要通过引用来完成。如果传递的参数 x_intercepts 是两个匿名数组列表的列表,那么当它被分配给 ($points) 时,@$points->[0] @$points->[1] 将是包含这些列表的数组。

我希望这会有所帮助并且不会太基础(或不正确)。如果@ThisSuitIsBlackNot 找到时间提供答案,您应该接受它:已经提供了一些非常有用的示例。