Так как именно выглядит ссылка на ваш массив?
Это массив массивов, подобный этому:
@myArray = [
[
1234,
TIN,
]
[
32364,
TIN,
]
34367,
BOX,
]
]
Или массив хэшей:
= [
{
NUMBER => 1234,
TYPE => TIN,
}
]
Или каждая строка представляет собой единичное возвращение некоторой формы fetch
?Существует пять различных способов возврата данных из базы данных с использованием интерфейса DBI:
- fetchrow_arrayref
- fetchrow_array
- fetchrow_hashref
- fetchall_arrayref
- fetchall_hashref
Предполагается, что вы использовали 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
быть более эффективным, чем простая петля.