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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> целесобразно написать участок кода 
:(
    Опции темы
gcc
Дата 8.6.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



как можно целесобразно написать примерно такой участо кода, чтобы не писать один и тот же код, а использовать функцию ,в данном случае приватный метод

как тут сделать перебор? чтобюы использовать одну функцию, запутался...

(perltydi не делал, так красиво по-моиму)
Код


     my $sql = '(select id_se, name_se   from section ORDER BY id_se desc limit 2 )
                  UNION 
                  
                 (select id_co, name_co from content ORDER BY id_co desc limit 2)    
                                   UNION 
                  
                 (select id_cm, text_cm from comment ORDER BY id_cm desc limit 2)      

     
                ';
    
        my $dbh = $c->model('DBI')->dbh; 
     my $sth = $dbh->prepare($sql);
        $sth->execute();          
    my $loop_data = $sth->fetchall_arrayref();    
       $sth->finish(); 

     use Data::Dumper;
     # print Dumper($loop_data);
    #$self->_stat_cut('content',);

## =sfsdf
# section
$c->stash->{new_section_all1} = length ($loop_data->[0]->[1]) > 30 ? substr($loop_data->[0]->[1], 0, 30) : $loop_data->[0]->[1];
my @len = split (/ /, $loop_data->[0]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
    $_ = substr $_, 0, 16; 
    $_ = $_.'.. ';
  }
}
  $c->stash->{new_section_id1} = $loop_data->[0]->[0];
  $c->stash->{new_section_cut1} = $big ? join (' ', @len) : $loop_data->[0]->[1];  
### 
  $c->stash->{new_section_all2} = length ($loop_data->[1]->[1]) > 30 ? substr($loop_data->[1]->[1], 0, 30) : $loop_data->[1]->[1];
my @len = split (/ /, $loop_data->[1]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
    $_ = substr $_, 0, 16; 
    $_ = $_.'.. ';
  }
}
  $c->stash->{new_section_id2} = $loop_data->[1]->[0];
  $c->stash->{new_section_cut2} = $big ? join (' ', @len) : $loop_data->[1]->[1];  
#end


# content
$c->stash->{new_content_all1} = length ($loop_data->[2]->[1]) > 30 ? substr($loop_data->[2]->[1], 0, 30) : $loop_data->[2]->[1];
my @len = split (/ /, $loop_data->[0]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
    $_ = substr $_, 0, 16; 
    $_ = $_.'.. ';
  }
}
  $c->stash->{new_content_id1} = $loop_data->[2]->[0];
  $c->stash->{new_content_cut1} = $big ? join (' ', @len) : $loop_data->[2]->[1];  
###  
$c->stash->{new_content_all1} = length ($loop_data->[3]->[1]) > 30 ? substr($loop_data->[3]->[1], 0, 30) : $loop_data->[3]->[1];
my @len = split (/ /, $loop_data->[3]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
    $_ = substr $_, 0, 16; 
    $_ = $_.'.. ';
  }
}
  $c->stash->{new_content_id1} = $loop_data->[3]->[0];
  $c->stash->{new_content_cut1} = $big ? join (' ', @len) : $loop_data->[3]->[1];  
#end


# comment
$c->stash->{new_content_all1} = length ($loop_data->[4]->[1]) > 30 ? substr($loop_data->[4]->[1], 0, 30) : $loop_data->[4]->[1];
my @len = split (/ /, $loop_data->[0]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
    $_ = substr $_, 0, 16; 
    $_ = $_.'.. ';
  }
}
  $c->stash->{new_content_id1} = $loop_data->[4]->[0];
  $c->stash->{new_content_cut1} = $big ? join (' ', @len) : $loop_data->[4]->[1];  
###
$c->stash->{new_content_all1} = length ($loop_data->[5]->[1]) > 30 ? substr($loop_data->[5]->[1], 0, 30) : $loop_data->[5]->[1];
my @len = split (/ /, $loop_data->[5]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
    $_ = substr $_, 0, 16; 
    $_ = $_.'.. ';
  }
}
  $c->stash->{new_content_id1} = $loop_data->[5]->[0];
  $c->stash->{new_content_cut1} = $big ? join (' ', @len) : $loop_data->[5]->[1];    
#end

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


Шустрый
*


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

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



Ну так есть же кусок повторяющегося кода:
Код

$c->stash->{new_content_all1} = length ($loop_data->[5]->[1]) > 30 ? substr($loop_data->[5]->[1], 0, 30) : $loop_data->[5]->[1];
my @len = split (/ /, $loop_data->[5]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
    $_ = substr $_, 0, 16; 
    $_ = $_.'.. ';
  }
}
  $c->stash->{new_content_id1} = $loop_data->[5]->[0];
  $c->stash->{new_content_cut1} = $big ? join (' ', @len) : $loop_data->[5]->[1];   


