当我在脚本中声明数组时,我不知道为什么我的脚本可以工作,但是当我尝试从数据库中获取数组数据时,我的脚本却无法工作。
use Template;
my $template = Template->new;
if ( $info ) {
my $select = $DBH->prepare("SELECT FOO, BAR, MOO FROM tble WHERE CONCAT(FOO, ', ', BAR, ', ', MOO) LIKE ?");
$select->execute('%' . $info . '%');
$names = $select->fetchall_arrayref();
foreach $names ( @$names ) {
( $variable1, $variable2, $variable3 ) = @$names;
}
}
my $templ = <<START_HTML;
<!DOCTYPE html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1
+" />
<title>Untitled Document</title>
</head>
<body>
[% FOREACH name IN list %]
<li>
<div class='inforno'>
<img src='inforno'>
</div>
<div class='inforno'>
<a href='#' class='inforno'>[% name %]</a>
</div>
<span class='inforno'>
<a href='#' class='inforno'>Edit user</a>
</span>
</li>
[% END %]
</body>
</html>
START_HTML
$template->process(\$templ, { list => \@$names })
or die $template->error;
ARRAY(0x2030674)
ARRAY(0x2030634)
ARRAY(0x2030618)
当我跑步时,我得到那个错误。我想从数据库中获取数组数据。
答案 0 :(得分:2)
fetchall_arrayref返回对数组的引用,该数组对查询返回的每一行都有一个元素。这些元素是对每列有一个元素的数组的引用。
您缺少循环返回的行的代码。
答案 1 :(得分:1)
这很奇怪:
{ list => \@$names }
$names
是对数组的引用。您将其引用(@$names
),然后再引用另一个引用的数组(\@$names
)。您可以通过以下方式获得完全相同的结果:
{ list => $names }
但是,这些都不能解决您的问题。您正在调用fetchall_arrayref()
并返回一个数组引用,其中该数组的每个元素都是对另一个数组的引用。实际上,它是一个二维数组。外部数组用于数据库查询返回的行,内部数组用于每一行中的各个字段。
当您看到类似ARRAY(0x2030674)
的值时,您应该意识到您正在显示数组引用,并且还需要再进行一级解引用。
您的模板代码需要看起来像这样:
[% FOREACH row IN LIST -%]
<p>Start of new record:</p>
<ul>
[% FOREACH field IN row -%]
<li>[% field %]</li>
[% END -%]
</ul>
[% END %]
更新:您说:
我跑步时遇到错误。
但是那里没有错误。这甚至不是警告。只是您不太了解的数据:-)