http://www.perlmonks.org?node_id=336907

   1: #!/usr/bin/perl
   2: use strict;
   3: use warnings;
   4: 
   5: print graph( @{[1..96]} );
   6: 
   7: #######################################################################
   8: ### give me an array of 96 integers that represent each of the
   9: ### 15-minute intervals in 24 hours.  I'll give you an ascii graph
  10: ### (of, e.g., concurrent users?)
  11: sub graph {
  12:   my( $i, $magic, $m, $p, $top, @g ) = ( 0, 20, 7, 96, 0, () );
  13:   for (0..$p-1) { $top = $top > $_[$_] ? $top : $_[$_] }
  14:   my $s = $top > $magic ? ( $top / $magic ) : 1;  ### calculate scale
  15:   for (0..$magic) {
  16:     $g[$_] = sprintf("%".($m-1)."d ",$_*$s) . ($_%5==0?'_':'.') x $p;
  17:     for $i (0..$p-1) { substr($g[$_],$i+$m,1) = '|' if $_[$i]/$s>$_ } }
  18:   join( "\n", reverse( @g ), ' Time: ' . '|^^^' x ( $p / 4 ),
  19:     ' ' x $m . "12am 1am 2am 3am 4am 5am 6am 7am 8am 9a 10a 11a " .
  20:     "12pm 1pm 2pm 3pm 4pm 5pm 6pm 7pm 8pm 9p 10p 11pm" );
  21: }  # end sub graph
  22: 
  23: __END__
  24:     96 ________________________________________________________________________________________________
  25:     91 ...........................................................................................|||||
  26:     86 ......................................................................................||||||||||
  27:     81 .................................................................................|||||||||||||||
  28:     76 ............................................................................||||||||||||||||||||
  29:     72 ________________________________________________________________________||||||||||||||||||||||||
  30:     67 ...................................................................|||||||||||||||||||||||||||||
  31:     62 ..............................................................||||||||||||||||||||||||||||||||||
  32:     57 .........................................................|||||||||||||||||||||||||||||||||||||||
  33:     52 ....................................................||||||||||||||||||||||||||||||||||||||||||||
  34:     48 ________________________________________________||||||||||||||||||||||||||||||||||||||||||||||||
  35:     43 ...........................................|||||||||||||||||||||||||||||||||||||||||||||||||||||
  36:     38 ......................................||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  37:     33 .................................|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  38:     28 ............................||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  39:     24 ________________________||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  40:     19 ...................|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  41:     14 ..............||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  42:      9 .........|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  43:      4 ....||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  44:      0 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  45:  Time: |^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^|^^^
  46:        12am 1am 2am 3am 4am 5am 6am 7am 8am 9a 10a 11a 12pm 1pm 2pm 3pm 4pm 5pm 6pm 7pm 8pm 9p 10p 11pm
  47: