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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переменные и функции 
:(
    Опции темы
gcc
Дата 7.10.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



есть данный код

Код

sub active_cs {
.....   
    my $sql_sel = 'SELECT '.$args[1].' 
                       FROM section
                       WHERE id_se = '.$args[2].'
                       LIMIT 1';    
    
    my $sth = $c->model('DBI')->dbh->prepare($sql_sel);
        $sth->execute();
    my $loop_data = $sth->fetchrow_arrayref();
     $sth->finish();
     
    my $attr = $loop_data->[0] == 1 ? 0 : 1;

        my $sql_tree = "SELECT id_se
                       FROM section ";             

 $c->model('Tree')->extr_new($sql_tree, $args[2], 'MyApp::Controller::meneger::disp_tree');



     sub disp_tree {
     my %parms = @_;

        my $id_one = 'UPDATE section
                     SET ' . $args[1] . ' = ' . $attr . '
                    WHERE id_se = ' . $parms{id};
                    
                    print $id_one;
                                            
        $c->model('DBI')->dbh->do( $id_one, undef, undef );        
     }    

    #    $loop_data = undef;
    #    $attr = undef;           

    } else {
  ......  
}
....
}


проблема в том что через раз  $attr показывает не правильную информацию!!! т.е. всегда показывает 1, напрмиер....

если добавить внизу после определения $attr (там где закомментированно)
        $loop_data = undef;
        $attr = undef;    

то переменная $attr всегда пуская! 

т.е. perl все время почему-то сохраняет переменную $attr у себя, даже есл ия ее повтрно хочу переопределить!! почему это так?
(mod_perl, сервер Catalyst'a)

это из-за того что sub disp_tree  внтури другого метода sub active_cs ??


 

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


Эксперт
***


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

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



Цитата(gcc @  7.10.2009,  13:39 Найти цитируемый пост)
это из-за того что sub disp_tree  внтури другого метода sub active_cs ??


Да, скорее всего из-за этого. Вроде мы как-то в Moscow.pm такой вариант обсуждали (http://mail.pm.org/pipermail/moscow-pm/2008-May/002107.html).

Это сообщение отредактировал(а) ginnie - 7.10.2009, 15:10


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


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


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

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



ginnie, понятно, я написал our $attr - все заработало, но там наверное желательно нормально надо сделать, чтобы не было внутри метода...
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 7.10.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



gcc, определение неанонимной функции внутри другой функции, да еще использующей нелокальные переменные - это очень плохой стиль разработки. Надо переделать.


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


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


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

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



ginnie, спасибо,

ну там еще можно ассесор сделать: MyAPP::Modul->{acrt} = $dbh
это тоже будет, наверное, как глобальная переменная

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

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


PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 7.10.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



gcc, ошибка в том, что подобный вариант не описан в документации, и результат может отличаться от версии к версии perl (что видно по обсуждению в Moscow.pm).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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