此代码的目的是创建一个子程序,它接受三个系数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);
答案 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";