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