[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]

Why was File::Find broken ($topdev)



It seems the new File::Find (and find.pl) are no longer
backward compatible with older scripts that used $topdev.
 (If I should submit this via perlbug, let me know)

I have some perl scripts that were generated long ago with
find2perl, and included -xdev
  (sub wanted was comparing $dev (from the lstat of $_) with $topdev)

Unfortunately, I wrote the scripts before learning to 
consistently use "-w", so I did not detect immediately that $topdev
was no longer initialized!

Anyway, the command line
  find . -xdev -type d -print
prints what I would expect but the 5.005_63 perl find2perl

 find2perl . -xdev -type d -print > /tmp/f2p.out
 perl /tmp/f2p.out

Name "File::Find::topdev" used only once: possible typo at /tmp/f2p.out line 27.
Use of uninitialized value in numeric ne (!=) at /tmp/f2p.out line 26.

By the way perl 5.005_57 didn't have this problem.


Older find.pl's exported $topdev, and even older File/Find.pm's
included the lines

    # Localize these rather than lexicalizing them for backwards
    # compatibility.
    local($topdir,$topdev,$topino,$topmode,$topnlink);

  ... and ...

        (($topdev,$topino,$topmode,$topnlink) =
          ($Is_VMS ? stat($topdir) : lstat($topdir)))
          || (warn("Can't stat $topdir: $!\n"), next);


You will noticed even in lib/perl5/5.00563/find.pl
that these variables are exported:

    *name       = *File::Find::name;
    *prune      = *File::Find::prune;
    *dir        = *File::Find::dir;
    *topdir     = *File::Find::topdir;
    *topdev     = *File::Find::topdev;
    *topino     = *File::Find::topino;
    *topmode    = *File::Find::topmode;
    *topnlink   = *File::Find::topnlink;


although find2perl generates references to
  $File::Find::topdev
directly.



[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]