Подтвердить что ты не робот

Как заменить хеш-ключ Perl?

Скажем, если у меня есть такой хэш:

$data = {
    'key1' => {
                'key2' => 'value1'
              },
    'key3' => {
                'key4' => {
                            'key5' => 'value2'
                          }
              },
  };

Теперь, как я могу заменить ключ "key5" другим ключевым именем, скажем, "key6"? Я знаю, как перебирать хэш и выгружать значения, но я не знаю, как заменить ключи или значения на месте. Благодарим за помощь.

4b9b3361

Ответ 1

Оператор delete возвращает удаляемое значение. Итак, это

$data->{key3}{key4}{key6} = delete $data->{key3}{key4}{key5}

сделает то, что вы ищете.

Ответ 2

Вы не можете его заменить, но вы можете легко сделать новый ключ, а затем delete() старое:

$data->{key3}{key4}{key6} = $data->{key3}{key4}{key5};
delete $data->{key3}{key4}{key5};

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

sub hash_replace (\%$$) {
  $_[0]->{$_[2]} = delete $_[0]->{$_[1]}; # thanks mobrule!
}

Затем назовите его:

hash_replace %{$data->{key3}{key4}}, "key5", "key6";

Или крутой способ (Как лучше сказать, что мы трансформируем "ключ5" в "ключ6"?):

hash_replace %{$data->{key3}{key4}}, key5 => "key6";

(Протестировано и работает)

Ответ 3

вы можете использовать YAML для глубокого погружения в ваш хэш с простым регулярным выражением:

use YAML::XS;
my $yaml = Dump $hash;
$yaml =~ s/key5/key6/;  # may wish for global sub 
$hash = Load $yaml;

Ответ 4

Это "работает", но очень жестко закодировано.

#!/bin/perl -w
use strict;

my $data = {
    'key1' => {
        'key2' => 'value1'
    },
    'key3' => {
        'key4' => {
            'key5' => 'value2'
        }
    },
};

print "$data->{key3}->{key4}->{key5}\n";

my $save = $data->{key3}->{key4}->{key5};
delete $data->{key3}->{key4}->{key5};
$data->{key3}->{key4}->{key6} = $save;

print "$data->{key3}->{key4}->{key6}\n";

Вы можете устранить операции "- > " между индексами хеширования, но не после "$ data" - как в решении Криса Лутца.