Why doesn't this Windows .cmd script pick up the -z command line switch:

It does. Try the following code with the argument of -z passed through from the outside:

@rem = '--*-Perl-*-- @echo off perl -x "%~dpnx0" %* goto endofperl @rem '; #!perl use strict; use warnings; print "\$ARGV[$_]= $ARGV[$_]\n" for 0..$#ARGV; use Getopt::Std; my %opts = (); getopt( 'z', \%opts); print "exists z\n" if exists $opts{'z'}; print "defined z='$opts{'z'}'\n" if defined $opts{'z'}; print "\$opts{z} is true" if $opts{'z'}; __END__ :endofperl

You will see that the -z is correctly propagated from the batch wrapper into perl. You will also see that $opts{'z'} exists, but contains an undefined value. It looks like from the documentation this behaviour is incorrect, and that it should in fact set $opts{'z'} to be true in this situation. It also looks like this behaviour has been fixed in a later version of Getopt::Std. The 5.8.1 version doesnt have this problem, the 5.6.1 version does. UPDATE: No im wrong here, changes were made to this module between 5.6.1 and 5.8.1 but they dont cover this issue.

Incidentally the reason this worked in your second variant is because the second -z is being treated as the value for the first -z option. IOW, $opts{'z'} eq '-z' in the second case, and !defined $opts{'z'} and exists($opts{'z'}) is true in the first.

I feel entitled to be a little critical here. It didnt take long to determine this was a fault in Getopt::Std, nor to identify and fix the bug. Next time I suggest you be a bit more thorough in your testing and debugging. Also you may find that Getopt::Long while a bit intimidating to look at the first time actually is a more flexible and powerful tool for this job. It certainly wouldnt have left you as confused about this as Getop::Std has done.

HTH


---
demerphq

    First they ignore you, then they laugh at you, then they fight you, then you win.
    -- Gandhi



In reply to Re: Passing switches through pl2bat scripts by demerphq
in thread Passing switches through pl2bat scripts by PhilHibbs

Title:
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, details, 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, summary, 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.