Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> изменение Ключей хэша 
:(
    Опции темы
mastercz
Дата 22.1.2009, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет




Необходимо пропарсить хэш и перевести все ключи в верхний или нижний регистр... 
подскажите пожалуйста какие нибудь решения, желательно с примером.
Заранее спасибо.
PM MAIL   Вверх
amg
Дата 22.1.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(mastercz @  22.1.2009,  09:54 Найти цитируемый пост)
Необходимо пропарсить хэш и перевести все ключи в верхний или нижний регистр...
Можно просто:
Код
foreach my $K (keys %hash) {
  my $k = lc $K;
  next if $k eq $K;
  $hash{$k} = $hash{$K};
  delete $hash{$K};
}

А можно... еще проще:
Код
%hash = map {lc, $hash{$_}} keys %hash;


PM MAIL   Вверх
ginnie
Дата 22.1.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Вариант, как у amg, но чуть короче
Код

foreach my $key (keys %hash) {
    if (my $lc_key = lc($key) ne $key) {
        $hash{$lc_key} = delete $hash{$key};
    }
}


ну и который покороче

Код

%hash = map {lc, delete $hash{$_}} keys %hash;


Это сообщение отредактировал(а) ginnie - 22.1.2009, 16:47


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 22.1.2009, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



ginnie, а в чем смысл добавления delete во втором варианте? Я его использую только при переносе значений из одного хэша в другой. У вас ведь все равно вся операция с одной переменной происходит.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 22.1.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



KSURi, был не прав, приношу извинения! Правильный вариант у amg


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
mastercz
Дата 23.1.2009, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Огромное спасибо всем.
Конкретно, понятно, то что нужно. Выручили. Жаль нет 100 постов чтобы плюсовать.

Остановился на втором варианте amg
Вот так вот он выглядит у меня :
 
Код

 %{$var} = map {lc, $var->{$_}} keys %{$var};

Я вот думаю, может с точки зрения правильности кода, нужно писать вот так :
 
Код

%{$var} = map ((lc, $var->{$_}), keys %{$var});

Прокоментируйте плз.
PM MAIL   Вверх
gcc
Дата 23.1.2009, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Код

%{$var} = map ((lc, $var->{$_}), keys %{$var});


%{$var} - хэш через ссылку, если не через ссылку, то напиать keys %var
keys  - берет ключ(и) с него
$var->{$_} - $_ - этот же ключ
lc - заменяет символы на большие


Это сообщение отредактировал(а) gcc - 23.1.2009, 05:23
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 23.1.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



mastercz, корректны оба варианта, но Ваш вариант опаснее: стоит убрать одну из пар скобок и это приведет к печальным последствиям. Поэтому обычно используют вариант amg.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0798 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.