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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание и перебор хеша массивов 
:(
    Опции темы
Suppir
  Дата 22.3.2011, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1. Как создать хеш массивов вида

$животные{домашние} = ('корова', 'собака', 'кошка')
$животные{дикие} = ('тигр', 'олень', 'бобер')

сразу всех животных я не знаю. Есть переменная 'домашние' и какое-нибудь животное, например 'корова'. Нужно 
а) если в хеше %животные нет ключа 'домашние', то создать такой ключ. Значение для этого ключа = массиву из одного элемента 'корова'
б) если в хеше %животные есть ключ 'домашние', то добавить 'корову' в конец существующего массива.



2. Как сделать перебор по полученной структуре?
Например, мне нужно вывести в файл:

домашние = корова, собака, кошка
дикие = тигр, олень, бобер



3) как сделать перебор по структуре с сортировкой по количеству элементам массива? 
Допустим, вывести в первую очередь ключи, к которым принадлежать массивы с наибольшим количеством элементов. 


perldsc читал. Но не совсем понял систему ссылок; нужны примеры.

Это сообщение отредактировал(а) Suppir - 22.3.2011, 22:29
PM MAIL   Вверх
vivu
Дата 22.3.2011, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1 Создание
Код

my %animals = ();

# домашние
for (qw/ корова собака кошка /) {
    push @{ $animals{'домашние'} }, $_;
}

# дикие
for (qw/ тигр олень бобер /) {
    push @{ $animals{'дикие'} }, $_;
}


2 Перебор
Код

for my $type ( keys %animals ) {
    print "$type = ".join( ', ', @{ $animals{$type} } );
}

PM MAIL   Вверх
odmink0
Дата 23.3.2011, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



vivu, вторая часть пойдёт, а первую можно и проще сделать:
Код

my %animals = (
    домашние => [ qw/ корова собака кошка / ],
    дикие    => [ qw/ тигр олень бобер / ],
);


- т.е. безо всяких циклов.

Это сообщение отредактировал(а) odmink0 - 23.3.2011, 02:01
PM MAIL Jabber   Вверх
vivu
Дата 23.3.2011, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проще не значит понятнее. Я бы, честно говоря, для начинающих и вторую часть расписал, чтобы понятнее было.
PM MAIL   Вверх
Suppir
Дата 23.3.2011, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



odmink0, vivu все правильно написал, ведь по условиям задачи мы не имеем сразу весь массив животных (имеем только одно животное), поэтому нужно использовать push. 

Остался нерешенным вопрос N 3 - вывод хеша массивов с сортировкой по количеству элементов массива. 
PM MAIL   Вверх
arto
Дата 23.3.2011, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



perldoc -f sort
PM MAIL ICQ   Вверх
vivu
Дата 23.3.2011, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



3 Перебор с сортировкой

Код

for my $type ( sort { scalar @{ $animals{$b} } <=> scalar @{ $animals{$a} } } keys %animals ) {
    print "$type = ".join( ', ', @{ $animals{$type} } )."\n";
}


Suppir, расскажите зачем вам это? Лабы?
PM MAIL   Вверх
Suppir
Дата 24.3.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо! Еще вопрос.


Есть хеш хешей, одним из элементов которого является массив:

Код

$животные{домашние}{на ферме Иванова} = ('корова', 'кошка', 'мышка')


Как вывести этот массив?

foreach $x(keys %животные){
    foreach $i(0 .. $#{$животные{$x}{на ферме Иванова}}){
        Как здесь вывести всех животных на ферме Иванова?
    }
}



Это сообщение отредактировал(а) Suppir - 24.3.2011, 13:14
PM MAIL   Вверх
ming
Дата 24.3.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

$животные{домашние}{на ферме Иванова} = ('корова', 'кошка', 'мышка')

во-первых здесь нужно использовать анонимный массив, а не список
( ... ) => [ ... ] 
*вы не читаете того, что вам пишут выше?*

во-вторых, можно так
Код

@массив_животных = @{ $животные{домашние}{на ферме Иванова} };
foreach $тварь (@массив_животных) {
   print $тварь
}
#или
$анонимный_массив_животных = $животные{домашние}{на ферме Иванова};
foreach $тварь (@{$анонимный_массив_животных}) {
   print $тварь
}

PM MAIL ICQ Jabber   Вверх
Suppir
Дата 24.3.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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

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


 




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


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

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