我正在编写一个需要分组的脚本,我无法在SQL中执行这些操作。我得到的结果是ArrayReference。我对DB的查询返回类似这样的内容。
1234 TIN
32364 TIN
34367 BOX
87484 TIN
45674 BOX
45476 TIN
4575 BOX
我希望将它们分组为:
These are the list of BOX: 4575,45674,34367.
These are the list of TIN: 1234,32364,87484,45476.
有什么建议吗?
答案 0 :(得分:0)
如果您坚持不使用数据库,则以下代码将执行基本分组。
# Assume data is in @rows
my %group;
push @{ $group{$_->[1]} }, $_->[0] for @rows;
while (my ($key, $items) = each %group) {
print "These are the list of $key: ". join(',', @$items) .".\n";
}
答案 1 :(得分:0)
那么你的数组引用到底是什么样的?
是这样的数组数组:
@myArray = [
[
1234,
TIN,
]
[
32364,
TIN,
]
34367,
BOX,
]
]
或一系列哈希:
= [
{
NUMBER => 1234,
TYPE => TIN,
}
]
或者每一行是fetch
某种形式的单一回报?使用DBI接口从数据库返回数据有五种不同的方法:
假设你使用了fetchall_arrayref
,这是一个可以做你想做的示例程序:
use strict;
use warnings;
use feature qw(say switch);
use Data::Dumper;
my $fetchedSqlData = [
[ qw(1234 tin) ],
[ qw(3434 box) ],
[ qw(4341 tin) ],
[ qw(2343 box) ],
];
my @tinList;
my @boxList;
foreach my $row (@{$fetchedSqlData}) {
if ($row->[1] eq "tin") {
push @tinList => $row->[0];
}
else {
push @boxList => $row->[0];
}
}
say "These are the list of BOX: " . join ", " => @boxList;
say "These are the list of TIN: " . join ", " => @tinList;
更好的方法是根据第2列中的值获得单个散列,并且每个散列都是对数组的引用:
my %typeHash;
foreach my $row (@{$fetchedSqlData}) {
$typeHash{$row->[1]} = [] if not exist $typeHash{$row->[1]};
push @{$typeHash{$row->[1]}} => $row->[0];
}
这有点令人困惑,但如果您在列表中添加“CRATE”类型,则会更灵活。
从中打印出来的数据将是:
foreach my $type (sort keys %typeHash) {
say "These are the list of $type: " . join ", " => $typeHash{$type}->[0];
}
顺便说一下,我没有测试这个数组的哈希,所以期待编码错误。而且,是的,我知道我不必做$typeHash{$row->[1]) = [] if not exists $typeHash{$row->[1]}
,但我喜欢这样做,因为它确保我在哈希元素中存储正确类型的数据。
要彻底测试,我必须构建一个数据库,然后执行DBI fetchall_arrayref
以确切地验证数据的返回方式。我基于我上次使用它和文档时DBI如何工作的不稳定记忆。
可能有一种方法可以使用map
执行此操作,但我通常没有发现map
比简单循环更有效。