The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Term::Sprog - Perl extension for displaying a progress indicator on a terminal.

SYNOPSIS

  use Term::Sprog;

  my $ctr = Term::Sprog->new('%d Elapsed: %8t %21b %4p %2d (%8c of %11m)',
    {quiet => 0, freq => 10, base => 0, target => 100, pdisp => '!'})
    or die "Error 0010: Term::Sprog->new, ".
           "(code $Term::Sprog::errcode) ".
           "$Term::Sprog::errmsg";

  $ctr->up for (1..100);

  $ctr->down for (1..100);

  $ctr->whisper('abc'); 

  my last_line = $ctr->get_line;

  $ctr->close;

DESCRIPTION

Term::Sprog is a class to implement a progress indicator ("Sprog" is a short form for "Show PROGress"). This is used to provide immediate feedback for long running processes.

A sample code fragment that uses Term::Sprog:

  use Term::Sprog;

  print qq{This is a test of "Term::Sprog"\n\n};

  my $target = 2_845;
  my $format = '%2d Elapsed: %8t %21b %4p %2d (%8c of %11m)';

  my $ctr = Term::Sprog->new($format,
    {freq => 10, base => 0, target => $target, pdisp => '!'})
    or die "Error 0010: Term::Sprog->new, ".
           "(code $Term::Sprog::errcode) ".
           "$Term::Sprog::errmsg";

  for (1..$target) {
      $ctr->up;
      do_something();
  }

  $ctr->close;

  sub do_something {
      my $test = 0;
      for my $i (0..10_000) {
          $test += sin($i) * cos($i);
      }
  }

Another example that counts upwards:

  use Term::Sprog;

  my $format = '%21b %4p';

  my $ctr = Term::Sprog->new($format, {freq => 's', base => 0, target => 70})
    or die "Error 0010: Term::Sprog->new, (code $Term::Sprog::errcode) $Term::Sprog::errmsg";

  for (1..10) {
      $ctr->up(7);
      sleep 1;
  }

  $ctr->close;

This example uses a simple progress bar in quiet mode (nothing is printed to STDOUT), but instead, the content of what would have been printed can now be extracted using the get_line() method:

  use Term::Sprog;

  my $format = 'Ctr %4c';

  my $ctr = Term::Sprog->new($format, {freq => 2, base => 0, target => 10, quiet => 1})
    or die "Error 0010: Term::Sprog->new, (code $Term::Sprog::errcode) $Term::Sprog::errmsg";

  my $line = $ctr->get_line;
  $line =~ s/\010/</g;
  print "This is what would have been printed upon new(): [$line]\n";

  for my $i (1..10) {
      $ctr->up;

      $line = $ctr->get_line;
      $line =~ s/\010/</g;
      print "This is what would have been printed upon $i. call to up(): [$line]\n";
  }

  $ctr->close;

  $line = $ctr->get_line;
  $line =~ s/\010/</g;
  print "This is what would have been printed upon close(): [$line]\n";

The first parameter to new() is the format string which contains the following special characters:

characters '%d'

a revolving dash, format '/-\|'

characters '%t'

time elapsed, format 'hh:mm:ss'

characters '%b'

progress bar, format '#####_____'

characters '%p'

Progress in percentage, format '999%'

characters '%c'

Actual counter value (commified by '_'), format '99_999_999'

characters '%m'

Target maximum value (commified by '_'), format '99_999_999'

characters '%P'

The '%' character itself

The second parameter are the following options:

option {freq => 999}

This option sets the refresh-frequency on STDOUT to every 999 up() or down() calls. If {freq => 999} is not specified at all, then the refresh-frequency is set by default to every up() or down() call.

option {freq => 's'}

This is a special case whereby the refresh-frequency on STDOUT is set to every second.

option {base => 0}

This specifies the base value from which to count. The default is 0

option {target => 10_000}

This specifies the maximum value to which to count. The default is 10_000.

option {pdisp => '!'}

This option (with the exclamation mark) forces the progress bar to display special ASCII characters to simulate blocks, rather than the sharp-symbol ('#'). (Does not work on all terminals)

option {quiet => 1}

This option disables any printing to STDOUT, but the content of the would be printed line is still available using the method get_line()

The new() method immediately displays the initial values on screen. From now on, nothing must be printed to STDOUT and/or STDERR. However, you can write to STDOUT during the operation using the method whisper().

We can either count upwards, $ctr->up, or downwards, $ctr->down. Everytime we do so, the value is either incremented or decremented and the new value is replaced on STDOUT. We should do so regularly during the process. Both methods, $ctr->up(99) and $ctr->down(99) can take an optional argument, in which case the value is incremented/decremented by the specified amount.

When our process has finished, we must close the counter ($ctr->close). By doing so, the last displayed value is removed from STDOUT, as if nothing had happened. Now we are allowed to print again to STDOUT and/or STDERR.

AUTHOR

Klaus Eichner, January 2008

COPYRIGHT AND LICENSE

Copyright (C) 2008 by Klaus Eichner

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.