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

Поиск:

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


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


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

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



странная проблема при округлении:
Код

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

Это сообщение отредактировал(а) gcc - 11.12.2008, 14:41
PM WWW ICQ Skype GTalk Jabber   Вверх
sir_nuf_nuf
Дата 11.12.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



gcc, исходные данные и че хотите с ними сделать - пришлите плиз


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
amg
Дата 11.12.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Может, нужно sprintf вместо printf?

ЗЫ gcc, нехорошо постить на форум такой код: с длиннющими переменными, неформатированный, да еще с неопределенной функцией :(
PM MAIL   Вверх
gcc
Дата 11.12.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(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);


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


Эксперт
***


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

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



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

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


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


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

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



Код

use strict;
use POSIX qw(ceil floor);


спасибо, попробую тогда как-то по другому или без округления
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 11.12.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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


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


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

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



Цитата(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";
}


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

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


Эксперт
***


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

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



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



Это сообщение отредактировал(а) amg - 11.12.2008, 12:53
PM MAIL   Вверх
gcc
Дата 11.12.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

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


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

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


Эксперт
***


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

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



gcc, что выдаст

Код

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


вместо

Код

print @loop_data;


?


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


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


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

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



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 



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

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


Эксперт
***


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

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



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




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
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.0943 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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