Portál AbcLinuxu, 10. května 2025 02:46

Dotaz: problem v Perlu s Getopt::Long

21.1.2008 13:03 grudge
problem v Perlu s Getopt::Long
Přečteno: 360×
Odpovědět | Admin
ps. pokladam dotaz v originalnim zneni, jak jsem ho poslal maintainerovi Getopt::Long
#!/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
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.1.2008 13:18 grudge
Rozbalit Rozbalit vše Re: problem v Perlu s Getopt::Long
Odpovědět | | Sbalit | Link | Blokovat | Admin
ps. diky za odpoved a zdravi ntz
21.1.2008 15:49 grudge
Rozbalit Rozbalit vše Re: problem v Perlu s Getopt::Long
ps. slidil jsem na freenode a dozvedel jsem se, ze si budu muset @ARGV asi parsovat sam v pripade nejake slozite veci.. hmm.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.