#!/usr/bin/env perl # typist -- simple typing tutor use strict; use warnings; use List::Util qw(shuffle); main(); sub main { # Load in lines my @lines; while (my $l = ) { chomp $l; $l =~ s/^\s*//; $l =~ s/\s*$//; if ($l) { push(@lines, $l); } } @lines = shuffle @lines; # We've now EITHER hit the end of stdin or read in all the files # So we reopen /dev/tty as our user interface open(my $ttyfh, '<', '/dev/tty') or die "unable to open tty: $!"; my $trys = 1; while (my $item = shift @lines) { print "$item\n"; my $t = time; my $ans = <$ttyfh>; last if !$ans; chomp $ans; if ($ans eq $item) { my $elap = time - $t; my $wpm = scalar(split(' ', $item)) * 60.0 / $elap; printf "Correct! Took %d tries (%d seconds, %d WPM)\n", $trys, $elap, $wpm; $trys = 1; } else { print "Nope! try again...\n"; unshift @lines, $item; $trys++; } } }