我是Perl新手,并且在解除引用DBI模块中fetchall_arrayref结果的数组时出现问题:
my $sql = "SELECT DISTINCT home_room FROM $classlist";
my $sth = $dbh->prepare($sql);
$sth->execute;
my $teachers = $sth->fetchall_arrayref;
foreach my $teacher (@{$teachers}) {
print $teacher;
}
运行它将打印引用而不是数组中的值。
然而,当我跑步时:
my $arrref = [1,2,4,5];
foreach (@{$arrref}) {
print "$_\n";
}
我得到了数组的值。
我做错了什么?谢谢你的帮助!
杰夫
答案 0 :(得分:8)
来自doc
fetchall_arrayref方法可以 用于获取所有数据 从准备好的和执行的 声明句柄。 它返回一个 对包含的数组的引用 每行一个参考。
因此,在您的示例中,$teacher
是ARRAY参考。
所以你需要遍历这个数组ref
foreach my $teacher (@{$teachers}) {
foreach my $titem (@$teacher) {
print $titem;
}
}
答案 1 :(得分:7)
如果您只想提取教师列,则需要使用:
my @teachers = @{$dbh->selectcol_arrayref($sql)};
答案 2 :(得分:5)
fetchall_arrayref
提取 all 查询的结果,因此您实际获得的是对数组数组的引用。返回的每一行都是列的arrayref。由于您的查询只有一列,您可以说:
my $teachers = $sth->fetchall_arrayref;
foreach my $teacher (@{$teachers}) {
print $teacher->[0];
}
得到你想要的东西。
查看更多:
答案 3 :(得分:5)
您有一个行数组的引用。每行都是对字段数组的引用。
foreach my $teacher_row (@$teachers) {
my ($home_room) = @$teacher_row;
print $home_room;
}
你会看到与Data::Dumper的区别。
use Data::Dumper;
print(Dumper($teachers));
print(Dumper($arrref));
答案 4 :(得分:3)
$sth->fetchall_arrayref
返回对每行包含一个引用的数组的引用!
请查看DBI文档here。
答案 5 :(得分:1)
根据DBI's fetchall_arrayref()的文档:
fetchall_arrayref方法可以 用于获取所有数据 从准备好的和执行的 声明句柄。它返回一个 对包含的数组的引用 每行一个参考。
你是间接的一个层面:
my $sql = "SELECT DISTINCT home_room FROM $classlist";
my $sth = $dbh->prepare($sql);
$sth->execute;
my $teachers = $sth->fetchall_arrayref;
foreach my $teacher (@{$teachers}) {
local $" = ', ';
print "@{$teacher}\n";
}
有时候数据结构可能有点难以想象。当发生这种情况时,我求助于Data::Dumper
,以便我可以插入这样的行:
print Dumper $teacher;
我发现有时通过转储数据结构,我会得到一个即时贴图,用作创建操作结构的代码时的参考点。我最近只是偶尔使用Dumper来彻底解决一个结构的梦魇,以便伸直我的脑袋。
答案 6 :(得分:0)
您可以使用map取消引用返回的结构:
@teachers = map { @$_->[0] } @$teachers;
现在你有一个简单的教师阵列。