假设我有一个类似的查询:
my $sql = "SELECT dev_name,
OID_name,
Obj_Val
FROM dev_logs";
表的值如下
+----+------------+----------------------+---------+---------------------+
| id | dev_name | OID_name | Obj_Val | timeStamp |
+----+------------+----------------------+---------+---------------------+
| 1 | iKazatseva | ubntWlStatRssi | 29 | 2017-07-22 15:18:34 |
| 2 | iKazatseva | ubntWlStatSignal | -67 | 2017-07-22 10:12:32 |
| 3 | iKazatseva | ubntWlStatCcq | 91 | 2017-07-22 15:18:34 |
| 4 | iKazatseva | ubntWlStatNoiseFloor | -96 | 2017-07-27 16:45:24 |
+----+------------+----------------------+---------+---------------------+
如何将查询返回的值存储在如下所示的二维数组中?:
+------------+----------------------+---------+
| dev_name | OID_name | Obj_Val |
+------------+----------------------+---------+
| iKazatseva | ubntWlStatRssi | 29 |
| iKazatseva | ubntWlStatSignal | -67 |
| iKazatseva | ubntWlStatCcq | 91 |
| iKazatseva | ubntWlStatNoiseFloor | -96 |
+------------+----------------------+---------+
我已经尝试了一些东西,但我所能得到的只是将它们绑定在一个一维数组中,例如:
my @devLogsArr = $dbh->selectall_arrayref($sql);
或者
my @OID_names= map {$_->[1]}
@{$dbh->selectall_arrayref($sql)};
或将它们绑定在变量中,例如:
$sth->bind_col(1, \$devname);
$sth->bind_col(2, \$OID);
$sth->bind_col(3, \$value);
print "$devname\t$OID\t$value\n" while $sth->fetchrow_arrayref;
my @devLogsArr;
push(@devLogsArr, (devname=> $devname, OID=> $OID, value=> $value))
while $sth->fetchrow_arrayref;
但它远不是我想做的。我知道我可以通过查询每个单独列的数据库来完成,但这将是多余的。
我在这里问的可行吗?
提前致谢。
所述selectall_arrayref()
返回一个数组引用。在 DBI 中看到它。因此我们可以将其用作
my $all_rows = $dbh->selectall_arrayref($sql);
将它分配给一个变量,一个标量,$all_rows
。为了取消引用此并创建一个数组
my @all_rows = @{ $all_rows };
我使用相同的名称(“all_rows”)只是为了表明具有相同名称的标量 ( $
) 和数组 ( @
) 是不同的变量。不过,这不是我推荐的做法,因为可能会导致混淆;仔细选择名字。在这种情况下,{ }
不需要并且@$all_rows
很好。
现在您可以打印内容
foreach my $row (@all_rows) {
print "@$row\n";
}
$row
从数组中检索到的每个本身都是一个数组引用,因此我们取消引用它 ( @$row
),或
print "@$_\n" for @all_rows;
引用对于工作来说非常方便,因此可能没有太多理由使用行创建实际数组;把它放在里面$all_rows
。打印出来
print "@$_\n" for @$all_rows;
where@$all_rows
取消引用$all_rows
并创建一个for
迭代列表,将每个元素放在特殊的$_ 变量中。然后取消引用@$_
,并"@$_"
在print
ing 中进行插值,以便我们在元素之间获得空格以获得清晰的读数。
文献:教程perlreftut、食谱perldsc和参考perlref。
现在,为了以某种方式添加列名,首先阐明这样做的目的很重要。如果是为了查找,那么应该通过什么来查找?如果您按列名查询,那么您希望如何访问一行的元素?通过索引,还是以某种方式再次通过名称?您是否也希望能够方便地遍历它?保持列的顺序?
在这一点上,我们实际上是在实现关系数据库风格的功能。
所以也许只是保持简单。arrayref 有信息,为了显示,您可以简单地先打印列名。格式化可以通过printf 处理,详细信息在sprintf 中可用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句