2014-02-11 5 views
1

Мой сценарий:Perl: Сценарий подсчета делает неправильно?

#!/usr//bin/perl 
# 
# Script to balance accounts between servers 
# By Philip Gabrielsen 
#  
use strict; 
use warnings;  
START: 
print "\nZimbra account moving script\n"; 
print "First we will collect data from Zimbra, this may take a while.\n\n"; 

my %accounts; 
DATACOLLECT: 
print "Collecting Zimbra mailbox server(s)... "; 
my $servers = `zmprov gas mailbox`; 
print "OK\n"; 

print "Collecting numbers of accounts per server... "; 
foreach my $server (split(/\n/, $servers)) { 
    $accounts{$server} = `zmprov -l gaa -s $server|wc -l`; 
} 
print "OK\n"; 

foreach my $server (keys %accounts) { 
    print "\nServer $server with ". $accounts{$server} ." accounts\n"; 
} 

print "TEST, is total number of accounts good?"; 
$accounts{'total'} = 0; 
foreach my $server1 (keys %accounts) { 
    $accounts{'total'} = $accounts{'total'} + $accounts{$server1}; 
    print "\nAdded $accounts{$server1} and total is now $accounts{'total'}"; 
} 
print "\nTotal number of accounts: $accounts{'total'}\n"; 

Выход: [Zimbra @ змея TMP] $ Perl accounts.pl

Zimbra account moving script 
First we will collect data from Zimbra, this may take a while. 

Collecting Zimbra mailbox server(s)... OK 
Collecting numbers of accounts per server... OK 

Server snake with 363 
accounts 

Server tiger with 431 
accounts 

Server lion with 273 
accounts 
TEST, is total number of accounts good? 
Added 363 
and total is now 363 
Added 431 
and total is now 794 
Added [[email protected] tmp]$ perl accounts.pl 

Zimbra account moving script 
First we will collect data from Zimbra, this may take a while. 

Collecting Zimbra mailbox server(s)... OK 
Collecting numbers of accounts per server... OK 

Server titus.zimbra.h.bitbit.net with 363 
accounts 

Server tiberius.zimbra.h.bitbit.net with 431 
accounts 

Server otho.zimbra.h.bitbit.net with 273 
accounts 
TEST, is total number of accounts good? 
Added 363 
and total is now 363 
Added 431 
and total is now 794 
Added 1588 and total is now 1588 
Added 273 
and total is now 1861 
Total number of accounts: 1861 and total is now 1588 
Added 273 
and total is now 1861 
Total number of accounts: 1861 

Как первый видно, при перечислении учетной записи с каждого сервера, отображается правильное число, но в последней части, когда я хочу добавить все учетные записи в общую сумму, число 1588 всплывает, это должно быть 273 ...

+0

Что такое линия средний 'Добавлено [zimbra @ tiberius tmp] $ perl accounts.pl', где похоже, что вы снова запускаете скрипт? – TLP

ответ

5

Должен признаться, какое-то время я был в тупике. Но потом я понял, что этот код не является правильным:

$accounts{'total'} = 0;     # here you add a key to the serverlist 
foreach my $server1 (keys %accounts) { # here you list all keys 
    $accounts{'total'} = $accounts{'total'} + $accounts{$server1}; 
    print "\nAdded $accounts{$server1} and total is now $accounts{'total'}"; 
} 

Поскольку ключ total является одним из ключей в одной и той же хэш:

titus.zimbra.h.bitbit.net 
tiberius.zimbra.h.bitbit.net 
otho.zimbra.h.bitbit.net 
total 

Итак, когда вы достигнете точки в списке для ключа total, вы видите, что общий парный разряд, от 794 до 1588.

Ответ будет заключаться в том, чтобы не использовать один и тот же хеш для хранения вашей суммы. На самом деле, зачем вообще использовать хэш?

my $total = 0;     # independent scalar 
foreach my $server1 (keys %accounts) { 
    $total += $accounts{$server1}; 
    print "\nAdded $accounts{$server1} and total is now $total"; 
} 

Также стоит отметить, что вы говорите, в комментариях, что chomp превращает все номера в 1. Вы, вероятно, используя chomp неправильно, что общая начинающую ошибку.

$count = chomp($count);  # WRONG! chomp returns number of newlines removed 
chomp($count);    # Correct. chomp modifies its argument variable 

Вы могли бы спросить, что это хорошо для chomp вернуть количество новых строк удалены, и ответ на то, что он также может быть использован на массивы и хэши:

my $removed = chomp(@array); # See how many newlines were removed 
+0

Thansk для действительно хорошего ответа. – user3297323

+0

Добро пожаловать. – TLP

0

Вы не читаете chomp() ваши строки ввода после прочтения команд Zimbra - вот почему существует ne wline перед «... и теперь общее количество».

+0

Я знаю, но chmop() сделал все мои значения равными 1, но это не проблема. Это счетная часть ... – user3297323

+0

Вы делали что-то вроде '$ x = chomp ($ x);'? 'chomp' изменяет аргумент и возвращает количество удаленных символов, вместо этого вы должны сделать' chomp ($ x) '. – RobEarl

Смежные вопросы