Получить хеш-таблицу в Perl - PullRequest
0 голосов
/ 29 марта 2012

Мне нужно сопоставить две хеш-таблицы, но их ключи не совпадают.Таким образом, я достигаю каждой хеш-таблицы и сопоставляю по значениям.Поэтому следующий код не работает:

sub _findHashElt
{
    my ($this, $hashTarget) = @_;

    my $isFound = 0;
    my $isItemFound = 1;
    my $isHashFound = 0;
    my $result = undef;
    my %hashTable=%{$this->{templates}};
    my %hashTargetHash=%{$hashTarget};
    my %hashSubTable = undef;

    while (    (my ($key, $value) =  each(%hashTable)) 
           and ($isFound          == 0               ))
    {
        $isItemFound = 1;
        $isHashFound = 0;

        ####################################
        # DOES NOT WORK
        %hashSubTable = %{$hashTable{$key}};
        ####################################

        while (    (my ($subKey, $subValue) =  each(%hashTargetHash))
               and ($isItemFound            == 1                    ))
        {
            $isItemFound = 0;
            while (    (my ($subTableKey, $subtableValue) =  each(%hashSubTable)) 
                   and ($isItemFound                      == 0                    ))
            {
                $isHashFound = 1;
                $isItemFound = ($subValue eq $subtableValue) ? 1 : 0;
            }
        }

        if ($isItemFound == 1 && $isHashFound == 1) {
            $isFound = 1;
            $result = $key;
        }
    }

    return $result;
}

И работает следующий код:

sub _findHashElt
{
    my ($this, $hashTarget) = @_;

    my $isFound = 0;
    my $isItemFound = 1;
    my $isHashFound = 0;
    my $result = undef;

    my %hashTable=%{$this->{templates}};
    my %hashTargetHash=%{$hashTarget};
    my %hashSubTable = undef;

    while (    (my ($key, $value) =  each(%hashTable)) 
           and ($isFound          == 0               ))
    {
        $isItemFound = 1;
        $isHashFound = 0;

        while (    (my ($subKey, $subValue) =  each(%hashTargetHash))
               and ($isItemFound            == 1                    ))
        {
            ####################################
            # WORK
            %hashSubTable = %{$hashTable{$key}};
            ####################################

            $isItemFound = 0;

            while (    (my ($subTableKey, $subtableValue) =  each(%hashSubTable)) 
                   and ($isItemFound                      == 0                    ))
            {
                $isHashFound = 1;

                $isItemFound = ($subValue eq $subtableValue) ? 1 : 0;
            }
        }

        if ($isItemFound == 1 && $isHashFound == 1) {
            $isFound = 1;
            $result = $key;
        }
    }

    return $result;
}

Пожалуйста, кто-то может сказать мне, в чем проблема, пожалуйста?

EDIT

#############################################
################# TEST PART #################
#############################################
my $this = {"templates" => {}};
my $example = {'key0' => {'key00' => 'test00', 'key01' => 'test01', 'key02' => '0', 'key03' => 'test03'},
               'key1' => {'key00' => 'test10', 'key01' => 'test11', 'key02' => '1', 'key03' => 'test13'},
               'key2' => {'key00' => 'test20', 'key01' => 'test21', 'key02' => '1', 'key03' => 'test23'},
               'key3' => {'key00' => 'test30', 'key01' => 'test31', 'key02' => '0', 'key03' => 'test33'}};
my $expected = {'key00' => 'test00', 'key01' => 'test01', 'key02' => '0', 'key03' => 'test03'};
$this->{templates}=$example;
_findHashElt($this, \%expected );

В первом случае ключ не был найден, а во втором ключ был найден ...

EDIT

Первый случай:

$ perl myTest.pl
Key not found

Второй случай:

$ perl myTest.pl
Key found
{
   key01 : test01
   key00 : test00
   key03 : test03
   key02 : 0
}

РЕДАКТИРОВАТЬ

Еще одна вещь, я думаю, этобудет полезно

$ perl --version

This is perl, v5.10.1 (*) built for i686-cygwin-thread-multi-64int
(with 13 registered patches, see perl -V for more detail)

1 Ответ

0 голосов
/ 30 марта 2012

Хорошо, я нашел ответ на свой вопрос

Извлечение из perlfunc (1):

Существует один итератор для каждого хэша, общий для всех "каждого"вызовы функций «ключи» и «значения» в программе;его можно сбросить, прочитав все элементы из хэша или оценив «ключи HASH» или «значения HASH».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...