Одна возможность: использовать хеши, чтобы определить, был ли элемент виден ранее. Немного упрощен из вашего кода:
my %dupHash;
while (my @itemArray = $sth->fetchrow_array() ) {
my $uniqueItem = itemArray[4];
if (not exists $dupHash{$uniqueItem}) {
print "Item $uniqueItem\n";
$dupHash{$uniqueItem} = \@itemArray;
}
}
Хорошо, это очень упрощено, но вы поняли идею. Используя хэш со значениями, которые я хочу проверить, являются уникальными, я могу избежать двойной петли и эффективности алгоритма O 2 . (Черт! Все эти годы в колледже, наконец, окупились!).
Возможно, вы захотите использовать более сложный хеш-ключ, объединив все поля, в которых вы хотите искать дубликаты. Может быть, что-то вроде этого:
# Probably could use join to make it more efficient...
my $uniqueKay = "$item[3]:$item[4]:$item[5]:$item[6]:$item[7]:$item[8]";
if (not exists $dupHash{$uniqueKey}) {
Главное избегать циклического повторения всех уникальных элементов снова и снова, если вы можете хранить их в хэше.