ppt

 view release on metacpan or  search on metacpan

src/ls/lst  view on Meta::CPAN

}

$IDX = 'mtime';
$IDX = 'atime' if $opt_u;
$IDX = 'ctime' if $opt_c;
$IDX = 'size'  if $opt_s;

$TIME_IDX = $opt_s ? 'mtime' : $IDX;

*name = \$File::Find::name;  # forcibly import that variable

# the $opt_i flag tricks wanted into taking
# its filenames from ARGV instead of being
# called from find.

if ($opt_i) {
	 *name = *_;  # $name now alias for $_
	 while (<>) { chomp; &wanted; }   # ok, not stdin really
}  else {
	find(\&wanted, @ARGV);
}

# sort the files by their cached times, youngest first
@skeys = sort { $time{$b} <=> $time{$a} } keys %time;

# but flip the order if -r was supplied on command line
@skeys = reverse @skeys if $opt_r;

for (@skeys) {
	unless ($opt_l) {  # emulate ls -l, except for permissions
	    print "$_\n";
	    next;
	}
	$now = localtime $stat{$_}->$TIME_IDX();
	printf "%6d %04o %6d %8s %8s %8d %s %s\n",
		$stat{$_}->ino(),
		$stat{$_}->mode() & 07777,
		$stat{$_}->nlink(),
		user($stat{$_}->uid()),
		group($stat{$_}->gid()),
		$stat{$_}->size(),
		$now, $_;
}

# get stat info on the file, saving the desired
# sort criterion (mtime, atime, ctime, or size)
# in the %time hash indexed by filename.
# if they want a long list, we have to save the
# entire stat object in %stat.  yes, this is a
# hash of objects
sub wanted {
	my $sb = stat($_);  # XXX: should be stat or lstat?
	return unless $sb;
	$time{$name} = $sb->$IDX();  # indirect method call
	$stat{$name} = $sb if $opt_l;
}

# cache user number to name conversions
sub user {
	my $uid = shift;
	$user{$uid} = getpwuid($uid)->name || "#$uid"
	    unless defined $user{$uid};
	return $user{$uid};
}

# cache group number to name conversions
sub group {
	my $gid = shift;
	$group{$gid} = getgrgid($gid)->name || "#$gid"
	    unless defined $group{$gid};
	return $group{$gid};
}



( run in 1.050 second using v1.01-cache-2.11-cpan-fe3c2283af0 )