in reply to Re: `which` (for Windows) in pure perl
in thread `which` (for Windows) in pure perl

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.

Replies are listed 'Best First'.
Re^3: `which` (for Windows) in pure perl
by jwkrahn (Abbot) on Apr 23, 2006 at 21:20 UTC
    In the expression:
    grep { -f and -x }
    You only need to stat the file once:
    grep { -f and -x _ }
Re^3: `which` (for Windows) in pure perl (bugs)
by tye (Sage) on Apr 24, 2006 at 14:53 UTC

    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