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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hash of hashes из arrays, please!!! 
:(
    Опции темы
junior
  Дата 29.4.2005, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет!
помогите, пожалуйста написать программу!
есть 5 arrays, каждый n элемент одного array соотносится с n элементами других. Вот сами arrays:

2. my @imdb_id = ("0120611", "0106308", "0088247", "0267804",
3. "0094074",
4. "0102798", "0120382",
5. "0196229", "0272152", "0109830");
6.
7. my @movietitles = ("Blade", "Army of Darkness", "The Terminator", "The One",
8. "Superman IV: The Quest for Peace",
9. "Robin Hood : Prince of Thieves", "The Truman Show",
10. "Zoolander", "K-Pax", "Forrest Gump");
11.
12. my @directors = ("Stephen Norrington", "Sam Raimi", "James Cameron", "James Wong (IV)",
13. "Sidney J. Furie",
14. "Kevin Reynolds (I)", "Peter Weir",
15. "Ben Stiller", "Iain Softley", "Robert Zemeckis");
16.
17. my @leadstars = ("Wesley Snipes", "Bruce Campbell (I)", "Arnold Schwarzenegger", "Jet Li",
18. "Christopher Reeve",
19. "Kevin Costner", "Jim Carrey",
20. "Ben Stiller", "Kevin Spacey", "Tom Hanks");
21.
22. my @releaseyears = ("1998", "1993", "1984", "2001",
23. "1987",
24. "1991", "1998",
25. "2001", "2001", "1994");


нужно:
1) Конвертировать arrays в hash of hashes, так чтобы parent hash key name был бы @imdb_id number значение. А значением imdb_id hash key был бы другой hash, содержащий movietitles, directors, leadstars and releaseyears keys. Key names для внутреннего hash должны быть одиночное имя верхнего array, т.е. key name для movietitles должен быть movietitle с соответствующим значением.
2) После создания hash of hashes больше не ссылаться на исходные arrays.
3) Позволить ползователю вводить комманды при появлении соответствующих сообщений:

exit и enter key - чтобы выйти из программы;
list и enter key - вывод всей информации по каждому movie для всех movies содержащимся в hash ( в алфавитном порядке с помощью sort);
если пользователь вводит imdb number ( например 0106308), то вывести всю инфу по этому movie. если номер не найден - вывести сообщение, что его нет в hash.

Заранее огромное спасибо!
PM MAIL ICQ   Вверх
korob2001
Дата 29.4.2005, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Что конкретно нужно??? Создай хеш хешей .... , ну и с помощью while обрабатывай команды полученные из STDIN, в зависимости от команды выполняй определённое действие.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
junior
Дата 29.4.2005, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С обработкой команд кое-что нашла, надеюсь разобраться. А вот как создать hash of hashes из этих arrays? Я пока такого не умею, а в литературе, что читаю не нашла. Можно хоть в общих чертах, если не трудно, please.
Спасибо!
PM MAIL ICQ   Вверх
korob2001
Дата 29.4.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Код

#!/usr/bin/perl -w
use strict;

my @imdb_id = ("0120611", "0106308", "0088247", "0267804", "0094074",
               "0102798", "0120382", "0196229", "0272152", "0109830");

my @movietitles = ("Blade", "Army of Darkness", "The Terminator", "The One",
                   "Superman IV: The Quest for Peace", "Robin Hood : Prince of Thieves",
                   "The Truman Show", "Zoolander", "K-Pax", "Forrest Gump");

my @directors = ("Stephen Norrington", "Sam Raimi", "James Cameron", "James Wong (IV)",
                 "Sidney J. Furie", "Kevin Reynolds (I)", "Peter Weir", "Ben Stiller",
                 "Iain Softley", "Robert Zemeckis");

my @leadstars = ("Wesley Snipes", "Bruce Campbell (I)", "Arnold Schwarzenegger", "Jet Li",
                 "Christopher Reeve", "Kevin Costner", "Jim Carrey", "Ben Stiller",
                 "Kevin Spacey", "Tom Hanks");

my @releaseyears = ("1998", "1993", "1984", "2001", "1987",
                    "1991", "1998", "2001", "2001", "1994");

my %res = ();

for ( my $i=0; $i<@imdb_id; $i++ ) {
           $res{ $imdb_id[$i] } = { TITLE      => $movietitles[$i],
                                    DIRECTOR   => $directors[$i],
                                    LEADSTAR   => $leadstars[$i],
                                    RELASEYEAR => $releaseyears[$i] };
}

# Есди масссивы больше не нужен, то возвраем память.
# Этого можно и не делать, как правило Perl делает
# это автоматически
undef( @imdb_id );
undef( @movietitles );
undef( @directors );
undef( @leadstars );
undef( @releaseyears );

# Теперь так можно будет обращаться к определённому элементу.
print "Название: " . $res{ "0120382" }->{ TITLE } . "\n";
print "Режисёр: " . $res{ "0120382" }->{ DIRECTOR } . "\n";
print "Актёр: " . $res{ "0120382" }->{ LEADSTAR } . "\n";
print "Год выпуска: " . $res{ "0120382" }->{ RELASEYEAR } . "\n";


