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


Автор: gcc 11.12.2008, 11:30
странная проблема при округлении:
Код

use strict;
use POSIX qw(ceil floor);

my @arrayedout=();

for my $loopindex (0..$#loop_data) {
   for my $key (keys %{$loop_data[$loopindex]}) {

    if ($loop_data[$loopindex]{'maxquota'} ne '' ) {
      print $loop_data[$loopindex]{'maxquota'};
      # пробовал разными способами floor, int, sprintf
      $loop_data[$loopindex]{'maxquota'} = $loop_data[$loopindex]{'maxquota'}/1048576;
      $loop_data[$loopindex]{'maxquota'} =  printf( "% .1f",  ceil($loop_data[$loopindex]{'maxquota'}) );
      print $loop_data[$loopindex]{'maxquota'};
      $arrayedout[$loopindex]{'maxquota'} = $loop_data[$loopindex]{'maxquota'};
     } 
              $arrayedout[$loopindex]{$key} = $loop_data[$loopindex]{$key};          
  }
}


если добавить     
Код

$loop_data[$loopindex]{'maxquota'} = '41943040';

то работает

данные есть нулевые, не могу найти ошибку, при выводе все  '0'
если не округлять, то ичсла разные: 41943040, 10943040, 1943040, 0

Автор: sir_nuf_nuf 11.12.2008, 11:47
gcc, исходные данные и че хотите с ними сделать - пришлите плиз

Автор: amg 11.12.2008, 11:57
Может, нужно sprintf вместо printf?

