This patch makes File::Find use a new warning category (via warnings::register) for its warning messages, so it's possible to disable them (by "no warnings 'File::Find'") without disabling all warnings.
--- lib/File/Find.pm.orig Fri Oct 19 22:58:16 2001 +++ lib/File/Find.pm Fri Nov 2 15:05:38 2001 @@ -2,7 +2,8 @@ use 5.006; use strict; use warnings; -our $VERSION = '1.03'; +use warnings::register; +our $VERSION = '1.04'; require Exporter; require Cwd; @@ -190,6 +191,17 @@ See also the script C<pfind> on CPAN for a nice application of this module. +=head1 WARNINGS + +If you run your program with the C<-w> switch, or if you use the +C<warnings> pragma, File::Find will report warnings for several weird +situations. You can disable these warnings by putting the statement + + no warnings 'File::Find'; + +in the appropriate scope. See L<perllexwarn> for more info about lexical +warnings. + =head1 CAVEAT =over 2 @@ -452,7 +464,7 @@ return undef unless defined $DEV; # dangling symbolic link } - if ($full_check && $SLnkSeen{$DEV, $INO}++) { + if ($full_check && defined $DEV && $SLnkSeen{$DEV, $INO}++) { if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) { die "$AbsName encountered a second time"; } @@ -542,7 +554,8 @@ else { $abs_dir = contract_name_Mac($cwd, $top_item); unless (defined $abs_dir) { - warn "Can't determine absolute path for $top_item (No such file or directory)\n" if $^W; + warnings::warnif __PACKAGE__, + "Can't determine absolute path for $top_item (No such file +or directory)\n"; next Proc_Top_Item; } } @@ -565,7 +578,8 @@ if (ref $dangling_symlinks eq 'CODE') { $dangling_symlinks->($top_item, $cwd); } else { - warn "$top_item is a dangling symbolic link\n" if $^W; + warnings::warnif __PACKAGE__, + "$top_item is a dangling symbolic link\n"; } } next Proc_Top_Item; @@ -579,7 +593,7 @@ else { # no follow $topdir = $top_item; unless (defined $topnlink) { - warn "Can't stat $top_item: $!\n" if $^W; + warnings::warnif __PACKAGE__, "Can't stat $top_item: $!\n"; next Proc_Top_Item; } if (-d _) { @@ -616,7 +630,7 @@ } unless ($no_chdir || chdir $abs_dir) { - warn "Couldn't chdir $abs_dir: $!\n" if $^W; + warnings::warnif __PACKAGE__, "Couldn't chdir $abs_dir: $!\n"; next Proc_Top_Item; } @@ -684,7 +698,7 @@ } } unless (chdir $udir) { - warn "Can't cd to $udir: $!\n" if $^W; + warnings::warnif __PACKAGE__, "Can't cd to $udir: $!\n"; return; } } @@ -727,10 +741,13 @@ } unless (chdir $udir) { if ($Is_MacOS) { - warn "Can't cd to ($p_dir) $udir: $!\n" if $^W; + warnings::warnif __PACKAGE__, + "Can't cd to ($p_dir) $udir: $!\n"; } else { - warn "Can't cd to (" . ($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n" if $^W; + warnings::warnif __PACKAGE__, + "Can't cd to (" . ($p_dir ne '/' ? $p_dir : '') . + "/) $udir: $!\n"; } next; } @@ -745,7 +762,7 @@ # Get the list of files in the current directory. unless (opendir DIR, ($no_chdir ? $dir_name : $File::Find::current_dir)) { - warn "Can't opendir($dir_name): $!\n" if $^W; + warnings::warnif __PACKAGE__, "Can't opendir($dir_name): $!\n"; next; } @filenames = readdir DIR; @@ -914,7 +931,7 @@ } $ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir); unless ($ok) { - warn "Can't cd to $updir_loc: $!\n" if $^W; + warnings::warnif __PACKAGE__, "Can't cd to $updir_loc: $!\n"; return; } } @@ -931,7 +948,8 @@ # change (back) to parent directory (always untainted) unless ($no_chdir) { unless (chdir $updir_loc) { - warn "Can't cd to $updir_loc: $!\n" if $^W; + warnings::warnif __PACKAGE__, + "Can't cd to $updir_loc: $!\n"; next; } } @@ -962,7 +980,7 @@ } } unless (chdir $updir_loc) { - warn "Can't cd to $updir_loc: $!\n" if $^W; + warnings::warnif __PACKAGE__, "Can't cd to $updir_loc: $!\n"; next; } } @@ -975,7 +993,7 @@ # Get the list of files in the current directory. unless (opendir DIR, ($no_chdir ? $dir_loc : $File::Find::current_dir)) { - warn "Can't opendir($dir_loc): $!\n" if $^W; + warnings::warnif __PACKAGE__, "Can't opendir($dir_loc): $!\n"; next; } @filenames = readdir DIR; @@ -1020,7 +1038,8 @@ if ( $byd_flag < 0 ) { # must be finddepth, report dirname now unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted - warn "Can't cd to $updir_loc: $!\n" if $^W; + warnings::warnif __PACKAGE__, + "Can't cd to $updir_loc: $!\n"; next; } }