gpt4 book ai didi

arrays - Perl:用于数组定义的括号与括号,为什么将一个视为标量?

转载 作者:行者123 更新时间:2023-12-03 23:13:33 26 4
gpt4 key购买 nike

我在关注 this Perl 的 HTML::Template 模块教程。这是模板:

<!--template2.tmpl-->
<html>
<body>
<table>
<tr>
<th>Language</th>
<th>Description</th>
</tr>
<tmpl_loop name="language">
<tr>
<td><tmpl_var name="language_name"></td>
<td><tmpl_var name="description"></td>
</tr>
</tmpl_loop>
</table>
</body>
</html>

这是 CGI 测试程序:
#!"C:\Strawberry\perl\bin\perl.exe" -wT
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
use HTML::Template;

my @rows = (
{
language_name => 'C#',
description => 'Created by Microsoft'
},
{
language_name => 'PHP',
description => 'Hypertext Preprocessor'
},
{
language_name => 'Haskell',
description => 'Functional language'
},
);

print header;
my $template=HTML::Template->new(filename=>'template2.tmpl');
$template->param(language => @rows);
print $template->output();

这失败并出现以下错误: HTML::Template::param() : attempt to set parameter 'language' with a scalar - parameter is not a TMPL_VAR!
但是,当我将 @rows 的定义从使用括号更改为使用方括号(从 my @rows=(...)my @rows = [...] )时,代码可以正常工作;它显示一个包含数据的表格。

据我了解 this文章中,第一种形式是从列表定义的数组,第二种形式是对匿名数组的引用。我仍然不清楚为什么第一种形式不起作用。感谢您为我澄清这一点。

最佳答案

您正在遵循的教程包含错误。线

$template->param( language => @languages );

应该
$template->param( language => \@languages );

为什么?简短回答:传递给 param 的循环名称的右侧必须是对数组的引用,而不是数组。

长答案:当您将参数传递给函数或方法时,所有参数都会扩展为一个长列表。这是初学者的常见错误来源。因此,在您的代码(以及教程的代码)中,您没有将两个参数传递给 param方法中,您传递了四个(一个用于字符串“语言”,三个用于@languages 的元素。

这是这个参数列表解开的一个例子。如果你有如下三个变量:
my $scalar = 'bear';
my @array = ('rat', 'moose', 'owl');
my %hash = (mass => 500, units => 'kg');

然后将它们传递给这样的函数:
some_function($scalar, @array, %hash);

然后该函数将看到八个参数: 'bear' , 'rat' , 'moose' , 'owl' , 'mass' , 500 , 'units' , 和 'kg' !也许更令人惊讶的是,散列中的两组值可能以不同的顺序传递,因为散列不是以确定的顺序存储或检索的。

您将括号更改为方括号的解决方案有效,但不是一个很好的理由。括号分隔列表(可以存储在数组或散列中);方括号分隔对数组的引用。因此,您的方括号代码会创建对匿名数组的引用,然后将其存储为命名数组的第一个(也是唯一的)元素 @rows .相反,您应该将数组引用(用方括号分隔)存储在标量变量(例如 $rows )中,或者您应该使用括号将列表存储在数组 @rows 中,并将对该数组的引用传递给 param方法(通过使用反斜杠,就像我在上面对 \@languages 所做的那样)。

关于arrays - Perl:用于数组定义的括号与括号,为什么将一个视为标量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47703545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com