#!/usr/bin/perl # a starting skeleton for using Getopt::Long use strict; use warnings; use Getopt::Long; use Data::Dumper; #use Devel::Comments; # uncomment this during development to enable the ### debugging statements our %ARGV; GetOptions( \%ARGV, map {"$_:s"} # all arguments are optional, like Getopt::Casual "help|h|?", # this help text "current|c", # act upon current branch only "remote|r", # compare with remote only; do not compare local-to-local branches "max_diff|md", # max diff (default 100; see below for details) "ff", # don't just check, try to fast forward also ) or usage(); %ARGV = map {length()?$_:1} %ARGV; # arguments are optional $ARGV{help} and usage(); die Dumper \%ARGV; sub usage { print "Usage: test_program.pl \n"; usage_getopt(); exit; } # Poor-man's self-documenting arguments, like Getopt::Lazy or Getopt::Long::Descriptive, # but works with the stock Getopt::Long. # The per-argument documentation comes from the source code comments. # # It greps the source code, so it's somewhat brittle and relies on a specific format: # - the first line starts with "GetOptions(" # - arguments should be on separate lines # - the last line starts with ")" sub usage_getopt { @ARGV = ($0); while (<>) { next if !(/^\s*GetOptions/ .. /^\s*\)/) || /^\s*(GetOptions|\)|map)/; printf " %-30s", /['"](.*?)['"]/ ? join( ", ", map { s/[=:][sif]$//; /../ ? "--$_" : "-$_" } split /\|/, $1 ) : ''; /.*#/#/ and print or print "\n"; } }