sort

A

asgweb

hello. i have code (below) that sorts the contents of a directory. it
works fine, but i need to show only files that start with an 'R'.
thanks in advance for your help.
opendir(STOCKBACKGROUND, ".") || &error("STOCKBACKGROUND");
@stockbackgrounds = readdir(STOCKBACKGROUND);
@stockbackgrounds = sort {lc($a) cmp lc($b)} @stockbackgrounds;
closedir(STOCKBACKGROUND);
 
B

Ben Morrow

Quoth asgweb said:
hello. i have code (below) that sorts the contents of a directory. it
works fine, but i need to show only files that start with an 'R'.
thanks in advance for your help.

perldoc -f grep
opendir(STOCKBACKGROUND, ".") || &error("STOCKBACKGROUND");

Use lexical filehandles in non-ancient versions of Perl (since 5.6.0).

Don't call subs with & unless you need the special effects that causes.

Include the system error and what you were trying to do in the error
message.

I would recommend using 'or' instead of '||', as you can then drop the
parens. You may not like that style, though.

opendir my $STOCKBACKGROUND, "." or error "can't opendir '.': $!";
@stockbackgrounds = readdir(STOCKBACKGROUND);

You should have

use strict;

at the top of your script; this line will the need to become

my @stockbackgrounds = readdir($STOCKBACKGROUND);
@stockbackgrounds = sort {lc($a) cmp lc($b)} @stockbackgrounds;
closedir(STOCKBACKGROUND);

I would do this all in one go, without the intermediate assignments;
also, if you use lexical filehandles they close themselves at the end of
the block they are in, so you can simply write

my @stockbackgrounds = do {
opendir my $D, '.' or error "can't opendir '.': $!";
sort { lc($a) cmp lc($b) }
grep /^R/, readdir $D;
};

You may find that too compressed, though.

Ben
 
U

Uri Guttman

BM> my @stockbackgrounds = do {
BM> opendir my $D, '.' or error "can't opendir '.': $!";
BM> sort { lc($a) cmp lc($b) }
BM> grep /^R/, readdir $D;
BM> };

even though File::Slurp is a pretty popular module, it also has a lesser
known read_dir sub that cleans up that code a bit:

use File::Slurp ;

my @stockbackgrounds = sort { lc($a) cmp lc($b) } grep /^R/, read_dir '.';

one day i will add a filter option and it would look something like
this:

my @stockbackgrounds = sort { lc($a) cmp lc($b) } read_dir '.', qr/^R/;

uri
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,150
Members
46,696
Latest member
BarbraOLog

Latest Threads

Top