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

Давайте сравним два примера, одна среда разработки, которая использует управление исходным кодом и то, которое не делает.

  • А: Действительно Использует
  • B: Делает не Использование

Сценарий 1: проект требуют, завершают и развернул

, А + B) Программисты разрабатывают проект внутренне, когда он завершается, выставьте его к тестированию и затем поставьте клиенту (кем бы ни это может быть)

Не много различия, в большом Сценарии 2 изображения

: После того, как проект выпущен, клиент решает, что они не хотят функцию X

, А + B) Разработчики удаляют код, который клиент не хочет, тестирует и поставляет.

Снова, не много различия.

Сценарий 3: Две недели спустя клиент решает, что они на самом деле хотят функцию X

, Разработчики А повторно интегрируют код, который они вынули в 2 назад в нормальное дерево разработки, тест, и поставить.

B) разработчики ищут старый код своих персональных машин, файлового сервера и резервных копий. Если они находят код, они должны вручную повторно вставить каждый файл. Если они не делают, они, вероятно, должны повторно кодировать ту всю функцию.

легко получить старый код, который Вы вынули по той или иной причине

Сценарий 4: существует странная ошибка в системе, где функция, как предполагается, возвращает булев результат, но всегда возвращает false. Это не было похоже на это две недели назад.

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

B) Разработчики проводят недели, пытаясь выяснить, какова проблема. В конечном счете они замечают возврат на неправильной строке и фиксируют его. Не наличие управления исходным кодом означает, что они должны были исследовать каждый файл, который выполнялся, вместо того, чтобы найти различия от того, когда это работало и теперь.

Сценарий 5: Кто-то повреждает сборку. Это заканчивает тестирование и только несколько замеченных недели спустя.

А команда исследует историю фиксации, узнает, кто повредил сборку, заставляет того человека зафиксировать ее и купить ужин команды.

B) команда должна возвратиться через весь проект найти ошибку, но не может выяснить, кто вставил тот код. Разработчики обвиняют друг друга и команду динамические сбои.

легко видеть, кто фиксировал что, когда, и почему.

19
задан John 29 September 2009 в 02:55
поделиться

3 ответа

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

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

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

46
ответ дан 30 November 2019 в 02:24
поделиться

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

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

9
ответ дан 30 November 2019 в 02:24
поделиться

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

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

0
ответ дан 30 November 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: