Arrays 为什么在这个Perl函数中存在严格的refs错误?

Arrays 为什么在这个Perl函数中存在严格的refs错误?,arrays,perl,Arrays,Perl,最小码 #!/usr/local/bin/perl use strict; use warnings; use Math::Geometry::Planar qw(SegmentLineIntersection); sub x_intercepts { my $xa = @{ $_[0] }; my @xcross = (); my @x_axis = ( [0, 2000], [1, 2000] ); foreach my $i (0 .. 1) {

最小码

#!/usr/local/bin/perl
use strict;
use warnings;
use Math::Geometry::Planar qw(SegmentLineIntersection);

sub x_intercepts {
    my $xa = @{ $_[0] };
    my @xcross = ();
    my @x_axis = ( [0, 2000], [1, 2000] );

    foreach my $i (0 .. 1) {
        my $xc = SegmentLineIntersection([ @$xa[$i, $i + 1], @x_axis ]);
        push @xcross, $xc;
    }        
    return \@xcross;
}

my @xs = qw/22.595451 20.089094 17.380813 15.091260 12.477935 10.054821 7.270003 4.804673 4.728526 4.619254 4.526920 4.418416 4.321419 4.219890 4.123336 4.009777 3.912648 3.804183 3.705847 3.597756 3.512301 3.393413 3.301963 3.196725 3.098560 3.007482 2.899825 2.801002 2.688680 2.598862 2.496139 2.393526 2.282183 2.190449 2.084530 1.987778 1.877562 1.788788 1.678473 1.578123 1.467071 1.373372 1.283629 1.176670 1.071805 0.975422 0.877622 0.767820 0.667409 0.562480 0.469068 0.354589 0.264291 0.152522 0.063765 -0.045323 -0.136783 -0.248559 -0.343694 -0.459178 -0.551917 -0.640803 -0.755502 -0.845535 -0.955227 -1.045879 -1.155600 -1.254556 -1.365163 -1.461669 -1.571370 -1.658043 -1.772672 -1.865942 -1.981037 -2.073702 -2.176205 -2.276184 -2.367371 -2.476278 -2.567385 -2.686326 -2.777433 -2.884357 -2.980067 -3.087754 -3.183607 -3.291003 -3.386942 -3.495822 -3.586759 -3.702955 -3.793550 -3.900680 -3.999672 -4.093094 -4.200047 -4.301026 -4.399742 -4.493190 -4.602013 -4.705124 -4.812383 -4.907510 -5.022904 -5.109829 -5.214304 -5.317662 -7.703172 -10.350131 -12.921361 -15.431203 -18.188013 -20.544248 -22.822808 -25.679854 -22.999092 -20.540434 -17.964916 -15.398857 -12.990375 -10.402209 -7.888263 -5.504909 -5.217892 -5.109841 -5.014187 -4.908558 -4.811807 -4.704282 -4.605555 -4.504613 -4.406546 -4.292540 -4.204043 -4.088770 -3.995524 -3.905669 -3.796544 -3.707958 -3.596449 -3.490966 -3.382869 -3.293054 -3.185821 -3.088417 -2.971214 -2.880314 -2.772518 -2.677986 -2.569794 -2.473668 -2.365096 -2.276422 -2.179232 -2.068195 -1.973110 -1.859565 -1.771873 -1.669422 -1.569953 -1.462626 -1.364911 -1.258100 -1.159318 -1.050486 -0.959979 -0.849149 -0.749421 -0.640950 -0.547122 -0.451754 -0.344463 -0.252269 -0.134625 -0.051640 0.052970 0.154112 0.266505 0.353926 0.468739 0.561666 0.673810 0.759169 0.881697 0.973207 1.082409 1.170424 1.282163 1.378096 1.472728 1.586454 1.678473 1.785688 1.873862 1.984090 2.086021 2.196799 2.292400 2.386097 2.493190 2.601726 2.694346 2.803450 2.901878 3.011959 3.103050 3.196979 3.294507 3.397563 3.504076 3.600163 3.712539 3.809573 3.919799 4.012314 4.120694 4.216406 4.322895 4.416466 4.522871 4.623917 4.735925 4.826929 7.361253 9.647208 12.337984 14.870260 17.439730 19.921717 22.524080 25.125903/;

foreach my $i ( x_intercepts(@xs) ) {
    print "$i \n";
}

