如何使用对元素对的数组引用
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 perldoc
perbsub
可以让事情看起来更明显。
References 是理解 perl 子例程的关键,因为要将数组或散列传递给子例程,您需要通过引用来完成。如果传递的参数 x_intercepts
是两个匿名数组列表的列表,那么当它被分配给 ($points)
时,@$points->[0]
@$points->[1]
将是包含这些列表的数组。
我希望这会有所帮助并且不会太基础(或不正确)。如果@ThisSuitIsBlackNot 找到时间提供答案,您应该接受它:已经提供了一些非常有用的示例。
我正在考虑这个 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 perldoc
perbsub
可以让事情看起来更明显。
References 是理解 perl 子例程的关键,因为要将数组或散列传递给子例程,您需要通过引用来完成。如果传递的参数 x_intercepts
是两个匿名数组列表的列表,那么当它被分配给 ($points)
时,@$points->[0]
@$points->[1]
将是包含这些列表的数组。
我希望这会有所帮助并且不会太基础(或不正确)。如果@ThisSuitIsBlackNot 找到时间提供答案,您应该接受它:已经提供了一些非常有用的示例。