sub Statistics {   my %param;   if (ref $_[0] eq 'HASH') {      %param = %{$_[0]};   }   elsif (@_ & 1) {      die 'LinuxStatistics: not enough arguments ...';   }   else {      %param = @_;   }   my $t_stats = {};   my $stats   = {};   # set a time stamp for the statistics   if ($param{TimePoint}) {      my @tm = localtime(time);      $tm[4] += 1;      $tm[5] += 1900;      foreach (@tm) {         $_ = "0$_" if $_ < 10;      }      $stats->{TimePoint}->{Date} = "$tm[5]-$tm[4]-$tm[3]";      $stats->{TimePoint}->{Time} = "$tm[2]:$tm[1]:$tm[0]";   }   # get the statistics   $stats->{SysInfo}     = SysInfo()   if $param{SysInfo};   $stats->{MemStats}    = MemStats()  if $param{MemStats};   $stats->{SockStats}   = SockStats() if $param{SockStats};   $stats->{DiskUsage}   = DiskUsage() if $param{DiskUsage};   $stats->{LoadAVG}     = LoadAVG()   if $param{LoadAVG};   $stats->{Processes}   = Processes() if $param{Processes};   # some statistics must run twice because the differences are needed   $t_stats->{ProcStats} = ProcStats() if $param{ProcStats};   $t_stats->{PgSwStats} = PgSwStats() if $param{PgSwStats};   ($t_stats->{NetStats},$t_stats->{NetSumStats})   = NetStats()  if $param{NetStats};   ($t_stats->{DiskStats},$t_stats->{DiskSumStats}) = DiskStats() if $param{DiskStats};   # wait a second until the next step   sleep(1) if %{$t_stats};   # now we calculate the difference   if ($param{ProcStats}) {      $stats->{ProcStats} = ProcStats();      foreach my $x (keys %{$stats->{ProcStats}}) {         $stats->{ProcStats}->{$x} -= $t_stats->{ProcStats}->{$x};      }      $stats->{ProcStats}->{ProcUser}   =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcUser} / $stats->{ProcStats}->{Uptime});      $stats->{ProcStats}->{ProcNice}   =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcNice} / $stats->{ProcStats}->{Uptime});      $stats->{ProcStats}->{ProcSystem} =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcSystem} / $stats->{ProcStats}->{Uptime});      $stats->{ProcStats}->{ProcIdle}   =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcIdle} / $stats->{ProcStats}->{Uptime});      $stats->{ProcStats}->{ProcIOWait} =  sprintf('%.2f',100 * $stats->{ProcStats}->{ProcIOWait} / $stats->{ProcStats}->{Uptime});      $stats->{ProcStats}->{ProcTotal}  =  $stats->{ProcStats}->{ProcUser} + $stats->{ProcStats}->{ProcNice} + $stats->{ProcStats}->{ProcSystem};      delete $stats->{ProcStats}->{Uptime};   }   if ($param{PgSwStats}) {      $stats->{PgSwStats} = PgSwStats();      foreach my $x (keys %{$stats->{PgSwStats}}) {         $stats->{PgSwStats}->{$x} -= $t_stats->{PgSwStats}->{$x};      }   }   if ($param{NetStats}) {      ($stats->{NetStats},$stats->{NetSumStats}) = NetStats();      foreach my $x (keys %{$stats->{NetStats}}) {         foreach my $y (keys %{$stats->{NetStats}->{$x}}) {            $stats->{NetStats}->{$x}->{$y} -= $t_stats->{NetStats}->{$x}->{$y};         }      }      foreach my $x (keys %{$stats->{NetSumStats}}) {         $stats->{NetSumStats}->{$x} -= $t_stats->{NetSumStats}->{$x};      }   }   if ($param{DiskStats}) {      ($stats->{DiskStats},$stats->{DiskSumStats}) = DiskStats();      foreach my $x (keys %{$stats->{DiskStats}}) {         foreach my $y (keys %{$stats->{DiskStats}->{$x}}) {            $stats->{DiskStats}->{$x}->{$y} -= $t_stats->{DiskStats}->{$x}->{$y};         }      }      foreach my $x (keys %{$stats->{DiskSumStats}}) {         $stats->{DiskSumStats}->{$x} -= $t_stats->{DiskSumStats}->{$x};      }   }   return $stats; }