Perl 制作二度多边形,给出一个三元组

Perl 制作二度多边形,给出一个三元组,perl,Perl,该代码的目的是生成一个子程序,该子程序采用三个系数k2、k1和k0,并返回一个匿名函数/子程序,该子程序采用一个参数x,并返回具有给定系数的二次多项式的字符串表示形式及其在x处的值,即k2*x^2+k1*x+k0 现在,它返回消息“不能在使用“strict refs”时将字符串(“6”)用作数组引用” 有人知道我搞砸了什么吗 use strict; use warnings; use 5.10.0; sub make_2nd_degree_poly { my($k2, $k1, $k

该代码的目的是生成一个子程序,该子程序采用三个系数k2、k1和k0,并返回一个匿名函数/子程序,该子程序采用一个参数x,并返回具有给定系数的二次多项式的字符串表示形式及其在x处的值,即k2*x^2+k1*x+k0

现在,它返回消息“不能在使用“strict refs”时将字符串(“6”)用作数组引用”

有人知道我搞砸了什么吗

use strict;
use warnings;
use 5.10.0; 

sub make_2nd_degree_poly {
    my($k2, $k1, $k0) = @_;
    my $n = $_[0]; 
    return sub { 
        return ($k2 . 'x^2 . ' . $k1 . 'x + ' . $k0 . ' at x = ' . $n,
                $k2 * $n ** 2 + $k1 *$n + $k0
        );
    }
}

my @triplet0 = (1, 2, 3);
my @triplet1 = (4, 5, 6);
my $p1 = make_2nd_degree_poly(@triplet0);
my $p2 = make_2nd_degree_poly(@triplet1);
print "@{$p1->(1)}\n";
print "@{$p2->(2)}\n";
问题的下一部分:我需要编写一个函数/子gen_2nd_deg_polys,它接受一个3元组列表并返回一个匿名第二元组列表 度多项式

polys = gen_2nd_deg_polys([(1, 2, 3), (4, 5, 6)])
这应该是我的输出:

('1x^2 + 2x + 3 at x = 1 is ', 6)

('4x^2 + 5x + 6 at x = 2 is ', 32)
如何扩展此程序以完成此任务

     sub gen_2nd_deg_polys { 
    return map(make_2nd_degree_poly(@{$_}), @_);
}
my (@a) = @_;
@a = ([1..3],[4..6]);
my @p3 = gen_2nd_deg_polys(@a);
print @p3->(1);

您可以使用引用强制Perl在双引号字符串中插入函数调用的返回值。因此,这里您的
@{}
应该包含
[]
,以便Perl插入您正在返回的数组引用

您应该在
print
中执行
@{[]}
,告诉它您正在返回使用
@{}
进行重新引用的数组引用

将您的
print
语句更改为此。然后它应该会起作用:

print "@{[$p1->(1)]}\n";
print "@{[$p2->(2)]}\n";

不能取消引用非引用的内容。您创建的子对象返回一个列表,改为返回一个匿名数组:

    return sub {
        [ "${k2}x^2 . $k1 x + $k0 at x = $n",
          $k2 * $n ** 2 + $k1 *$n + $k0 ]
    }
或者,只返回一个字符串:

    return sub {
        "${k2}x^2 . $k1 x + $k0 at x = $n "
        . ($k2 * $n ** 2 + $k1 *$n + $k0)
    }
然后,不需要解引用:

print $p1->(1), "\n";
print $p2->(2), "\n";
更新 或者,返回一个列表,在这种情况下不需要取消引用,但您可能希望在公式和结果之间添加一个空格:

    return sub {
        my $n = $_[0];
        return "${k2}x^2 . $k1 x + $k0 at x = $n",
            ($k2 * $n ** 2 + $k1 *$n + $k0)
    }
# ...
print join ' ', $p1->(1), "\n";
print join ' ', $p2->(2), "\n";

sub gen_2nd_deg_polys {
    return map make_2nd_degree_poly(@$_), @_;
}

my @arr = ([1, 2, 3], [4, 5, 6]);
my @p3 = gen_2nd_deg_polys(@arr);
print join ' ', $_->(1), "\n" for @p3;

这是非常有用的,而且很有效,除了我的第二个$n被读作“4”,而它应该是2。@TerikBrunson:你需要
my$n=$\u0]
sub{…}
中。我将编辑原始的,因为这个问题还有很多,任何帮助都将不胜感激。通常,您应该以新问题的形式提出新问题。
gen_2nd_deg_polys
返回一个列表,不要以标量形式捕获返回值。