Выдирай оттуда изменяющиеся переменные и заменяй их на локальные:
Код

Sub loc_function
{

My $p1,$p2,$p3,$p4=shift;

$c->stash->{$p1} = length ($p2) > 30 ? substr($p2, 0, 30) : $p2;
my @len = split (/ /, $p2, 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
    $_ = substr $_, 0, 16; 
    $_ = $_.'.. ';
  }
}
  $c->stash->{$p3} = $p2;
  $c->stash->{$p4} = $big ? join (' ', @len) : $p2;   
}


и вызывай:
Код

loc_function new_content_all1, $loop_data->[4]->[1], new_content_id1, new_content_cut1;
loc_function new_content_all1, $loop_data->[5]->[1], new_content_id1, new_content_cut1;


Примерно так.


Это сообщение отредактировал(а) dmitryk1 - 9.6.2009, 04:42
PM MAIL GTalk Jabber   Вверх
gcc
Дата 21.6.2009, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ok, понял, там не много под ругому еще сделал

а подскжаите как это можно написать?  smile 

может как-то можно тчобы 2 и более раз не писать? что-то не могу понять

Код

 if (!$edit) {   
  if ($c->user_exists()) { 
   $c->flash->{user_online} = 1
   $c->response->redirect($c->uri_for('/registration')); 
   return; 
  }
 }
 
 if ($edit) {
 
    if (!$c->user_exists()) { 
   $c->flash->{no_user_online} = 1
   $c->response->redirect($c->uri_for('/registration'));
   return; 
  }
  



Код

           if (!$edit) {              
             $f->no_sql->zero_die( 'exist_email', 0 ) if ($users->{email_address});
             $f->no_sql->zero_die( 'exist_username', 0 ) if ($users->{username});
            } 
            
            if ($edit) {
             $f->no_sql->zero_die( 'exist_email', 0 ) if (!$users->{email_address});
             $f->no_sql->zero_die( 'exist_username',  0 ) if (!$users->{username});            
            }    
              

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


Шустрый
*


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

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





чёт потерял эту тему... 

Тут смотрел-смотрел, достаточно сложно сделать, честно говоря не придумал. Если этот код будет повторяться много больше - то можно попробовать, но это сделает его менее читабельным, если только эти два условия (а я другого варианта тут не вижу) то наверное лучше оставить так.

Если чего придумалось - запости сюда, я поучусь smile
PM MAIL GTalk Jabber   Вверх
gcc
Дата 22.9.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



извините, забыл отписаться

я вот сделал так:

там алгоритм в принципе можно придумать в цикле... но я полинился
и мне кажется что так вроде бы не плохо...

Код

    $sth = $dbh->prepare($sql_stat);
    $sth->execute();
    my $loop_data = $sth->fetchall_arrayref();
    $sth->finish();

    # use Data::Dumper;
    # print Dumper($loop_data);

    # section

    $c->stash->{new_section_id1} = $loop_data->[0]->[0];
    $c->stash->{new_section_all1} =
      $c->forward( 'stat_cut_big', [ $loop_data->[0]->[1] ] );
    $c->stash->{new_section_cut1} =
      $c->forward( 'stat_cut', [ $loop_data->[0]->[1] ] );

###

    $c->stash->{new_section_id2} = $loop_data->[1]->[0];
    $c->stash->{new_section_all2} =
      $c->forward( 'stat_cut_big', [ $loop_data->[1]->[1] ] );
    $c->stash->{new_section_cut2} =
      $c->forward( 'stat_cut', [ $loop_data->[1]->[1] ] );

    #end

    # content

    $c->stash->{new_content_id1} = $loop_data->[2]->[0];
    $c->stash->{new_content_all1} =
      $c->forward( 'stat_cut_big', [ $loop_data->[2]->[1] ] );
    $c->stash->{new_content_cut1} =
      $c->forward( 'stat_cut', [ $loop_data->[2]->[1] ] );

###

    $c->stash->{new_content_id2} = $loop_data->[3]->[0];
    $c->stash->{new_content_all2} =
      $c->forward( 'stat_cut_big', [ $loop_data->[3]->[1] ] );
    $c->stash->{new_content_cut2} =
      $c->forward( 'stat_cut', [ $loop_data->[3]->[1] ] );

    #end

    # comment

    $c->stash->{new_comment_id1} = $loop_data->[4]->[0];
    $c->stash->{new_comment_all1} =
      $c->forward( 'stat_cut_big', [ $loop_data->[4]->[1] ] );
    $c->stash->{new_comment_cut1} =
      $c->forward( 'stat_cut', [ $loop_data->[4]->[1] ] );

###

    $c->stash->{new_comment_id2} = $loop_data->[5]->[0];
    $c->stash->{new_comment_all2} =
      $c->forward( 'stat_cut_big', [ $loop_data->[5]->[1] ] );
    $c->stash->{new_comment_cut2} =
      $c->forward( 'stat_cut', [ $loop_data->[5]->[1] ] );

    #end

    # content - rating

    $c->stash->{new_co_rating_id1} = $loop_data->[6]->[0];
    $c->stash->{new_co_rating_all1} =
      $c->forward( 'stat_cut_big', [ $loop_data->[6]->[1] ] );
    $c->stash->{new_co_rating_cut1} =
      $c->forward( 'stat_cut', [ $loop_data->[6]->[1] ] );

###

    $c->stash->{new_co_rating_id2} = $loop_data->[7]->[0];
    $c->stash->{new_co_rating_all2} =
      $c->forward( 'stat_cut_big', [ $loop_data->[7]->[1] ] );
    $c->stash->{new_co_rating_cut2} =
      $c->forward( 'stat_cut', [ $loop_data->[7]->[1] ] );

    #end

}


