2017-08-02 3 views
0

Ich habe einen Hashwert, dessen Schlüssel sind Zeitinstanzen und Werte sind Prozesszeit in Millisekunden. Ich arbeite an einer Lösung, bei der der Benutzer einen Zeitwert eingibt und im Gegenzug den Durchschnitt aller Prozesszeiten vor der eingegebenen Zeit erhalten soll.Sortieren und Bearbeiten von Hash mit Durchschnittsberechnungen

Beispiel: Wenn der Benutzer 07:47:42 eingibt, sollte er den Durchschnitt der Prozesszeiten der Tasten 04:46:41, 03:46:37, 06:47:41, 00:45:35, 01 erhalten: 46:05.

Bitte schlagen Sie vor, wie Sie dies tun. Muss ich die Strings in der Zeit konvertieren oder kann es nur in Strings erfolgen. Irgendwelche Codebeispiele wären wirklich hilfreich. Vielen Dank!

$VAR1 = { 
      '01:46:05' => '119.947ms', 
      '11:47:47' => '165.916ms', 
      '15:48:51' => '164.226ms', 
      '19:50:22' => '159.873ms', 
      '10:47:45' => '177.947ms', 
      '04:46:41' => '174.613ms', 
      '16:49:22' => '169.104ms', 
      '00:45:35' => '122.289ms', 
      '18:49:52' => '158.956ms', 
      '06:47:41' => '145.969ms', 
      '09:47:44' => '85.786ms', 
      '12:48:16' => '132.169ms', 
      '05:47:11' => '186.575ms', 
      '03:46:37' => '131.529ms', 
      '07:47:42' => '121.417ms', 
      '21:50:55' => '171.268ms', 
     }; 
+0

Welches Problem ist aufgetreten? Mit 'keys (% $ VAR1)' erhalten Sie die Liste der Schlüssel. Ein String-Vergleich ('$ _ lt '07: 47: 42' ') reicht aus, um die interessierenden Zeiten zu identifizieren. Die Anzahl der Millisekunden kann mit 'substr ($ _, 0, -2)' extrahiert werden. – ikegami

Antwort

2
sub sum { my $acc; $acc += $_ for @_; $acc } 
sub avg { sum(@_)/@_ } 

my $cutoff = '07:47:42'; 

my $result = 
    avg 
     map { substr($VAR1->{$_}, 0, -2) } 
     grep { $_ lt $cutoff } 
      keys %$VAR1; 
+0

Dank ikegami funktioniert das Code-Snippet wirklich gut und prägnant. Vielen Dank! – ran1n

Verwandte Themen