给出二次融合的二次多边形

时间:2015-09-26 21:22:49

标签: perl

此代码的目的是创建一个子程序,它接受三个系数k2,k1和k0,并返回一个匿名函数/子程序,它接受一个参数x并返回具有给定系数的二次多项式的字符串表示,它在x的值,即k2 * x ^ 2 + k1 * x + k0。

现在,它返回消息"不能使用字符串(" 6")作为ARRAY ref,而#34; strict refs"正在使用"

有没有人能看到我搞砸了什么?

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";

问题的下一部分:我需要编写一个函数/ sub gen_2nd_deg_polys,它取一个3元组列表并返回一个匿名列表2 度多项式。

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);

2 个答案:

答案 0 :(得分:1)

您不能取消引用不是参考的内容。您创建的子类返回一个列表,使其返回一个匿名数组:

    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;

答案 1 :(得分:0)

你可以使用引用来强制Perl在双引号字符串中插入函数调用的返回值。所以,这里你的@{}应该包含[]到perl插值你要返回一个数组参考

您应该在@{[]}print告诉它您正在使用@{}返回您正在引用的数组引用。

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

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