File::statを見る必要があります。このモジュール (Subversion に付属) を使用すると、ファイルに関するあらゆる種類の情報に簡単にアクセスできます。
Time::Pieceも見てください。このモジュールを使用すると、日付と時刻を簡単にフォーマットできます。
また、4 つの個別の並べ替えルーチンを使用することについても心配しません。代わりに、配列標準の昇順で必要なものを並べ替えるだけです。次に、印刷する前に、ユーザーが降順を要求したかどうかを確認します。ユーザーが降順を要求した場合は、逆を使用して並べ替えられた配列を逆にすることができます。
Referencesを使用しています。ファイル名を保存している配列には、文字列ではなく、ハッシュへの参照が含まれています。このように、配列内の各エントリには、ファイルに関する 4 つの個別の情報が含まれています。
また、Pod::Usage を使用して、 POD のドキュメントに基づいてメッセージを出力しています。POD は、プログラムに関するドキュメントを保存するためのかなり単純な形式です。ユーザーは、次のperldoc
コマンドを使用してポッドを表示できます。
$ perldoc prog.pl
pod2html
または、ドキュメントを HTML に変換するなどのコマンドを使用することもできます。これらのさまざまな Perldoc および POD コマンドは、Perl ディストリビューションに付属しています。POD を学び、幅広く使用することを強くお勧めします。プログラムのドキュメントをプログラムに保持し、ドキュメントのあらゆる種類の形式を作成できるようにします。(テキスト、HTML、マンページ、マークダウン、wiki など)。
#! /usr/bin/env perl
#
use strict;
use warnings;
use feature qw(say);
use autodie;
# All of these are standard Perl module and come with all distributions
# or Perl
use Time::Piece;
use File::stat;
use Getopt::Long;
use Pod::Usage;
use File::Basename;
my ( $directory, $sort_order, $sort_descending, $help );
#
# Using pod2usage to print out my messages
#
GetOptions (
"directory=s" => \$directory,
"sort=s" => \$sort_order,
"descending" => \$sort_descending,
"help" => \$help,
) or pod2usage;
if ( $help ) {
pod2usage ( -message => qq(Use command 'perldoc print_dir.pl' for complete documetation) );
}
if ( not ( defined $directory and defined $sort_order ) ) {
pod2usage ( -message => qq(Must use parameters "directory" and "sort") );
}
if ( $sort_order ne "name" and
$sort_order ne "ctime" and
$sort_order ne "size" and
$sort_order ne "mtime" ) {
die qq(Sort order must be "name", "size", "ctime", or "mtime"\n);
}
opendir ( my $dir_fh, $directory ); #Will autodie here if directory doesn't exist
my @files;
while ( my $file = readdir $dir_fh ) {
$file = "$directory/$file";
next if not -f $file;
#
# Note I'm using File::stat to get the info on the files
#
my $stat = stat $file or die qq(Couldn't stat file "$file"\n);
my %file;
$file{NAME} = basename $file;
$file{CTIME} = $stat->ctime;
$file{MTIME} = $stat->mtime;
$file{SIZE} = $stat->size;
#
# I'm storing this information in a hash and pushing a Hash Reference
#
push @files, \%file; #Pushing a reference to the hash
}
closedir $dir_fh;
my @sorted_files = sort file_sort @files;
#
# I am using the fact that my hash keys and my sort options
# are very similar. One routine sorts all which ways
#
sub file_sort {
my $sort_by = uc $sort_order;
if ( $sort_order eq "name" ) {
return $a->{$sort_by} cmp $b->{$sort_by};
} else {
return $a->{$sort_by} <=> $b->{$sort_by};
}
}
#
# If the user wants descending order, reverse the array
#
if ( $sort_descending ) {
@sorted_files = reverse @sorted_files;
}
#
# I'm using 'printf' to print out a nice report.
# My $format is the format of the report, and I
# can use it for the title or the body.
#
my $format = "%-20.20s %-10d %-11.11s %-11.11s\n";
( my $title_format = $format ) =~ s/d/s/;
printf $title_format, "Name", "Sixe", "Mod-Time", "C-Time";
say join " ", "=" x 20, "=" x 10, "=" x 11, "=" x 11;
for my $file ( @sorted_files ) {
#
# The "->" dereferences the hash
# Note how I use Time::Piece to format my time
#
my $mtime = Time::Piece->new ( $file->{MTIME} );
my $ctime = Time::Piece->new ( $file->{CTIME} );
printf $format, $file->{NAME}, $file->{SIZE}, $mtime->ymd, $ctime->ymd;
}
#
# Here be the Plain Old Documention (POD) This is the standard
# way to document Perl programs. You can use the "perldoc" program
# to print it out, and pod2usage to print out bits and pieces.
#
=pod
=head1 NAME
print_dir.pl
=head1 SYNOPSIS
print_dir.pl -sort [name|size|mtime|ctime] -directory $directory [ -descending ]
=head1 DESCRIPTION
This program does somee amazing wonderful stuff...
=head1 OPTIONS
=over 4
=item *
-sort
(Required) Sort order of directory parameters can be C<name>, C<size>, C<mtime>, C<ctime>
=item *
-directory
(Required) Name of the directory to print
=item *
-descending
(Optional) Sort in descending order instead of ascending order
=back
=cut