Alex Rivera | Logout

What reasons are there to prefer glob over readdir (or vice-versa) in Perl?

Asked 2009-10-01T22:15:12.023
64

This question is a spin-off from this one. Some history: when I first learned Perl, I pretty much always used glob rather than opendir + readdir because I found it easier. Then later various posts and readings suggested that glob was bad, and so now I pretty much always use readdir.

After thinking over this recent question I realized that my reasons for one or the other choice may be bunk. So, I'm going to lay out some pros and cons, and I'm hoping that more experienced Perl folks can chime in and clarify. The question in a nutshell is are there compelling reasons to prefer glob to readdir or readdir to glob (in some or all cases)?

glob pros:

  1. No dotfiles (unless you ask for them)

  2. Order of items is guaranteed

  3. No need to prepend the directory name onto items manually

  4. Better name (c'mon - glob versus readdir is no contest if we're judging by names alone)

  5. (From ysth's answer; cf. glob cons 4 below) Can return non-existent filenames:

    @deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}";
    

glob cons:

  1. Older versions are just plain broken (but 'older' means pre 5.6, I think, and frankly if you're using pre 5.6 Perl, you have bigger problems)

  2. Calls stat each time (i.e., useless use of stat in most cases)

  3. Problems with spaces in directory names (is this still true?)

  4. (From brian's answer) Can return filenames that don't exist:

    Edit
    Report

1 Answer

2

glob pros:

3) No need to prepend the directory name onto items manually

Exception:

say for glob "*";

--output:--
1perl.pl
2perl.pl
2perl.pl.bak
3perl.pl
3perl.pl.bak
4perl.pl
data.txt
data1.txt
data2.txt
data2.txt.out

As far as I can tell, the rule for glob is: you must provide a full path to the directory to get full paths back. The Perl docs do not seem to mention that, and neither do any of the posts here.

That means that glob can be used in place of readdir when you want just filenames (rather than full paths), and you don't want hidden files returned, i.e. ones starting with '.'. For example,

chdir ("../..");  
say for glob("*");
answered 2009-11-14T06:44:31.600

Your Answer