This program clears your screen and scribbles all over it until you interrupt it. It shows how to use Term::Cap to clear the screen, move the cursor, and write anywhere on the screen. It also uses Recipe 16.6.
The program text is shown in Example 15-8.
#!/usr/bin/perl -w # tcapdemo - show off direct cursor placement use POSIX; use Term::Cap; init( ); # Initialize Term::Cap. zip( ); # Bounce lines around the screen. finish( ); # Clean up afterward. exit( ); # Two convenience functions. clear_screen is obvious, and # clear_end clears to the end of the screen. sub clear_screen { $tcap->Tputs('cl', 1, *STDOUT) } sub clear_end { $tcap->Tputs('cd', 1, *STDOUT) } # Move the cursor to a particular location. sub gotoxy { my($x, $y) = @_; $tcap->Tgoto('cm', $x, $y, *STDOUT); } # Get the terminal speed through the POSIX module and use that # to initialize Term::Cap. sub init { $| = 1; $delay = (shift( ) || 0) * 0.005; my $termios = POSIX::Termios->new( ); $termios->getattr; my $ospeed = $termios->getospeed; $tcap = Term::Cap->Tgetent ({ TERM => undef, OSPEED => $ospeed }); $tcap->Trequire(qw(cl cm cd)); } # Bounce lines around the screen until the user interrupts with # Ctrl-C. sub zip { clear_screen( ); ($maxrow, $maxcol) = ($tcap->{_li} - 1, $tcap->{_co} - 1); @chars = qw(* - / | \ _ ); sub circle { push(@chars, shift @chars); } $interrupted = 0; $SIG{INT} = sub { ++$interrupted }; $col = $row = 0; ($row_sign, $col_sign) = (1,1); do { gotoxy($col, $row); print $chars[0]; select(undef, undef, undef, $delay); $row += $row_sign; $col += $col_sign; if ($row = = $maxrow) { $row_sign = -1; circle; } elsif ($row = = 0 ) { $row_sign = +1; circle; } if ($col = = $maxcol) { $col_sign = -1; circle; } elsif ($col = = 0 ) { $col_sign = +1; circle; } } until $interrupted; } # Clean up the screen. sub finish { gotoxy(0, $maxrow); clear_end( ); }
This is what it looks like in mid-run:
* _ / | \ - * _ \ - / | / | \ - * * _ \ - / | / | \ - * * \ - | / | - * _ * \ - | / / | - \ * _ * \ - | / / | - \ * * * \ - | / / | - \ * * * \ - | / / | - \ * * * \ - | / / | - \ * * * \ - | / / | - \ * * * \ - | / / | - \ * * * \ - | / / | - \ * - \ | / / - \ * - * - \ | / | / - \ * - * - \ | / | / - \ _ - - \ | / _
termcap(5) (if you have it); the documentation for the standard Term::Cap module