From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!/usr/local/bin/perl -w
use Tk;
my $now = time;
my $mw = MainWindow->new;
my $t = $mw->Table(-scrollbars => 'e',-fixedrows => 1, -rows => 20);
$t->pack(-expand=> 1, -fill => 'both');
$dir = (@ARGV) ? shift : '.';
opendir(DIR,$dir) || die "Cannot opendir $dir:$!";
my $r = 1;
my $c = 0;
my $name;
foreach $name ([-text => "Mode",-anchor => 'e'],
[-text => "Ln",-anchor => 'e'],
[-text => "User",-anchor => 'w'],
[-text => "Size",-anchor => 'e'],
[-text => "Date",-anchor => 'w'],
[-text => "Name",-anchor => 'w'])
{
$t->put(0,$c++,$t->Label(@$name,-relief => 'raised'));
}
$t->configure(-columns => $c) if ($c > $t->cget('-columns'));
my @opt = (-relief => 'groove');
foreach $name (sort readdir(DIR))
{
my $c = 0;
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
$blksize,$blocks) = lstat("$dir/$name");
die "Cannot lstat $dir/$name:$!" unless (defined $dev);
$t->put($r,$c++,$t->Label(@opt,-text => sprintf("%o",$mode),-anchor => 'e'));
$t->put($r,$c++,$t->Label(@opt,-text => $nlink,-anchor => 'e'));
$t->put($r,$c++,$t->Label(@opt,-text => $uid,-anchor => 'w'));
$t->put($r,$c++,$t->Label(@opt,-text => $size,-anchor => 'e'));
$t->put($r,$c++,$t->Label(@opt,-text => fmtdate($mtime),-anchor => 'w'));
$t->put($r,$c++,$t->Label(@opt,-text => $name,-anchor => 'w'));
$r++;
}
closedir(DIR);
$t->update;
$t->focus;
MainLoop;
sub fmtdate
{
my $t = shift;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t);
my @mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
sprintf("%s %2d %2d:%2d", $mon[$mon], $mday,$hour,$min);
}