Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Создание и перебор хеша массивов


Автор: Suppir 22.3.2011, 22:13
1. Как создать хеш массивов вида

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

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



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

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



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


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

Автор: vivu 22.3.2011, 22:33
1 Создание
Код

my %animals = ();

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

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


2 Перебор
Код

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

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

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


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

Автор: vivu 23.3.2011, 08:52
Проще не значит понятнее. Я бы, честно говоря, для начинающих и вторую часть расписал, чтобы понятнее было.

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

Остался нерешенным вопрос N 3 - вывод хеша массивов с сортировкой по количеству элементов массива. 

Автор: arto 23.3.2011, 12:03
perldoc -f sort

Автор: vivu 23.3.2011, 23:12
3 Перебор с сортировкой

Код

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


Suppir, расскажите зачем вам это? Лабы?

Автор: Suppir 24.3.2011, 13:14
Спасибо! Еще вопрос.


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

Код

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


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

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


Автор: ming 24.3.2011, 21:01
Код

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

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

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

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

Автор: Suppir 24.3.2011, 21:24
Спасибо, я разобрался более-менее. Не получилось сегодня днем отписаться, потому что касперский определял вирус при заходе на этот форум. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)