50 lines
753 B
Perl
Executable File
50 lines
753 B
Perl
Executable File
#!/usr/bin/env perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
my $pagesize = $ENV{'LINES'} || 22;
|
|
|
|
open(my $tty, '<', '/dev/tty')
|
|
or die "$0: Cannot open /dev/tty for reading: $!";
|
|
|
|
sub evalcmd {
|
|
{
|
|
chomp($_ = <$tty>);
|
|
if (/^q$/) {
|
|
exit(0);
|
|
} elsif (/^!(.*)/) {
|
|
system($1);
|
|
redo;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub printfile {
|
|
my ($fh) = @_;
|
|
my $lines = 0;
|
|
while (<$fh>) {
|
|
print;
|
|
&evalcmd unless ++$lines % $pagesize;
|
|
}
|
|
}
|
|
|
|
unshift(@ARGV, '-') unless @ARGV;
|
|
|
|
my $n = $#ARGV;
|
|
for (@ARGV) {
|
|
if (/^-$/) {
|
|
&printfile(\*STDIN);
|
|
&evalcmd if $n--;
|
|
} elsif (/^-(\d+)$/) {
|
|
$pagesize = $1;
|
|
} else {
|
|
open(my $fh, '<', $_) or die "$0: Cannot open $_ for reading: $!";
|
|
&printfile($fh);
|
|
&evalcmd if $n--;
|
|
close($fh);
|
|
}
|
|
}
|
|
|
|
close($tty);
|