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


Автор: gcc 15.12.2008, 00:50
передать хэш из метода в метод не поулчается

и как взять метод другого класса (наследование)? все перепробовал ничего не работает
(ну надо чтобы это работало в наследовании...)

примерно так:
Код

package create;

#our @EXPORT_OK = qw(%se,$query);
#use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use DBI;

use Data::Dumper;

sub new {
 my ($self, %common) = @_;
 $self = {
 se => undef,
 session => undef,
 he => undef,
 };

 $self->{'se'} = $common{'se'} if $common{'se'};
 $self->{'session'} = $common{'session'} if $common{'session'};
 $self->{'he'} = $common{'he'} if $common{'he'};
 bless $self;
 return $self;
} 

sub return_create {
    my $self = shift;
    my %he;
    $he{ERROR} ='1';
    $self->{'he'} = \%he;
    return  $self;
}




Код

package create2;

our @ISA = qw(create);

#use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use DBI;

use Data::Dumper;

sub new {

 my ($self, %common) = @_;
 $self = {
 se => undef,
 session => undef,
 he => undef,
 };
 $self->{'se'} = $common{'se'} if $common{'se'};
 $self->{'session'} = $common{'session'} if $common{'session'};
 $self->{'he'} = $common{'he'} if $common{'he'};
 bless $self;

 return $self;
} 

use create;
#use base ("create");


#sub return_create {
# shift->SUPER::return_create(@_);
#}


sub templ_hash_domain2 { 
 
 my $self = shift;

use Data::Dumper;
print Dumper($self->{'he'}->{ERROR});
exit;
}



Код

use lib "lib";

use create2;

my $he;
my $to_obj = create2->new(se => \%se, session => $session);
$to_obj->return_create();
$to_obj->templ_hash2();


может быть как-то по другому надо?
пробовал по разному и так:
Код

$self->{'he'}= \%he;


в гугле и в perldoc ничего не нашел... 

Автор: gcc 15.12.2008, 05:57
заработало, хэш видно в templ_hash2, добавил:
Код

our @ISA = qw(create);
use create;


use base ("create"); и SUPER не реагировали (в книге написано что их нужно использовать), ошибка была в том что метод return_create просто не существует, почему так было?

зачем тогда SUPER и UNIVERSAL? это тогда когда много методов и классов, наверное....


Автор: ginnie 15.12.2008, 12:28
gcc, должно быть так:

Код

package create2;

use base 'create';

use CGI::Carp qw(fatalsToBrowser);
use CGI;
use DBI;

use Data::Dumper;

sub templ_hash_domain2 { 
    my $self = shift;
    
    print Dumper($self->{'he'}->{ERROR});
#    exit;
}

1;


exit() в методах класса запрещен строго-настрого  smile т.к. станет неожиданным сюрпризом для программиста, использующего такой класс.

SUPER используется в случае, если Вам нужно из метода класса-наследника вызвать аналогичный метод класса-родителя. Например, если мы хотим сделать в create2 метод new(), расширяющий аналогичный метод класса create, то делаем это так:

Код

package create2;

use base 'create';

sub new {
    my $self = SUPER::new(@_);
    $self->{text} = 'some text';
    return $self;
}


UNIVERSAL это класс-родитель от которого неявно отнаследованы все другие классы, он содержит несколько общих для всех методов, например can(), который позволяет определить наличие определенного метода в классе.

Добавлено через 3 минуты и 44 секунды
P.S. Фрагмент
Код

sub return_create {
    my $self = shift;
    my %he;
    $he{ERROR} ='1';
    $self->{'he'} = \%he;
    return  $self;
}


я написал бы так

Код

sub return_create {
    my $self = shift;
    $self->{he} = {
        ERROR => 1,
    };
    return;
}

Автор: gcc 17.12.2008, 22:51
удалил сообщение, чтобы не вводить никого в заблуждение, так как вопрос сложно было сформалировать и решился он по другому...

Автор: gcc 18.12.2008, 23:40
Цитата(ginnie @ 15.12.2008,  12:28)

я написал бы так

Код

sub return_create {
    my $self = shift;
    $self->{he} = {
        ERROR => 1,
    };
    return;
}


там в хэше много значение формируються  от разных проверок

Код

sub return_create {
    my $self = shift;
    $self->{he} = {
     if  ()  {       ERROR => 1, }
     if  ()  {       ERROR => 0, }
     if  ()  {       ERROR => 1, }
     if  ()  {       ERROR => 0, }
     if  ()  {       ERROR => 1, }
     if  ()  {       ERROR => 0, }
    };
    return;
}


а как сделать чтобы работать в методах из хєшем удобней, который переданный в класс $self->{he} примерно так:

Код

 %{$he} 


или так 
Код

$he{ключ}


просто не одобно писать трехмерную ссылку везде...
(если это можно было бы удобно, а ссылку поставить в конце метода на хэш \%he, или это как-то другому?)



Автор: KSURi 19.12.2008, 13:58
gcc, попробуйте писать сообщения не так сумбурно... Вообще ничего не понятно, честно говоря.

Автор: gcc 21.12.2008, 02:00
KSURi, попробую, но в самом вопросе есть 75% ответа, а те вопросы на которые не получилось найти ответ потому и сложно задать... если знать как задать вопрос, то и вопрос задавать не надо, так как у самого вопрсоа есть ответ в google.com smile

я хотел спрость можно как-то в методе который загружается внутри класса убрать ссылку, чтобы удобно было писать

Код

$self->{'p'}->{'total_pages'} =  ceil ($self->{'p'}->{'total_number'}/$self->{'se'}->{'line_from_page'});

(я так понял что никак нельзя)


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