Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Re: Find and Print Directory Names

by cjf (Parson)
on Jul 07, 2002 at 17:02 UTC ( #179994=note: print w/replies, xml ) Need Help??

in reply to s and replace

So you're trying to print out all the directories without the path attached onto them? If so, this might work:

use warnings; use diagnostics; use strict; my %config = ( home => '/home/cjf/' ); my %user = ( site_id => 'code' ); finddir("$config{home}$user{site_id}"); sub finddir { my $root = shift; chomp $root; $root = $root . '/' unless ( $root =~ m|/$| ); opendir ( DIR, $root ) or die "Can't open Directory: $!"; my @userfiles = sort grep !/^\.\.?\z/, readdir DIR; foreach my $file (@userfiles) { next unless ( -d "$root$file" ); print $file, "\n"; finddir("$root$file"); } }

You might want to consider File::Find as well.

Replies are listed 'Best First'.
Re: Re: Find and Print Directory Names
by andrew (Acolyte) on Jul 07, 2002 at 17:19 UTC
    Why does this only print out one direcotry
    @alldir = finddir("$config{home}$user{site_id}"); print "@alldir"; sub finddir { $root = shift; chomp ( $root ); $root = $root . '/' unless ( $root =~ m|/$| ); local *DIR; opendir ( DIR, $root ); my @userfiles = sort grep !/^\.\.?\z/, readdir DIR; foreach $file (@userfiles) { next unless ( -d "$root$file" ); $dir = "$root$file"; $dir =~ s/^\Q$config{home}$user{site_id}\E//; push(@direct, $dir); finddir("$root$file"); } return "@direct"; }

      First off, Use strict warnings and diagnostics. It'll make debugging a lot easier.

      Secondly, try removing the        finddir("$root$file"); from within the foreach loop. You're exiting the loop after the first iteration.

      Update: Oops. Read that wrong. Hang on a sec.

      Update 2:

      my %config = ( home => '/home/cjf/' ); my %user = ( site_id => 'code' ); my @alldir = finddir("$config{home}$user{site_id}"); print $_, "\n" for @alldir; sub finddir { my $root = shift; chomp $root; $root = $root . '/' unless ( $root =~ m|/$| ); local *DIR; opendir DIR, $root or die $!; my @userfiles = sort grep !/^\.\.?\z/, readdir DIR; my @direct; foreach my $file (@userfiles) { next unless ( -d "$root$file" ); my $dir = "$root$file"; $dir =~ s/^\Q$config{home}$user{site_id}\E//; push(@direct, $dir); } return @direct; }

      That will return all directories in $config{home}$user{site_id} but not go into the sub directories. Is that what you're looking for?

        no I want to return all the direcotries is $config(home)$user{site_id}

      The reason it only prints out one directory is that you are not pushing the results of your recursive calls to finddir into the @direct array.

      next unless ( -d "$root$file" ); $dir = "$root$file"; $dir =~ s/^\Q$config{home}$user{site_id}\E//; push(@direct, $dir); push(@direct, finddir("$root$file"));

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://179994]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (12)
As of 2017-10-20 16:08 GMT
Find Nodes?
    Voting Booth?
    My fridge is mostly full of:

    Results (264 votes). Check out past polls.