in reply to List and identify directories

Here is a bit of line noise for you to ponder. It will print out all the files/dirs in a given directory and flag them.....

print map{ -d $_ ? "DIR $_\n" : "FILE $_\n" } glob( "/some/dir/*" );

cheers

tachyon

Replies are listed 'Best First'.
Re^2: List and identify directories
by Grygonos (Chaplain) on Jun 28, 2004 at 12:58 UTC

    Is the -d method faster or more efficient than the opendir() method? Are there any advantages to either method. I currently use the opendir() in some apps. I really like what tachyon posted, but is it more or less efficient than my current solution?

      Any of the -X operators involve a call to stat(). You can use the cached result by doing if -f $_ and ! -l _ ie the '_' char accesses the (last) cached stat result. As for readdir vs glob I would expect them to be similar for speed. glob *is* different from readdir in one important way that can bite you if you don't expect it. With glob you will have the full/partial path you fed it in every result element. Sometimes this is very convenient as it saves adding the path, sometimes of course it is not. If it is convenient I use glob, if I just want the file/dir names without any path I use readdir.

      cheers

      tachyon

        As for readdir vs glob I would expect them to be similar for speed.

        I got caught by that assumption a while ago...but glob is still nicer.

        P:\test>perl -MBenchmark=cmpthese -le" cmpthese( -1, { glob=>q[ @f=@d=(); push @{ -d() ? \@d : \@f }, $_ for glob('*'); ], readdir=>q[ @d=@f=(); opendir D, '.'; push @{ -d() ? \@d : \@f }, $_ while $_ = readdir D; ] });" Rate glob readdir glob 22.9/s -- -48% readdir 44.4/s 94% --

        Examine what is said, not who speaks.
        "Efficiency is intelligent laziness." -David Dunham
        "Think for yourself!" - Abigail
        "Memory, processor, disk in that order on the hardware side. Algorithm, algoritm, algorithm on the code side." - tachyon