Forum Webscript.Ru

Программирование => Perl => Тема начата: Range от 25 Января 2005, 23:43:56

Название: Задачка на тему хэшей массивов
Отправлено: Range от 25 Января 2005, 23:43:56
Задача: получить хэш где значения будут явными массивами, а не ссылками, т.к. переменная массива (models) меняется. Вывести содержимое...

Вот собственно код:


#!/usr/local/bin/perl -w

$firm="aaa";
@models=(\'a\',\'b\',\'c\',\'d\');
$clean_links{$firm}=\\@models;
$firm="aa1";
@models=(\'a\',\'b\',\'c\');
$clean_links{$firm}=\\@models;

@mym=@{$clean_links{"aaa"}};




print "Content-type: text/html; charset=windows-1251\\n\\n";

print $mym[0].$mym[1].$mym[2];



С ссылками данный код работает, но в каждом значении хэша одно и то же значение по адресу ссылки на массив models. Если сделать присвоение явным $clean_links{$firm}=@models; то при выводе хэша получаем вместо массива ссылку на него, разыменуем ссылку - получим ссылку на хэш... ничего не пойму :(
Название: Задачка на тему хэшей массивов
Отправлено: Wyclef от 26 Января 2005, 10:50:19
$firm="aaa";
@models=(\'a\',\'b\',\'c\',\'d\');
$clean_links{$firm}=[@models];
$firm="aa1";
@models=(\'a\',\'b\',\'c\');
$clean_links{$firm}=[@models];
Название: Задачка на тему хэшей массивов
Отправлено: 2NetFly от 26 Января 2005, 12:28:36
Если присваивание @models выполняется непосредственно в коде,  хорошим стилем программирования считается использование нескольких временных переменных (в данном случае двух). Правильное решение (создание анонимной ссылки на массив) было дано выше, но для конкретной задачи можно обойтись вообще без временных переменных.


$firm="aaa";
$clean_links{$firm}=[\'a\',\'b\',\'c\',\'d\'];
$firm="aa1";
$clean_links{$firm}=[\'a\',\'b\',\'c\'];

Или совсем коротко:

$clean_links = { aaa => [qw(a b c d)], bbb => [qw(a b c)] };