Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Comment on

( #3333=superdoc: print w/replies, xml ) Need Help??

First off, love your new sig - 'Swiss Army Nerd Idiot' ;-)

I use Windows (XP with Activestate 5.10.1) all the time for my Perl development. I believe when Windows gets a program name without extension (your example was 'perl'), the 'search' is similar to the following pseudo-code:

PROGRAM = perl PATH = '.' + %PATH% foreach PATH in %PATH% { foreach EXTENSION in %PATHEXT% { TRY PATH\perl.EXTENSION } }

That is to say, search the local directory first, even if it isn't in your path (you won't see '.' when you type 'path' from cmd.exe). Try appending each extension in the %PATHEXT% environment variable to the program name and search current directory followed by each directory in your path.

Values of %PATH% and %PATHEXT% can be found by:

C:\> set PATH

This is *WAY* beyond Perl scope, but a nifty batch file I found and modified (I would give credit if only I remembered where I found this, Google 'which.bat' and a few different sites with different versions of this come up) acts much like the 'which' command on Unix. Save as 'which.bat' and put it in a directory in your %PATH% environment variable.

@echo off setlocal REM REM Help REM if {%1}=={/?} goto HELP if {%1}=={--help} goto HELP REM REM Check args REM if {%1}=={} goto SYNTAX_ERROR if not {%3}=={} goto SYNTAX_ERROR REM REM Start Get ARGS REM :ARGS if {%1}=={} goto EXECUTE set string=%1 REM REM If the first character in arg is a -, it's a switch REM if "!string:~0,1!"=="-" ( set position=0 :LOOP REM REM If the character indicated by the string is a space, ech +o a return; REM else, just echo the character REM if "!string:~%position%,1!"=="" goto SLIDE if "!string:~%position%,1!"=="a" set WHICHALL=YES&& goto INCR if "!string:~%position%,1!"=="-" goto INCR echo %0: unknown option -- "!string:~%position%,1!" :INCR REM REM Increment the position in the string and loop REM set /a position=%position%+1 goto LOOP ) else set batchparams=%1 :SLIDE shift goto ARGS REM ------------------------------------------------------- :EXECUTE set errorlevel_=0 set program_=%batchparams% :: Any input with wildcard or path characters is a syntax error. for /F %%i in ('echo ":" ^& echo "\" ^& echo "*" ^& echo "/" ^& echo " +?" ^& echo "," ^& echo ";"') do ( echo %program_% | find %%i > nul && goto SYNTAX_ERROR ) :: This variable stores the current directory, followed by PATH, as :: the search order to search for program files. Quotes are added :: between each ';' to handle paths with spaces. set path_="%cd%";"%PATH:;=";"%" :: Lowercase the path extensions. This is needed to perform :: case-insensitive extension comparisons. set path_ext_=%PATHEXT% set path_ext_=%path_ext_:A=a% set path_ext_=%path_ext_:B=b% set path_ext_=%path_ext_:C=c% set path_ext_=%path_ext_:D=d% set path_ext_=%path_ext_:E=e% set path_ext_=%path_ext_:F=f% set path_ext_=%path_ext_:G=g% set path_ext_=%path_ext_:H=h% set path_ext_=%path_ext_:I=i% set path_ext_=%path_ext_:J=j% set path_ext_=%path_ext_:K=k% set path_ext_=%path_ext_:L=l% set path_ext_=%path_ext_:M=m% set path_ext_=%path_ext_:N=n% set path_ext_=%path_ext_:O=o% set path_ext_=%path_ext_:P=p% set path_ext_=%path_ext_:Q=q% set path_ext_=%path_ext_:R=r% set path_ext_=%path_ext_:S=s% set path_ext_=%path_ext_:T=t% set path_ext_=%path_ext_:U=u% set path_ext_=%path_ext_:V=v% set path_ext_=%path_ext_:W=w% set path_ext_=%path_ext_:X=x% set path_ext_=%path_ext_:Y=y% set path_ext_=%path_ext_:Z=z% :: If the program name has an extension, we want to verify that the :: extension is one of those in the path_ext_ environment variable. :: If it is, then this script will only search for that program with :: that specific extension. If not, all of the extensions in the :: path_ext_ variable will be tested, appended to the program name. :: Get the extension if any from the program name. for /F %%i in ("%program_%") do (set extension_=%%~xi) :: Comparing the program extension against the list of executable :: extensions. If the extension is found, then path_ext_ will just :: have that extension. set path_ext_=%path_ext_:;= % if not {%extension_%}=={} ( for %%i in (%path_ext_%) do if "%%i"=="%extension_%" ( set path_ext_=%extension_% for /F %%i in ("%program_%") do (set program_=%%~ni) ) ) :: This will prepend a path prefix to the program name and append an :: executable extension for every path and extension found in the :: path_ and path_ext_ variables. for %%i in (%path_%) do ( for %%j in (%path_ext_%) do ( if exist "%%~i\%program_%%%~j" ( set found_=%%~i\%program_%%%~j if {%WHICHALL%}=={YES} echo !found_! if not {%WHICHALL%}=={YES} goto FOUND ) ) ) if "%found_%"=="" echo '%batchparams%' not found. goto END :FOUND echo %found_% goto END :SYNTAX_ERROR echo which: The syntax of the command is incorrect. 1>&2 goto ERROR :ERROR set errorlevel_=1 :END exit /B %errorlevel_% :HELP echo. echo %0 will find the program file that is used when run from echo a DOS prompt. It will search the current directory and the echo PATH environment variable directories for the program using echo the extensions found in the PATHEXT environment variable. echo. echo USAGE: echo. echo %0 [options] ^<program^> echo. echo -a Print all matches in order; don't stop at first +. echo. echo program An external command, program, or script. echo. echo If you want to find a program with a particular extension, echo include that extension in the program name and the 'which' echo command will only search for a program file with that extensi +on. echo.

Now, from cmd.exe:

\\vmware-host\Shared Folders Z:\mvincent\tmp> which perl Z:\mvincent\tmp\perl.bat \\vmware-host\Shared Folders Z:\mvincent\tmp> which -a perl Z:\mvincent\tmp\perl.bat C:\Perl\bin\perl.exe

In reply to Re: One Bizarre Perl Problem by VinsWorldcom
in thread One Bizarre Perl Problem by jedikaiti

Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?

    What's my password?
    Create A New User
    and all is quiet...

    How do I use this? | Other CB clients
    Other Users?
    Others drinking their drinks and smoking their pipes about the Monastery: (4)
    As of 2018-02-18 07:50 GMT
    Find Nodes?
      Voting Booth?
      When it is dark outside I am happiest to see ...

      Results (251 votes). Check out past polls.