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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передать хэш из метода в метод 
V
    Опции темы
gcc
Дата 15.12.2008, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



передать хэш из метода в метод не поулчается

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

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

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, 06:03
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 15.12.2008, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



заработало, хэш видно в templ_hash2, добавил:
Код

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


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

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



Это сообщение отредактировал(а) gcc - 15.12.2008, 06:06
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 15.12.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



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;
}


Это сообщение отредактировал(а) ginnie - 15.12.2008, 12:28


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 17.12.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



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

Это сообщение отредактировал(а) gcc - 18.12.2008, 07:34
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 18.12.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



Цитата(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, или это как-то другому?)




Это сообщение отредактировал(а) gcc - 21.12.2008, 10:15
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 19.12.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 21.12.2008, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



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

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

Код

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

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



Это сообщение отредактировал(а) gcc - 21.12.2008, 10:14
PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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