(PERL) Не могу создать масив/хэш экземпляров классов

Pavel Kilevatyh
Дата: 25.08.2006 15:55:19
Доброго дня.
Я создал пакет такого содержания:
 
package StatClass;
use strict;
my ($self, $self_name, $self_version);
my ($obj_id, $obj_name);

$self_version = '0.01';

sub version  { return $self_version;}
sub name    { return $obj_name; }
sub new      { 
    my $self = {};                           
    ($self_name, $obj_id, $obj_name)  = @_; 
    return bless $self; 
}

Выполнив код типа
require 'StatClass.pm';
@no_obj = (1,2);
%name_obj = (1 => 'Один', 2 => 'Два');
%obj = ();
foreach $id (@no_obj)
{
    $obj{$id}=StatClass->new($id, $name_obj{$id});
}
foreach $id (@no_obj)
{
    print $obj{$id}->name(), "\n";
}

Получаю на выходе
Два
Два
А нужно получить:
Один
Два

То есть мне нужно добиться того, что б свойства класса StatClass были уникальными для каждого экземпляра. Что я делаю не так ?
Black
Дата: 25.08.2006 16:15:26
я как не пытался, не смог понять, что Вы делаете?
Может это поможет ...
package StatClass;
use strict;

sub new
{ 
	my ($self, $object) = @_;
	$self = 
	{
		name => $object
	};
	
	return bless $self; 
}

1;

use StatClass;
my @id = ( 1, 2 );
my %object = ( 1 => 'Один', 2 => 'Два');
my %new_object;

foreach my $id ( @id )
{
    $new_object{$id} = StatClass->new( $object{$id} );
}

foreach my $id ( @id )
{
    print $new_object{$id}->{'name'} . "<br>";
}

p.s. Используйте более понятные имена, Вам будет в будущем легче.
Dmitri P.
Дата: 25.08.2006 16:17:50
package StatClass;
use strict;
$self_version = '0.01';

sub version  { return $self_version;}

sub new { 
    my $invocant = shift;
    my $class = ref($invocant) || $invocant;
    my $self = {obj_id => shift, obj_name => shift};
    bless ($self, $class); 
    return $self; 
}

sub name {
    my $self = shift;
    return $self->{obj_name};
}
Pavel Kilevatyh
Дата: 25.08.2006 16:27:52
Спасибо, оба варианта работают.
Как я понял, основная соль в этом выражении:
{obj_id => shift, obj_name => shift};
Black
Дата: 25.08.2006 16:30:37
Pavel Kilevatyh
Спасибо, оба варианта работают.
Как я понял, основная соль в этом выражении:
{obj_id => shift, obj_name => shift};

Объясните, что Вы хотите в итоге сделать, мне кажется у Вас не хватает знаний о ООП ...
Pavel Kilevatyh
Дата: 25.08.2006 17:06:46
Наверно так.
Попытаюсь объяснить.
Имеется список объектов (торговые точки).
На каждой из точек имеется некий ассортимент товара. По каждой товарной записи из БД выбирается некая статистика для заданного объекта (остаток, заказ, min остаток, max остаток, класс, и т.д.). Выборка этой статистики связанна с выполнением сложного запроса к БД, кроме того нужно дать пользователю возможность сортировать данные в удобном ему порядке и фильтровать не интересующие его. Поэтому я посчитал, что быстрее будет выбрать все данные по всем точкам в скрипт и потом уже отфильтровав и отсортировав отдать пользователю.

То есть нужно создать список объектов (структур данных) которые будут содержать хэши со статистикой по товарам. Если предположить, что эта сложная структура определена, то работа должна выглядеть где-то так:
# @no_obj содержит идентификаторы объектов из базы
# %obj - хэш ссылок на контейнеры со статистикой и дополнительной информацией (нименованием точки и прочим)
foreach $id (@no_obj)
{
    $obj{$id}=StatClass->new($id, $name_obj{$id}); #создали контейнер
    # Вызваю подпрограмму, которая выбрает статистику по магазину и пытается
    # отправить ее контейнеру как-нибудь похоже на 
    $obj{$id}->AddОстаток($id_товара, $Остаток);
    $obj{$id}->AddЗаказ   ($id_товара, $Заказ);
    .... и так далее
}

Надеюсь понятно объяснил.
Anjey aka PM
Дата: 26.08.2006 10:01:16
ващето конструкторі с минимальным количеством параметров пишутся примерно так:

sub new {
my $class = shift;
$class = ref $class if ref $class;
my $self = {........} #here goes startup data
bless $self, $class;
}