URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10280
[ Назад ]

Исходное сообщение
"Странное поведение хеша в perl ???"

Отправлено tian , 25-Сен-19 09:16 
Приветствую!
Подскажите знающие - второй день мучаюсь, ничего не пойму.
Есть perl версии:
This is perl 5, version 18, subversion 1 (v5.18.1) built for x86_64-linux-thread-multi
Также есть такой простой код:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %hash_cl = ( fields=>{ id=>853, id_link=>890 } );
my %hash_cl_slave = %hash_cl;

print Dumper(\%hash_cl);
print "\n";
print Dumper(\%hash_cl_slave);
print "\n";

$hash_cl_slave{"fields"}{"id"} = $hash_cl_slave{"fields"}{"id_link"};

print Dumper(\%hash_cl);
print "\n";
print Dumper(\%hash_cl_slave);
print "\n";

На выходе имею следующее:
$VAR1 = {
          'fields' => {
                        'id_link' => 890,
                        'id' => 853
                      }
        };

$VAR1 = {
          'fields' => {
                        'id_link' => 890,
                        'id' => 853
                      }
        };

$VAR1 = {
          'fields' => {
                        'id_link' => 890,
                        'id' => 890
                      }
        };

$VAR1 = {
          'fields' => {
                        'id_link' => 890,
                        'id' => 890
                      }
        };

Вопрос таков: почему также меняется значение хеша $hash_cl{"fields"}{"id"} ???
Почему ???
Такое впечатление, что я не скопировал хеш, а ссылку создал, но ведь это не так.



Содержание

Сообщения в этом обсуждении
"Странное поведение хеша в perl ???"
Отправлено tian , 25-Сен-19 09:37 
В очередной раз поизучал маны, кажется наступил на очевидные грабли ))
Все-таки я скопировал ссылку... Как -то не задумался сначала об этом.
Надежный вариант решения проблемы - копировать поочередно значения из одного хеша в другой.
Вроде как разумного решения другого нет, особенно, если хеши вложенные...


"Странное поведение хеша в perl ???"
Отправлено tian , 25-Сен-19 10:25 
Вот для копирования набросал такую функцию, может кому поможет.

sub copy_hash {
    my ( $hash_in, $hash_out ) = @_;

    while( my $key = each %{$hash_in} ) {
        if ( ref($$hash_in{$key}) eq 'HASH' ) {
            copy_hash( \%{$$hash_in{$key}}, \%{$$hash_out{$key}} );
        } else {
            $$hash_out{$key} = $$hash_in{$key};
        }
    }
}


"Странное поведение хеша в perl ???"
Отправлено Pahanivo , 26-Сен-19 09:00 
Вложенная структура в данном случае это хеш ссылок на анонимные хеши. Ключи первого уровня у тебя скопировались - а далее работаешь с теми же ссылками.

"Странное поведение хеша в perl ???"
Отправлено ACCA , 27-Сен-19 06:30 
> Вот для копирования набросал такую функцию, может кому поможет.

Не нужно изобретать велосипед.

use Clone;