как использовать цикл foreach для сравнения двух массивов хэшей - PullRequest
0 голосов
/ 25 октября 2018

Мне нужно использовать цикл foreach для сравнения двух массивов хешей.но я не знаю, как это сделать.

мои исходные данные:

NewData(file 1)
Puma
77777 33333 44444 55555 
Adidas
99999 88888 55555 77777 
22222 11111 33333 44444
Brooks
11111 22222 33333 44444 
33333 44444 55555 66666 

OldData(file 2)

Puma
77777 33333 44444 55555 
Adidas
11111 11111 33333 44444 
99999 88888 55555 77777 
Brooks
11111 22222 33333 44444 
33333 44444 55555 66666 

мой хэш1:

'Adidas' => {
                        'y1' => [
                                  '88888',
                                  '11111'
                                ],
                        'x2' => [
                                  '55555',
                                  '33333'
                                ],
                        'y2' => [
                                  '77777',
                                  '44444'
                                ],
                        'x1' => [
                                  '99999',
                                  '22222'
                                ]
                      },
          'Puma' => {
                      'y1' => [
                                '33333'
                              ],
                      'x2' => [
                                '44444'
                              ],
                      'y2' => [
                                '55555'
                              ],
                      'x1' => [
                                '77777'
                              ]
                    },
 'Brooks' => {
                        'y1' => [
                                  '22222',
                                  '44444'
                                ],
                        'x2' => [
                                  '33333',
                                  '55555'
                                ],
                        'y2' => [
                                  '44444',
                                  '66666'
                                ],
                        'x1' => [
                                  '11111',
                                  '33333'
                                ]
                      }


 };

мой хэш2:

$VAR1 = {
          'Adidas' => {
                        'y1' => [
                                  '11111',
                                  '88888'
                                ],
                        'x2' => [
                                  '33333',
                                  '55555'
                                ],
                        'y2' => [
                                  '44444',
                                  '77777'
                                ],
                        'x1' => [
                                  '11111',
                                  '99999'
                                ]
                      },
          'Puma' => {
                      'y1' => [
                                '33333'
                              ],
                      'x2' => [
                                '44444'
                              ],
                      'y2' => [
                                '55555'
                              ],
                      'x1' => [
                                '77777'
                              ]
                    },
 'Brooks' => {
                        'y1' => [
                                  '22222',
                                  '44444'
                                ],
                        'x2' => [
                                  '33333',
                                  '55555'
                                ],
                        'y2' => [
                                  '44444',
                                  '66666'
                                ],
                        'x1' => [
                                  '11111',
                                  '33333'
                                ]
                      }
        };

мой код попытки для сопоставления и несопоставление:

 foreach my $newq (keys %hash1)
    {
         foreach my $oldq(keys %hash2)
         {
         if ( $newq eq $oldq)
         {
         foreach my $newx1(@{$hash1{$newq}{x1}})
         {
         foreach my $oldx1(@{$hash2{$oldq}{x1}})
         {
         if ($newx1 == $oldx1)
         {
         print "$newq\t$newx1\t$oldx1\n";
         }
         if ($newx1 != $oldx1)
         {
         print "$newq\t$newx1\t$oldx1\n";
         }
             }

мой вывод для сопоставления

         New     Old
Adidas  99999   99999
Puma    77777   77777
Brooks  11111   11111
Brooks  33333   33333

мой вывод для сопоставления:

        New     Old
Adidas  99999   11111
Adidas  22222   11111
Adidas  22222   99999
Brooks  11111   33333
Brooks  33333   11111

желаемый вывод для сопоставления:

                      New                           Old
Puma                77777 33333 44444 55555     77777 33333 44444 55555
Adidas              99999 88888 55555 77777     99999 88888 55555 77777
Brooks              11111 22222 33333 44444     11111 22222 33333 44444
Brooks              33333 44444 55555 66666     33333 44444 55555 66666


Not matching

Adidas              22222 11111 33333 44444     11111 11111 33333 44444

Теперь я могу получить правильное соответствие для x1.Но я получаю неправильный вывод для «несоответствия».мой ожидаемый вывод для «несоответствия» - Adidas 22222 11111 только потому, что 'x1=> 99999' представлен как в новых, так и в старых данных.И я не уверен, как продолжить с 'y1, x2 и y2' ...

1 Ответ

0 голосов
/ 25 октября 2018

x1, y1 и т. Д. - это просто ключи в хэше, поэтому вы можете получить их так же, как вы получаете ключи любого хэша, как этот

keys %{$hash1{$newq}}

Вам не нужно создавать свой кодтак сложно, как у вас, хотя со всеми этими многими слоями петель.Возьмем, к примеру, эту часть ...

foreach my $newq (keys %hash1)
{
     foreach my $oldq(keys %hash2)
     {
         if ( $newq eq $oldq)
         {
             # ....
         }
     }
 }

Вам не нужно перебирать оба хэша, потому что вы можете проверить, существует ли ключ в другом хэше.Представьте, что у ваших хэшей по 100 ключей.Ваш код в настоящее время проверяет все 100 ключей в %hash2 с каждым ключом в %hash1, а затем делает это снова, поэтому 20000 тестов.Если вы напишите код, подобный следующему ...

foreach my $newq (keys %hash1)
{
    if(defined($hash2{$newq}))
    {
        # both hashes have this key
    }
    else
    {
        # %hash2 doesn't have the key
    }
}

foreach my $newq (keys %hash2)
{
    if(!defined($hash1{$newq}))
    {
        # %hash1 doesn't have the key
    }
    else
    {
        # They both do, but we already know that from the first loop
    }
}

... он будет проверять каждый ключ в двух хэшах только один раз, так что всего 200 проверок.

Итак, в конечном итоге готовый кодможет быть:

my %nonmatching;
print "Matching\n";
foreach my $outerkey (keys %hash1)
{
    if(defined($hash2{$outerkey}))
    {
        foreach my $innerkey (keys %{$hash1{$outerkey}})
        {
            if(join(" ",sort @{$hash1{$outerkey}{$innerkey}}) eq join(" ",sort @{$hash2{$outerkey}{$innerkey}}))
            {
                 printf "%-20s %30s %30s\n",$outerkey, join(" ",@{$hash1{$outerkey}{$innerkey}}), join(" ",@{$hash2{$outerkey}{$innerkey}});
            } 
            else
            {
                 $nonmatching{$outerkey}{$innerkey}=1;
            }
        }
    }
    else
    {
        foreach my $innerkey (keys %{$hash1{$outerkey}})
        {
            $nonmatching{$outerkey}{$innerkey}=1;
        }
    }
}

foreach my $outerkey (keys %hash2)
{
    if(!defined($hash1{$outerkey}))
    {
        foreach my $innerkey (keys %{$hash2{$outerkey}})
        {
            $nonmatching{$outerkey}{$innerkey}=1;
        }
    }
}

print "Nonmatching\n";
foreach my $outerkey (keys %nonmatching)
{
    foreach my $innerkey (keys %{$nonmatching{$outerkey}})
    {
         printf "%-20s %30s %30s\n",$outerkey, join(" ",@{$hash1{$outerkey}{$innerkey}}), join(" ",@{$hash2{$outerkey}{$innerkey}});
    }
}

Хотя объявленные вами хэши не совпадают с исходными данными, поэтому выходные данные выглядят не так, как вы ожидаете.Я бы ожидал, что ваши хеши будут больше похожи на приведенный ниже фрагмент, поэтому, возможно, код чтения вашего файла не работает так, как вы этого хотите?

'Adidas' => {
   'x1' => [
       '99999','88888','55555','77777'
    ]
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...