Хобрук: Ваш путь к мастерству в программировании

Использование Perl-хэша

Я пытаюсь создать хеш из следующего файла примера:


Образец файла:

#NewName              OldName
Axc.Sx2.1_Axc.Wx2.1  1BDER
Axc.Sx2.1_Axc.Wx2.1  1ADER
Axc.Wxx.5            1DDER

Ключи хеша должны быть newName, а значения должны быть oldname. Код ниже работает достаточно хорошо для строк, которые уникальны в файле:

while (<$mapF>) {
    chomp $_;
    next if /^\s*(#.*)?$/;
    next if /^\s+.*$/;
    ##latestRuleName OldRuleName
    if ( $_ =~ /(\S+)\s+(\S+)/gi ) {
        # create list and apped $2
        $mapHash{$1} = $2;
    }
}

foreach ( keys %mapHash ) {
    print "$_\n";
}

Но для повторяющихся записей (например, строки 1 и строки 2 в приведенном выше фрагменте) первая запись перезаписывается второй. следовательно, я получаю только две записи в своем хэше:

Axc.Sx2.1_Axc.Wx2.1  
Axc.Wxx.5

Есть ли способ получить все три записи в mapHash?

22.09.2014

Ответы:


1

Ключи в хеше должны быть уникальными. Однако вы можете хранить несколько значений для каждого ключа, это называется Hash of Arrays или HoA. Это означает, что ссылка на массив хранится в каждом ключе:

push @{ $mapHash{$1} }, $2;
22.09.2014
  • спасибо большое хороба. Как теперь получить доступ к этому хешу массива? 22.09.2014
  • @DiveshRastogi: $mapHash{key} будет ссылкой на массив, поэтому вы можете подписать его с помощью $mapHash{key}[0] и т. д. или разыменовать его, чтобы получить полный массив: @{ $mapHash{key} }. 22.09.2014
  • Большое спасибо Choroba :) теперь все готово :) 22.09.2014

  • 2

    Вы также можете использовать модуль CPAN Tie::Hash::MultiValue, который хранит несколько значения на ключ

    22.09.2014
  • Большое спасибо Miguel Prz за указание модуля CPAN:. Я обязательно воспользуюсь этим в будущем. 22.09.2014
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.