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


Автор: gcc 18.4.2009, 05:56
есть код
(закоментируемый код оставил, чтобы бло видно как я делал)
Код

                  my @loop_data_tree;
            my $loop_data_tree;

            if ( $loop_data2->{id_se} != 1 ) {

                my @head = ();

                my $index = 0;
                while (1) {
                    my $sth = $dbh->prepare( "
        SELECT parent_se_id,
                 id_se,
                 name_se
        FROM section
        WHERE id_se = ?
        LIMIT 1
      " );

                    my $sqle;

                    if ( $head[$#head] ) {
                        $sqle = $head[$#head];
                    }
                    else {
                        $sqle = $loop_data2->{id_se};
                    }

                    $sth->execute($sqle);

                    my $loop = $sth->fetchrow_hashref();
                    $sth->finish();

                    #           @{$loop_data_tree}, map {}
                    #for my $value (@array) {
                    #    push(@array_for_template, {value => $value});
                    #}
                    while ( my ( $key, $value ) = each( %{$loop} ) ) {

                        if ( $key eq 'name_se' ) {
                            $value = ' --> ' . $value;
                        }
                        $index++;

                         $loop_data_tree[$index]{$key} = $value;

                        # push @{$loop_data_tree}, $key => $value);

                    }

            #       @loop_data_tree = map +{ $_ => $loop->{$_} }, keys %{$loop};
            # push @{$loop_data_tree}, $loop while $loop;

                    push @head, $loop->{parent_se_id};

                    last if ( $head[$#head] eq '1' );

                }

                # @{$loop_data_tree} = reverse @{$loop_data_tree};

                $c->stash->{data_tree} = \@loop_data_tree;

                # use Data::Dumper;

                # print Dumper(\@loop_data_tree)

            }



выводи один раз, то есть цыкла нету!
Код

--> упвап ва п 19 --> vbbn2 13 


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

HTML
Код

    <tr>    
       <td align="left" colspan="3">          
<TMPL_LOOP NAME="data_tree"><a class="hilightoff" onmouseover="className='hilighton'; this.style.cursor='hand';" 
onmouseout="className='hilightoff';" target="_top" href="/view_section/<TMPL_VAR NAME="id_se">">  <TMPL_VAR NAME="name_se"> </a>
 </TMPL_LOOP>
      </td>
  </tr>
   

    <tr>    
       <td align="left" colspan="3">          
 <TMPL_LOOP NAME="data_tree"> <TMPL_VAR NAME="id_se">  <TMPL_VAR NAME="name_se">  </TMPL_LOOP>
      </td>
  </tr>



отладка
Код

$VAR1 = [
          undef,
          {
            'parent_se_id' => '13'
          },
          {
            'name_se' => ' --> упвап ва п'
          },
          {
            'id_se' => '19'
          },
          {
            'parent_se_id' => '1'
          },
          {
            'name_se' => ' --> vbbn2'
          },
          {
            'id_se' => '13'
          }
        ];


Автор: gcc 18.4.2009, 06:22
точнее аномалия какая-то

я поставил 
Код

    <tr>    
       <td align="left" colspan="3">          
 <TMPL_LOOP NAME="data_tree"> <TMPL_VAR NAME="id_se">  <TMPL_VAR NAME="name_se"> 
 </TMPL_LOOP>
      </td>
  </tr>


выдает 
Код

13 --> vbbn2 19 --> упвап ва п


а если поставить ссылку, то id_se не выдвет
Код

    <tr>    
       <td align="left" colspan="3">          
 <TMPL_LOOP NAME="data_tree"> <a  href="/view_section/<TMPL_VAR NAME="id_se">">  <TMPL_VAR NAME="name_se"> </a> 
 </TMPL_LOOP>
      </td>
  </tr>


что за прикол? или я туплю?

я поставил   push @{$loop_data_tree}, $key => $value); вместо  $loop_data_tree[$index]{$key} = $value;
сейчас отладка нормальная

Код

$VAR1 = [
          {
            'id_se' => '13'
          },
          {
            'name_se' => ' --> vbbn2'
          },
          {
            'parent_se_id' => '1'
          },
          {
            'id_se' => '19'
          },
          {
            'name_se' => ' --> упвап ва п'
          },
          {
            'parent_se_id' => '13'
          }
        ];


Автор: gcc 18.4.2009, 06:40
оно не правильно заносит в массив эти хэши, там есть пустые эелементы... не знаю что тут надо сделать

Автор: ginnie 18.4.2009, 09:44
gcc, для Вас есть несколько рекомендаций:

1. форматируйте код: те фрагменты, которые Вы приводите читать очень неудобно. В этом сильно поможет perltidy (у меня он обрабатывает выделенный в редакторе блок кода).
2.  $head[$#head] можно заменить на $head[-1], правда это ни на что не влияет  smile 
3. цикл обработки хэша, полученного из БД заменить на
Код

$loop->{name_se} .= ' --> ' . $loop->{name_se};
push(@{$loop_data_tree}, $loop);


Автор: vadiml 18.4.2009, 23:23
gcc

Позвольте Вам посоветовать почитать начало книги "Perl Best Practices", автор Damian Conway.
А то просто разобраться в Вашем коде не скопировав в редактор и не приведя его в порядок трудновато, что отбивает желание разбираться в этом коде.

Автор: gcc 18.4.2009, 23:33
fixed

Добавлено @ 23:34
perltidy

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

Автор: tolkien 19.4.2009, 01:31
Цитата(gcc @ 18.4.2009,  06:22)
...
что за прикол? или я туплю?

я поставил   push @{$loop_data_tree}, $key => $value); вместо  $loop_data_tree[$index]{$key} = $value;
сейчас отладка нормальная
...

$loop_data_tree[$index]{$key} = $value; попробуйте переписать так
$loop_data_tree->[$index]->{$key} = $value; 

Автор: gcc 19.4.2009, 08:35
Цитата(tolkien @ 19.4.2009,  01:31)
$loop_data_tree[$index]{$key} = $value; попробуйте переписать так
$loop_data_tree->[$index]->{$key} = $value;

не сработало, там странная проблема я зыбл, тогда когда проходит через 2 цыкла стразу

Добавлено через 1 минуту и 7 секунд
Цитата(ginnie @ 18.4.2009,  09:44)
Код

$loop->{name_se} .= ' --> ' . $loop->{name_se};
push(@{$loop_data_tree}, $loop);

РАБОТАЕТ, я забыл там в прошлый раз такая же проблема была когда 2 раза через цыкл пройтись

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