Извините, если то, что я называю массивом хэшей, является чем-то другим. С этого момента я буду называть эти вещи просто «структурами». В любом случае, Скажем, у меня есть две структуры:
my @arrayhash;
push(@arrayhash, {'1234567891234' => 'A1'});
push(@arrayhash, {'1234567890123' => 'A2'});
и
my @arrayhash2;
push(@arrayhash2, {'1234567891234' => '567'});
push(@arrayhash2, {'1234567890123' => '689'});
Как я могу получить вывод:
@output= {
'567' => 'A1',
'689' => 'A2',
}
Ни в одной из структур не будет отсутствующих элементов, а также не будет значений undef.
Да, оба хэша будут иметь несколько (и одинаковое количество) пар ключ-значение, но порядок не задан.
Хорошо, спасибо, а каждый ключ гарантированно встречается только один раз? возможно ли, что ключ xyz может встречаться более чем в одном хэше в массиве? если да, то каким должно быть правило, чтобы решить, какое значение использовать?
Каждый ключ может появиться только один раз
Вы можете создать временный хэш, который вы используете для сопоставления между ними.
#!/usr/bin/perl
use strict;
use warnings;
my @arrayhash;
push @arrayhash, {'1234567891234' => 'A1'};
push @arrayhash, {'1234567890123' => 'A2'};
my @arrayhash2;
push @arrayhash2, {'1234567891234' => '567'};
push @arrayhash2, {'1234567890123' => '689'};
my %hash; # temporary hash holding all key => value pairs in arrayhash
foreach my $h (@arrayhash) {
while( my($k,$v) = each %$h) {
$hash{$k} = $v;
}
}
my %output;
foreach my $h (@arrayhash2) {
while( my($k,$v) = each %$h) {
$output{$v} = $hash{$k};
}
}
my @output=(\%output);
# Build $merged{$long_key} = [ $key, $val ];
my %merged;
for (@arrayhash2) {
my ($k, $v) = %$_;
$merged{$k}[0] = $v;
}
for (@arrayhash) {
my ($k, $v) = %$_;
$merged{$k}[1] = $v;
}
my %final = map @$_, values(%merged);
или
# Build $lookup{$long_key} = $key;
my %lookup;
for (@arrayhash2) {
my ($k, $v) = %$_;
$lookup{$k} = $v;
}
my %final;
for (@arrayhash) {
my ($k, $v) = %$_;
$final{ $lookup{$k} } = $v;
}
Могут ли ваши хэши содержать более одной пары ключ-значение? добавляются ли хэши в массив в том же порядке IE, если я найду хэш с ключом xyz в индексе 5 массива, уверен ли я, что тот же ключ xyz будет в индексе 5 массива 2? или они упорядочены по-другому?