1

我的脚本:

#!/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@snake 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 [zimbra@tiberius 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

正如第一次看到的,当列出每个服务器的帐户时,会显示正确的数字,但最后一部分,当我想将所有 $accounts 添加到总值中时,会弹出数字 1588,这应该是 273...

4

2 回答 2

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

因为keytotal是同一个hash中的key之一:

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

因此,当您到达 key 列表中的点时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 
于 2014-02-11T14:12:53.147 回答
0

从 Zimbra 命令读取后,您需要 chomp() 输入行 - 这就是为什么在“......并且现在是现在”之前有一个换行符的原因。

于 2014-02-11T13:32:39.130 回答