Linux Rocks wrote:
> 
> Hi All,

Hello,

> I want to read contents of a dir, filtered, into a hash.  I have this:
> 
> #/usr/local/bin -w
   ^^^^^^^^^^^^^^
I see no 'perl' there.


> use strict;
> my (@ARRAY, %TEST, $FILTER) = "";

Why are you assigning "" to the first element of @ARRAY?


> print "Enter filter:";
> $FILTER = <STDIN>;
> chomp $FILTER;
> @ARRAY = ` ls -l /foo/bar | grep "$FILTER" `;
> for (@ARRAY) {
> chomp;
> }
> 
> This gets just the info I want, but it's all run together as a single string in
> each element.  How can I get each portion of each element returned to hash with
> filename as the key?  I would like filename as key and separate values for each
> field, ie. rights, size, owner, group, date.
> 
> I'm guessing I can do something like this:
> 
> for (@ARRAY) {
> #magical split on whitespace and stuff into hash;
> }
> 
> But what is the magical split thingy?  I tried %TEST = (split " ");
> but that didn't seem to work as rights are the same on all files and since that
> went in first as key, it just kept overwriting existing keys.  I then tried
> this, which I think was very close:
> 
> for (@ARRAY) {
> ($File, $Time, $Date, $Size, $Group, $Owner, $Rights) = (reverse split " ");
> $TEST {$File} = $Time, $Date, $Size, $Group, $Owner, $Rights;
> }
> 
> but I am getting "Useless use of a variable in void context [...]".  I know
> there are much easier ways to manipulate file and dir data.  I am doing this as
> practice as I will eventually need to retreive data from a proprietary command
> that will return data in a simlar manner and I need to be able to manipulate it.

Perl has the tools to do most of that without running an external
program like 'ls' or 'grep'.

#/usr/local/bin/perl -w
use strict;
use POSIX 'strftime';
use Stat::lsMode 'format_mode';

my $dir = '/foo/bar';

print 'Enter filter: ';
chomp( my $filter = <STDIN> );

opendir DIR, $dir or die "Cannot open $dir: $!";
my @array = grep /$filter/, readdir DIR;
closedir DIR;

my %test = map {
    my @stat = lstat "$dir/$_";
    my $time = strftime '%T', localtime $stat[ 9 ];
    my $date = strftime '%D', localtime $stat[ 9 ];
    my $size = $stat[ 7 ];
    my $group = getgrgid $stat[ 5 ];
    my $owner = getpwuid $stat[ 4 ];
    my $rights = format_mode $stat[ 2 ];
    $_, [ $time, $date, $size, $group, $owner, $rights ];
    } @array;



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to