Manish Tiwari wrote:
> Thanx Brian and Bill
>
> one approach
>
> Actually this code is in a subroutine that returns a list of files in a
> path name supplied as an argument to this subroutine
>
> i have to do to get list of files
>
> @data = `ls -ltr | grep -v total | sort +8` ;
>
> now $? returns exist status of "sort" not "ls"
>
> Main objective : how to make sure that "ls" command works fine ?
> so one approach is divide it into two parts
>
> @data = `ls -ltr ` ;
> if ( $? != 0 ) {
> print "ls command failed " ;
> exit 1 ;
> }
>
> now
>
> i want like
>
> @data = `echo @data | grep -v total | sort +8 ` ;
> this wont work ..as data is not environment variable
>
> i can however do
>
> ls -ltr
> write output to some temporary file
>
> then do
>
> @data = `cat < file name > | grep -v total | sort +8 ' ;
>
>
> but then i have to create a temp file
> and write to it
> and delete it
No need to shell out to do the last two pipes - actually you can do all
three in Perl. This will eliminate the last two:
use strict;
my @data = `ls -ltr`;
print "\$? = $?\n";
print "data[0] = $data[0]\n" if @data;
if ($? != 0 or not @data or $data[0] !~ /^total/i) {
print "ls command failed " ;
exit 1 ;
}
# second pipe
shift @data; # drop total line
# third pipe
my @sdata = map { $_->[0] }
sort { $a->[9] cmp $b->[9] }
map { [$_, split /\s+/] } @data;
print @sdata, "\n";
__END__
You could use opendir/readdir/closedir/stat to do the ls.
I never shell out unless it's necessary - makes your script more portable
and usually faster.
Here's an ls -lF sub that you could modify:
sub format_lslF {
my $dir = shift;
my $file = shift;
my @s = stat "$dir/$file";
my $mode = convert_mode ($s[2]);
my $uid = sprintf "%-8u", $s[4];
my $gid = sprintf "%-8u", $s[5];
if (not $windoze) { # change this to check your appropriate OS
eval {
$uid = getpwuid ($s[4]);
$gid = getgrgid ($s[5]);
}
}
my $date = convert_date ($s[9]);
my $type = '*' if -x "$dir/$file";
$type = '/' if -d "$dir/$file";
return sprintf "%s%-9.9s %3u %-8.8s %-8.8s %8u %s %-s%s",
-d "$dir/$file" ? 'd' : '-', $mode, $s[3], $uid, $gid, $s[7], $date,
$file, $type;
}
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub convert_mode {
my $mode = shift;
my $str = '';
for (my $ii = 0; $ii < 9; $ii += 3) {
if ($mode & (1 << $ii)) { # mode & 01, 010, 0100
$str .= 'x';
} else {
$str .= '-';
}
if ($mode & (1 << ($ii+1))) { # mode & 02, 020, 0200
$str .= 'w';
} else {
$str .= '-';
}
if ($mode & (1 << ($ii+2))) { # mode & 04, 040, 0400
$str .= 'r';
} else {
$str .= '-';
}
}
substr ($str, 0, 1) = 't' if $mode & 01000; # 4775 = rwsrwxr-x
substr ($str, 3, 1) = 's' if $mode & 02000;
substr ($str, 6, 1) = 's' if $mode & 04000;
return reverse $str;
}
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub convert_date {
my $date = shift;
my $str = '';
# localtime form: Sun Oct 28 18:00:22 2001
my @d = localtime $date;
$str = localtime $date;
# 'Mmm dd hh:mm'
# 'Mmm dd yyyy' if > 6 mos old
if ($date - time > 6 * 30 * 86400) {
$str = sprintf "%-3.3s %2u %4u", substr ($str, 4, 3), $d[3],
$d[5] + 1900;
} else {
$str = sprintf "%-3.3s %2u %02u:%02u", substr ($str, 4, 3), $d[3],
$d[2], $d[1];
}
}
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
--
,-/- __ _ _ $Bill Luebkert ICQ=162126130
(_/ / ) // // DBE Collectibles Mailto:[EMAIL PROTECTED]
/ ) /--< o // // http://dbecoll.tripod.com/ (Free site for Perl)
-/-' /___/_<_</_</_ Castle of Medieval Myth & Magic http://www.todbe.com/
_______________________________________________
Perl-Unix-Users mailing list
[EMAIL PROTECTED]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs