我是perl的新手(但是来自c#背景)并且我正在尝试将一些脚本移动到Windows框中。 由于某些模块无法轻松使用Windows,因此我改变了连接数据库的方式。 我有一个sqlserver数据库,我有一个循环读取表中的每一行,然后在这个循环内发送另一个查询来选择不同的信息。 我是错误,在同一连接中无法一次执行两个语句。 由于我的连接对象是全局的,我无法看到一个简单的方法,因此决定使用以下方法将第一组数据存储在数组中:
my $query = shift;
my $aryref = $dbh->selectall_arrayref($query) || die "Could not select to array\n";
return($aryref);
(这是在一个名为的模块文件中)
然后我做一个foreach循环(其中@ $ s_study是上面返回的$ aryref)
foreach my $r_study ( @$s_study ) {
~~~
my $surveyId=$r_study->{surveyid}; <-------error this line
~~~~
};
当我运行此操作时,我收到错误“不是哈希引用”。我不明白?! 任何人都可以帮忙!
贝克斯
答案 0 :(得分:8)
如果您希望将每一行存储为哈希值,则需要向selectall_arrayref
提供{ Slice => {} }
参数:
my $aryref = $dbh->selectall_arrayref($query, { Slice => {} });
默认情况下,它返回对数组的引用,该数组包含对每个提取数据行的数组的引用。
答案 1 :(得分:1)
$r_study->{surveyid}
是一个hashref
$r_study->[0]
是一个arrayref
这是你的错误。 你应该使用第二个
答案 2 :(得分:0)
如果您遇到方法问题,那么第一步是阅读该方法的文档。这是selectall_arrayref文档的链接。它说:
这种实用方法结合起来 “准备”,“执行”和 “fetchall_arrayref”变为单一 呼叫。它返回一个引用 包含对引用的数组 每个的数组(或哈希,见下文) 提取的数据行。
因此,默认行为是返回对每行包含数组引用的数组的引用。这解释了你的错误。您正在获取数组引用,并且您正在尝试将其视为哈希引用。我不确定错误会更清楚。
然而,有一个有趣的地方,它说“或哈希,见下文”。继续阅读,我们发现:您可能经常想要获取数组 每行存储为的行数 哈希值。这可以通过以下方式简单地完成:
my $emps = $dbh->selectall_arrayref( "SELECT ename FROM emp ORDER BY ename", { Slice => {} } ); foreach my $emp ( @$emps ) { print "Employee: $emp->{ename}\n"; }
所以你有两个选择。切换代码以使用数组ref而不是散列引用。或者在调用中添加“{Slice =&gt; {}}”选项,这将返回散列引用。
文档很清楚。非常值得一读。