sort

Discussion in 'Perl Misc' started by asgweb, Mar 8, 2008.

  1. asgweb

    asgweb Guest

    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);
    asgweb, Mar 8, 2008
    #1
    1. Advertising

  2. asgweb

    Ben Morrow Guest

    Quoth 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.


    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
    Ben Morrow, Mar 8, 2008
    #2
    1. Advertising

  3. asgweb

    Uri Guttman Guest

    >>>>> "BM" == Ben Morrow <> writes:

    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

    --
    Uri Guttman ------ -------- http://www.sysarch.com --
    ----- Perl Architecture, Development, Training, Support, Code Review ------
    ----------- Search or Offer Perl Jobs ----- http://jobs.perl.org ---------
    --------- Gourmet Hot Cocoa Mix ---- http://bestfriendscocoa.com ---------
    Uri Guttman, Mar 8, 2008
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. nobody
    Replies:
    0
    Views:
    534
    nobody
    Jun 1, 2004
  2. JerryJ
    Replies:
    11
    Views:
    1,400
    Dave Moore
    Apr 28, 2004
  3. John Black
    Replies:
    6
    Views:
    2,055
    John Harrison
    May 28, 2004
  4. Angus Comber
    Replies:
    7
    Views:
    1,153
    Richard Heathfield
    Feb 5, 2004
  5. Navin
    Replies:
    1
    Views:
    685
    Ken Schaefer
    Sep 9, 2003
Loading...

Share This Page