sub stat_cut_big : Private {
    my ( $self, $c, $text_cut ) = @_;
    $text_cut ||= '';

    return length($text_cut) > 30 ? substr( $text_cut, 0, 30 ) : $text_cut;

}

sub stat_cut : Private {
    my ( $self, $c, $text_cut ) = @_;
    my $cut_hash;
    $text_cut ||= '';

    my @len = split( / /, $text_cut, 8 );
    my $big;
    foreach (@len) {
        if ( length($_) > 16 ) {
            $big = 1;
            $_ = substr $_, 0, 16;
            $_ .= '.. ';
        }
    }

    return $big ? join( ' ', @len ) : $text_cut;

}



Это сообщение отредактировал(а) gcc - 22.9.2009, 18:26
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 23.9.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

так нормально?

Код

        if ($loop_data) {

            while ( my ( $key, $value ) = each( %{$loop_data} ) ) {

                if ( $key eq 'close_se' && $moder_se ) {

                    $value = $value == 1 ? '1' : undef;
                }

                if ( $key eq 'active_se' && $moder_se ) {

                    $value = $value == 1 ? '1' : undef;
                }

                if ( $key eq 'hiden_g_co' && $moder_se ) {

                    $value = $value == 1 ? '1' : undef;
                }

                if ( $key eq 'forbi_section_se' && $moder_se ) {

                    $value = $value == 1 ? '1' : undef;
                }

                if ( $key eq 'forbi_content_se' && $moder_se ) {

                    $value = $value == 1 ? '1' : undef;
                }

                $key .= '_current';

                $c->stash->{$key} = $value;
            }

            $c->stash->{close_no_edit} = 1
              if $loop_data->{close_se} == 1 && !$moder_se;

        }
        else {
            $c->stash->{edit_section_error} = 1;
        }


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Код
 if (!$edit) {   
  if ($c->user_exists()) { 
   $c->flash->{user_online} = 1
   $c->response->redirect($c->uri_for('/registration')); 
   return; 
  }
 }
 
 if ($edit) {
  if (!$c->user_exists()) { 
   $c->flash->{no_user_online} = 1
   $c->response->redirect($c->uri_for('/registration'));
   return; 
  }
 }
gcc, а попробуй так:
Код
 if ($edit xor $c->user_exists()) {
   $c->flash->{no_user_online} = 1
   $c->response->redirect($c->uri_for('/registration'));
   return; 
 }

PM MAIL   Вверх
gcc
Дата 29.10.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



amg,  спасибо попробую... это для скорости и потребления ресурсов?

===

появился вопрос, ради интереса, может тонкость, но интересно ухнать как правильно

у меня есть один "финальный метод" который отрабаывает некоторые события (в зависимости какое текущее), перед ним есть еще несколько методов классов, и нужно делать if elsif else и т.д.

вопрос: тратит ли perl ресурсы когда отрабаытвает лишний раз много условий if elsif else  && || ==  eq и т.д. ?? 

Код

            if (
                (
                       $c->user_exists()
                    && $_->{id_un} == $c->user->{user}->{id}
                    && (!$privat && $_->{close_co} != 1)
                   
                )
                || $c->check_user_roles('moder_co')
              )
            {


   if ($loop->[1] && $edit)

bla bla
# много условий


например, для $privat можно сделать другой почти такой же метод, чтобы было меньше различных условий...
или на обработку условий && || xor ( && || (&&)) && || ==  eq  perl не тратит ресурсы (если их много)?




Это сообщение отредактировал(а) gcc - 29.10.2009, 21:17
PM WWW ICQ Skype GTalk Jabber   Вверх
amg
Дата 30.10.2009, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(gcc @  29.10.2009,  21:15 Найти цитируемый пост)
amg,  спасибо попробую... это для скорости и потребления ресурсов?
Нет, исключительно для того, чтобы не повторять один и тот же код дважды. А скорость и ресурсы практически не изменятся. 

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


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

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


 




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


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

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