ЗЫ gcc, нехорошо постить на форум такой код: с длиннющими переменными, неформатированный, да еще с неопределенной функцией :(

Автор: gcc 11.12.2008, 12:02
Цитата(amg @ 11.12.2008,  11:57)
Может, нужно sprintf вместо printf?

ЗЫ gcc, нехорошо постить на форум такой код: с длиннющими переменными, неформатированный, да еще с неопределенной функцией :(

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

а где функция не определана?
если $value = int($value);
должно работает? но не работает тоже...

Добавлено @ 12:11
sir_nuf_nuf

Код

if ($loop_data[$loopindex]{'description'} eq '')  {
   $arrayedout[$loopindex]{'description'} = 'No Description';
}


если добавить вот это, то работает, если пусто, то сохраняет 'No Description'

какие исходные данные? их много...

все остальное работает...
черновик:
Код

 my @loop_data=();
       while (my $ref = $sth->fetchrow_hashref()) {        push(@loop_data, $ref);    }         
            $sth->finish(); 
            
            print @loop_data;

my @arrayedout=();

for my $loopindex (0..$#loop_data) {
   for my $key (keys %{$loop_data[$loopindex]}) {

if ($loop_data[$loopindex]{'active'} eq '0')  {
   $arrayedout[$loopindex]{'active'} = 'NO';
} else { $arrayedout[$loopindex]{'active'} = 'YES';





if ($loop_data[$loopindex]{'m_mailbox'} eq '')  {
   $arrayedout[$loopindex]{'m_mailbox'} = $loop_data[$loopindex]{'mailboxes'};
}

if ($loop_data[$loopindex]{'m_aliases'} eq '')  {
   $arrayedout[$loopindex]{'m_aliases'} = $loop_data[$loopindex]{'aliases'};
}



if ($loop_data[$loopindex]{'maxquota'}) {
   ### $loop_data[$loopindex]{'maxquota'} = int($loop_data[$loopindex]{'maxquota'}/1048576);
   ### $loop_data[$loopindex]{'maxquota'}=int($loop_data[$loopindex]{'maxquota'});
   
     my $value;
     $value = $loop_data[$loopindex]{'maxquota'};
    
    #print $loop_data[$loopindex]{'maxquota'};
    
    ## $loop_data[$loopindex]{'maxquota'} = '41943040';

           $loop_data[$loopindex]{'maxquota'} = $loop_data[$loopindex]{'maxquota'}/1048576;

         $value = $value/1048576; 
                        $value = sprintf("%.1f", $value);
           #$value =  printf( "% .1f\t%", $value, ceil($value) );

           
          ## printf( "% .1f",  ceil($value) );

   $loop_data[$loopindex]{'maxquota'} = floor ($loop_data[$loopindex]{'maxquota'});
                      # print $value2;
                      
     print $loop_data[$loopindex]{'maxquota'};
     
$arrayedout[$loopindex]{'maxquota'} = $value;
                       } 
                     

if ($loop_data[$loopindex]{'description'} eq '')  {
   $arrayedout[$loopindex]{'description'} = 'No Description';
}
   $arrayedout[$loopindex]{'username2'} = $username;
   $arrayedout[$loopindex]{$key} = $loop_data[$loopindex]{$key};
      
}
}  
         
  my $template = HTML::Template->new(filename => $se{'dirt'}.'tempele-x-list.html',die_on_bad_params => 0, blind_cache => 1);

Автор: amg 11.12.2008, 12:15
Цитата(gcc @  11.12.2008,  12:02 Найти цитируемый пост)
а где функция не определана?
ceil($loop_data[$loopindex]{'maxquota'})

Автор: gcc 11.12.2008, 12:18
Код

use strict;
use POSIX qw(ceil floor);


спасибо, попробую тогда как-то по другому или без округления

Автор: ginnie 11.12.2008, 12:26
gcc, пять раз перечитал все сообщения, но так и не понял, что означает фраза "не работает". Можно поподробней объяснить?

Автор: gcc 11.12.2008, 12:30
Цитата(gcc @ 11.12.2008,  11:30)
при выводе все  '0'


$loop_data[$loopindex]{'maxquota'} это значения равняються 0
или если окургять к десятичной части, то 0.0

(возможно я где-то перепутал что-то...)

попробую еще вот так:
Код

for $hashreference(@array) {
  print "{";
  for $key (sort keys %$hashreference) {
    print "$key => $array[$loopindex]{$key}, ";
  }
print ,"}\n";
}


или без округление

Автор: amg 11.12.2008, 12:52
gcc, после Вашего последнего поста тоже перестал что-либо понимать.

Вот (почти) Ваш код. Что в нем работает неправильно?
Код
$loop_data[0]{'maxquota'} = '41943040';
$loop_data[1]{'maxquota'} = 41943040;
$loop_data[2]{'maxquota'} = 10943040;
$loop_data[3]{'maxquota'} = 1943040;
$loop_data[4]{'maxquota'} = 0;

my @arrayedout=();

for my $loopindex (0..$#loop_data) {
  for my $key (keys %{$loop_data[$loopindex]}) {
    if ($key eq 'maxquota' && $loop_data[$loopindex]{'maxquota'} ne '' ) {
      #print $loop_data[$loopindex]{'maxquota'};
      $loop_data[$loopindex]{'maxquota'} /= 1048576;
      $loop_data[$loopindex]{'maxquota'} = sprintf( "%.1f", $loop_data[$loopindex]{'maxquota'} );
      print $loop_data[$loopindex]{'maxquota'}, "\n";
      #$arrayedout[$loopindex]{'maxquota'} = $loop_data[$loopindex]{'maxquota'};
    } 
    $arrayedout[$loopindex]{$key} = $loop_data[$loopindex]{$key};          
  }
}


Автор: gcc 11.12.2008, 12:56
Код

                       $template->param(ROWS => \@arrayedout);


после этого в maxquota все равняется 0 или 0.0

Автор: ginnie 11.12.2008, 13:19
gcc, что выдаст

Код

use Data::Dumper;
print Dumper(\@loop_data);


вместо

Код

print @loop_data;


?

Автор: gcc 11.12.2008, 13:25
ginnie



Цитата

}; $VAR9 = { 'active' => '1', 'backupmx' => '0', 'mailboxes' => '10', 'description' => '', 'idnane' => '5', 'countalias' => '0', 'modified' => '2008-12-10 21:07:15', 'domain' => '7sdfsdf.org.ua', 'aliases' => '10', 'maxquota' => '4194304', 'countmail' => '0' }; $VAR10 = { 'active' => '1', 'backupmx' => '0', 'mailboxes' => '430', 'description' => 'sdfsdf', 'idnane' => '5', 'countalias' => '0', 'modified' => '2008-12-10 21:12:52', 'domain' => 'rthrty.org.ua', 'aliases' => '-1', 'maxquota' => '0', 'countmail' => '0' }; $VAR11 = { 'active' => '1', 'backupmx' => '0', 'mailboxes' => '10', 'description' => '', 'idnane' => '5', 'countalias' => '0', 'modified' => '2008-12-11 10:13:47', 'domain' => 'dfgdfgdfg.org.ua', 'aliases' => '10', 'maxquota' => '41943040', 'countmail' => '0' }; 




если 
Код

print Dumper(\@arrayedout);


0 или 0.0


amg, я случайно перепутал @loop_data с @arrayedou, ну имеел ввиду после этих операций

Добавлено @ 13:31

сейчас я попробовал по другому:

после перебора

Код

for my $loopindex(@loop_data) {
  for my $key (keys %$loopindex) {
       $arrayedout[$loopindex]{$key} = $loop_data[$loopindex]{$key};
  }
}


как сохранить данные?

ругается на эту строку
Код

       $arrayedout[$loopindex]{$key} = $loop_data[$loopindex]{$key};

так:
Код

Out of memory during "large" request for 1073745920 bytes, total sbrk() is 6447104 bytes 



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

Автор: ginnie 11.12.2008, 13:48
gcc, рекомендую поменять алгоритм обработки: не нужно дублировать массив с данными, просто модифицируйте исходный.

Код

for my $row (@loop_data) {
    $row->{active} = $row->{active} == 0 ? 'YES' : 'NO';
    $row->{m_mailbox} = delete $row->{mailboxes};
    $row->{m_aliases} = delete $row->{aliases};
    $row->{description} ||= 'No Description';
    $row->{username2} = $username;
    $row->{maxquota} = sprintf('%.1f', $row->{maxquota} / 1048576);
}

$template->param(ROWS => \@loop_data);


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