in reply to `which` (for Windows) in pure perl

File::Which provides a portable implementation for a which function.

Replies are listed 'Best First'.
Re^2: `which` (for Windows) in pure perl
by bart (Canon) on Apr 23, 2006 at 21:09 UTC
    Mine is, essentially, 5 lines of code. A snippet. You can reduce that even more if you don't care about other extensions than the default qw(.exe .com .bat) (the others might not even work). Do you really need a module for that?
    use File::Spec; my @exec = map { my $p = $_; grep { -f and -x } map File::Spec->catfil +e($p, "$f$_"), '', qw(.exe .com .bat) } File::Spec->path or die "Can't find executable $f";

    Oh, and I found a bug in the module:

    #!/usr/bin/perl -wl use File::Which; open OUT, '>complexe'; close OUT; print for which('complexe');
    which prints out
    .\complexe
    The author has forgotten to use quotemeta. The file name matches /.exe$/, but still, it's not a program file name.
      In the expression:
      grep { -f and -x }
      You only need to stat the file once:
      grep { -f and -x _ }

      Your code also looks for 'complexe' (no extension) when asked to look for 'complexe' (because of the empty string you pass to map) so you have the same 'bug'. Your code doesn't output 'complexe' because '-x' compares the extension (again) for you.

      You also suffer from a bug (or perhaps interface contract dispute) in (at least some versions of) File::Spec in that '.' is not returned from File::Spec->path() even though it is unconditionally searched first even if it isn't present in $ENV{PATH}. Perhaps File::Spec->path() is meant to (as documented) only return what is set in $ENV{PATH} rather than returning what would be more useful, the list of directories that would be searched when a command is entered. I'd rather this bug be fixed by updating File::Spec's implementation and documentation, however.

      - tye