Portál AbcLinuxu, 10. května 2025 02:46
#!/usr/bin/perl -w # # Please don't reject my following questions. I spend lot of time to solve that. I use perl very often # and i know from previous, that Getopt::Long does not like me ;) and if i've needed, i'd used Getopt::Std # or 'write-on-scratch' my own @ARGV parser, but now i am working on fairly large and complex # Perl project and would like to use this, with useful features filled, module. # # q.1) How to order exit program if passed mix(bundled) of correct and incorrect options? # -xV results in 'unknown option: x' message and then is executed version() .. # !solved -- take a look below # # q.2) How to order strictly, that one-letter option !must be passed only with '-', not with '-|--'? # --V :prints version as well as -V .. # --p xx :prints "xx" as well as -pxx|-p xx|--print=xx|--print xx # # To solve this problems, i had tried all possible and impossible parameters for # Getopt::Long::Configure() but with no success. # use strict; use Getopt::Long; ##Subs sub version { print << 'EOF'; this needs no version EOF exit 0; }; # q.3) So, how should i globally configure Getopt::Long, to became options handling exactly as is # described below in usage() func? sub usage { print << 'EOF'; Usage: -V, --version print version message. -?, -h, --help print help message. -p input_str --print=input_str print given string. EOF exit 0; }; ##Body my($version, $usage, $print_input); # When "no_ignore_case" omitted, by some ?magic reasons GetOptions returns # correctly, that '--V' is 'Unknown option'.. # # When: # Getopt::Long::Configure("bundling"); # GetOptions("V" => \$version); # '--V' is interpreted such a 'Unknown option: v' # # And much more strange examples can be made.. Getopt::Long::Configure("bundling", "no_auto_abbrev", "no_ignore_case"); GetOptions( "version|V" => \$version, ## !! called &sub from here will be ## executed even if other opts failed.. ## !! assign $var here, rather then ## call sub, preserves this behaviour.. ## In main documentation, there is not ## lost a word about this and so worst, ## direct calling sub is there advised. "help|h|?" => \$usage, "print|p=s" => \$print_input, ) || die "bad option(s)\n"; ## so, let's call what should be called from here.. &version if $version; &usage if $usage; print "\"$print_input\" passed\n" if $print_input; ## only mark, where script ends print "all done, this is last exit\n"; exit 0; # !! # So my final work-aroud is: # Complete please at least documentation 'man Getopt::Long' with some reference about # this "traps" .. # # Thanks for work-around & # Best Regards
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.