Как я могу заменить хэш-ключ Perl?

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

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

Теперь, как я могу заменить ключ «key5» на какое-то другое имя ключа, скажем, «key6»?

Я знаю, как пройтись по хешу и вывести значения, но я не знаю, как заменить ключи или значения на месте.


person John    schedule 29.09.2009    source источник


Ответы (3)


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

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

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

person mob    schedule 29.09.2009
comment
Спасибо за это. Я даже не знал, что так можно сделать - person John; 29.09.2009
comment
Подсветка синтаксиса кажется выключенной. Возможно, использовать lang-none? - person Peter Mortensen; 18.03.2021

Вы не можете заменить его, но вы можете легко создать новый ключ, а затем 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";

Или крутой способ (как лучше сказать, что мы преобразуем «key5» в «key6»?):

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

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

person Chris Lutz    schedule 29.09.2009
comment
Это здорово, спасибо за вашу помощь. Этот пример действительно хорош для меня, чтобы понять, как к этому подойти. - person John; 29.09.2009
comment
Подсветка синтаксиса кажется выключенной. Возможно, использовать lang-none? - person Peter Mortensen; 18.03.2021

Это «работает», но очень жестко запрограммировано.

#!/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» - как в Решение Криса Лутца.

person Jonathan Leffler    schedule 29.09.2009
comment
Я всегда предпочитал использовать наименьшее количество ->, которое мне могло сойти с рук, но я вижу, как быстро это начинает становиться волосатым. - person Chris Lutz; 29.09.2009