【问题标题】:Why strict refs error in this Perl function?为什么在这个 Perl 函数中有严格的 refs 错误?
【发布时间】:2015-07-26 16:41:27
【问题描述】:

最低代码

#!/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";
}

给了

当“strict refs”在 在 test5.pl 第 8 行使用。

在声明变量时这里的一些基本错误。 在初始化中声明my main::$xa = main::$xa; 不是要走的路。

为什么会出现这个错误?

【问题讨论】:

  • 仅供参考,SegmentLineIntersection 的前两个参数应该是一对点(一个点同时具有 x 和 y 坐标),而不是一对 x 坐标。您无法仅使用 x 坐标找到两条线段的交点。您已经提出了几个与此相关的后续问题,但您似乎对这段代码的工作原理缺乏基本的了解。我会敦促您重新阅读 documentationMath::Geometry::Planar 和现代 Perl 教程。
  • 您在问题中包含了太多与问题完全无关的内容。事实上,如果您确实尝试将问题减少到尽可能短的完整程序,您会学得更快。
  • 另外,从 (0, 2000) 到 (1, 2000) 的段不在 x 轴上,尽管这可能只是一个命名问题。
  • @ThisSuitIsBlackNot 在这种情况下,没有标准化,因此没有与 x 轴相交。这种转变使交叉成为可能。只是一个虚拟常数,即 2000。

标签: arrays perl


【解决方案1】:

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

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

x_intercepts(\@xs)

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

my $xa = @{ $_[0] };

这没有意义。

根据您稍后所做的,您似乎希望 $ax 成为一个数组引用,所以不要取消引用它:

my $xa = $_[0];

【讨论】:

  • 另外他返回数组引用并尝试在for循环中使用,也是不正确的
【解决方案2】:

您的示例归结为:

#!/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 来创建数组的第二个(浅)副本。在大多数情况下,这不是必需的或不需要的。

将您遇到的问题减少为仍然存在问题的最短完整且可运行的脚本。这将有助于您学习。

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2013-08-06
    • 2013-03-20
    • 1970-01-01
    相关资源
    最近更新 更多