in reply to readdir fails?

(@dir0) = readdir(ID) || print "Couldn't read directory contents.\n";

|| forces scalar context. Your code actually is:
@dir0 = (readdir(ID) || 1); # assuming print doesn't fail
What you probably want, is:
(@dir0 = readdir(ID)) || print "...";
which is equal to:
@dir0 = readdir(ID) or print "...";
(|| and or are not equal: || is tighter (see perlop).)

Update (20020303021949)
In my chatterbox nodelet, I read: crazyinsomniac says readdir fails? mention of -MO=Deparse couldn't hurt ;)
So here it is:
2;0 juerd@ouranos:~$ perl -MO=Deparse,-p -e'(@dir) = readdir(ID) || pr +int "X"' (@dir = (readdir(ID) || print('X'))); -e syntax OK

The -p adds extra parens. Documentation can be found at B::Deparse.

++ vs lbh qrpbqrq guvf hfvat n ge va Crey :)
Nabgure bar vs lbh qvq fb jvgubhg ernqvat n znahny svefg.
-- vs lbh hfrq OFQ pnrfne ;)
    - Whreq