在中“严格引用”时不能将字符串(“22.595451”)用作数组引用 用于test5.pl第8行

在声明变量时有一些基本的错误。 声明
mymain::$xa=main::$xa不是要走的路


为什么会发生此错误?

您正在读取传递给函数(22.595451)的第一个参数,它是一个字符串,并试图将其视为一个数组(它不是)

您可能打算将数组引用作为单个参数传递,而不是将数组的每个成员作为单独的参数传递

x_intercepts(\@xs)

将arrayref转换为常规数组后,您似乎试图将其视为标量:

my $xa = @{ $_[0] };
那没有道理

根据您稍后所做的操作,您似乎希望
$ax
成为arrayref,因此不要取消对它的引用:

my $xa = $_[0];

您正在读取传递给函数(22.595451)的第一个参数,它是一个字符串,并试图将其视为一个数组(它不是)

您可能打算将数组引用作为单个参数传递,而不是将数组的每个成员作为单独的参数传递

x_intercepts(\@xs)

将arrayref转换为常规数组后,您似乎试图将其视为标量:

my $xa = @{ $_[0] };
那没有道理

根据您稍后所做的操作,您似乎希望
$ax
成为arrayref,因此不要取消对它的引用:

my $xa = $_[0];

你的例子可以归结为:

#!/usr/bin/env perl

use strict;
use warnings;

run();

sub run {
    print_x('x');
}

sub print_x {
    my @x = @{ $_[0] };
    print "@x\n";
}
您向
print_x
传递字符串列表(在本例中,仅包含一个元素的列表),但在
print_x
中,您将第一个参数视为对数组的引用

请注意,如果是这种情况,您将通过将数组的所有元素复制到词典范围的
@x
来创建数组的第二个(浅层)副本。在大多数情况下,这是不必要或不需要的


将您遇到的问题减少到最短的完整且可运行的脚本,该脚本仍然显示问题。这将帮助你学习。

你的例子可以归结为:

#!/usr/bin/env perl

use strict;
use warnings;

run();

sub run {
    print_x('x');
}

sub print_x {
    my @x = @{ $_[0] };
    print "@x\n";
}
您向
print_x
传递字符串列表(在本例中,仅包含一个元素的列表),但在
print_x
中,您将第一个参数视为对数组的引用

请注意,如果是这种情况,您将通过将数组的所有元素复制到词典范围的
@x
来创建数组的第二个(浅层)副本。在大多数情况下,这是不必要或不需要的


将您遇到的问题减少到最短的完整且可运行的脚本,该脚本仍然显示问题。这将帮助您学习。

他还返回数组引用并尝试在for循环中使用,这也是不正确的。同样,他返回数组引用并尝试在for循环中使用,这也是不正确的。fyi,
分段线交点的前两个参数应为一对点(一个点既有x坐标又有y坐标),不是一对x坐标。仅使用两条线段的x坐标无法找到它们的交点。您已经问了几个与此相关的后续问题,但似乎您对此代码的工作原理缺乏基本的了解。我敦促您重新阅读for
Math::Geometry::Planar
和现代Perl教程。您的问题中包含了太多与问题完全无关的内容。事实上,如果您尝试将问题减少到尽可能短的完整程序,您将学习得更快。此外,(0,2000)到(1,2000)的段不在x轴上,尽管这可能只是命名问题。@ThisSuiteisBlack在这种情况下,没有标准化,因此与x轴没有相交。这种移动使交叉点成为可能。仅仅是一个伪常量,2000.FYI,
SegmentLineIntersection
的前两个参数应该是一对点(一个点既有x坐标又有y坐标),而不是一对x坐标。仅使用两条线段的x坐标无法找到它们的交点。您已经问了几个与此相关的后续问题,但似乎您对此代码的工作原理缺乏基本的了解。我敦促您重新阅读for
Math::Geometry::Planar
和现代Perl教程。您的问题中包含了太多与问题完全无关的内容。事实上,如果您尝试将问题减少到尽可能短的完整程序,您将学习得更快。此外,(0,2000)到(1,2000)的段不在x轴上,尽管这可能只是命名问题。@ThisSuiteisBlack在这种情况下,没有标准化,因此与x轴没有相交。这种移动使交叉点成为可能。只是一个虚拟常数,2000。