Хотя наверное лучше сделать так, тогда массивы очищаются динамически:
Код

#!/usr/bin/perl -w
use strict;

my @imdb_id = ("0120611", "0106308", "0088247", "0267804", "0094074",
               "0102798", "0120382", "0196229", "0272152", "0109830");

my @movietitles = ("Blade", "Army of Darkness", "The Terminator", "The One",
                   "Superman IV: The Quest for Peace", "Robin Hood : Prince of Thieves",
                   "The Truman Show", "Zoolander", "K-Pax", "Forrest Gump");

my @directors = ("Stephen Norrington", "Sam Raimi", "James Cameron", "James Wong (IV)",
                 "Sidney J. Furie", "Kevin Reynolds (I)", "Peter Weir", "Ben Stiller",
                 "Iain Softley", "Robert Zemeckis");

my @leadstars = ("Wesley Snipes", "Bruce Campbell (I)", "Arnold Schwarzenegger", "Jet Li",
                 "Christopher Reeve", "Kevin Costner", "Jim Carrey", "Ben Stiller",
                 "Kevin Spacey", "Tom Hanks");

my @releaseyears = ("1998", "1993", "1984", "2001", "1987",
                    "1991", "1998", "2001", "2001", "1994");

my %res = ();

while ( my $id = shift @imdb_id ) {
           $res{ $id }{ TITLE } = shift @movietitles;
           $res{ $id }{ DIRECTOR } = shift @directors;
           $res{ $id }{ LEADSTAR } = shift @leadstars;
           $res{ $id }{ RELASEYEAR } = shift @releaseyears;
}



# Теперь так можно будет обращаться к определённому элементу.
print "Title: " . $res{ "0120382" }{ 'TITLE' } . "\n";
print "Director: " . $res{ "0120382" }{ 'DIRECTOR' } . "\n";
print "LeadStar: " . $res{ "0120382" }{ 'LEADSTAR' } . "\n";
print "Relese Year: " . $res{ "0120382" }{ 'RELASEYEAR' } . "\n";

Удачи.

Это сообщение отредактировал(а) korob2001 - 29.4.2005, 21:40


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
junior
Дата 29.4.2005, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо огромное!!!

P.S. Будут вопросы вернусь завтра!

PM MAIL ICQ   Вверх
korob2001
Дата 29.4.2005, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



А вот полное решение твоей задачи:
Код

#!/usr/bin/perl -w
use strict;

my @imdb_id = ("0120611", "0106308", "0088247", "0267804", "0094074",
               "0102798", "0120382", "0196229", "0272152", "0109830");

my @movietitles = ("Blade", "Army of Darkness", "The Terminator", "The One",
                   "Superman IV: The Quest for Peace", "Robin Hood : Prince of Thieves",
                   "The Truman Show", "Zoolander", "K-Pax", "Forrest Gump");

my @directors = ("Stephen Norrington", "Sam Raimi", "James Cameron", "James Wong (IV)",
                 "Sidney J. Furie", "Kevin Reynolds (I)", "Peter Weir", "Ben Stiller",
                 "Iain Softley", "Robert Zemeckis");

my @leadstars = ("Wesley Snipes", "Bruce Campbell (I)", "Arnold Schwarzenegger", "Jet Li",
                 "Christopher Reeve", "Kevin Costner", "Jim Carrey", "Ben Stiller",
                 "Kevin Spacey", "Tom Hanks");

my @releaseyears = ("1998", "1993", "1984", "2001", "1987",
                    "1991", "1998", "2001", "2001", "1994");

my %res = ();

while ( my $id = shift @imdb_id ) {
           $res{ $id }{ TITLE } = shift @movietitles;
           $res{ $id }{ DIRECTOR } = shift @directors;
           $res{ $id }{ LEADSTAR } = shift @leadstars;
           $res{ $id }{ RELASEYEAR } = shift @releaseyears;
}


while ( 1 ) {
    chomp( my $cmd = <STDIN> );
    last if $cmd =~ /^exit$/i;
    if ( $cmd =~ /^list$/i ) {
         for my $id ( sort { $res{ $a }{TITLE} cmp $res{ $b }{TITLE} } keys %res ) {
                print "Id: $id\n";
                print "Title: " . $res{ $id }{ 'TITLE' } . "\n";
                print "Director: " . $res{ $id }{ 'DIRECTOR' } . "\n";
                print "LeadStar: " . $res{ $id }{ 'LEADSTAR' } . "\n";
                print "Relase Year: " . $res{ $id }{ 'RELASEYEAR' } . "\n";
                print "-" x 70, "\n";
         }
    }
    if ( $cmd =~ /^imdb\s+(\d+)$/i ) {
         unless ( exists( $res{ $1 } ) ) {
                print "This id is not valid.\n";
         } else {
                print "=" x 70, "\n";
                print $res{ $1 }{ $_ }. "\n" for ('TITLE', 'DIRECTOR', 'LEADSTAR', 'RELASEYEAR' );
                print "=" x 70, "\n";
         }
    }
}

Будут вопросы, пиши.

Это сообщение отредактировал(а) korob2001 - 29.4.2005, 22:42


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
junior
Дата 30.4.2005, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


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

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


 




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


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

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