use Data::Dumper; my $cmd = "dfm host add [ -N ] [ -U -P ] { all | ... | -H ... | -T | -S } "; print "\nCMD : $cmd\n"; my $arg_hash = getCmdParams($cmd); print Dumper ($arg_hash); sub getCmdParams { my $cmd = shift; my @temp = split(/\s+/,$cmd); my (@param,@switch,@arg,@alt_par); my ($line,$alt_cnt); my @mandate = (); my @optional = (); my $alt_line = ""; my %switch_param; my $switch_optional; foreach $line(@temp) { # handle alternate options if ($line =~ /^\{/){ $alt_cnt = 1;next; } $alt_cnt = 0 if ($line =~ /\}$/); #print "\nLINE : $line\nALT_CNT : $alt_cnt \n"; if ($alt_cnt == 1){ $alt_line.= $line; next ; } if ($alt_line ne ""){ print "\nLINE : $line ALT LINE: $alt_line\n"; @alt_par = split(/\|/,$alt_line); print "\nALT PAR LIST\n"; foreach (@alt_par){ print "\nOPTION : $_\n"; if (/.*?(\-[a-zA-Z]){1}.*?\<(.*?)\>/i){ print "HERE: \"$1\", \"$2\"\n"; $switch_optional->{"$1"} = $2; print "\$switch_optional = " . Dumper($switch_optional); @optional = (@optional,$switch_optional); # ----HERE print "\@optional = " . Dumper(\@optional); $switch_param{"optional"} = [@optional]; print "\$switch_param{\"optional\"} = " . Dumper($switch_param{optional}); }elsif(/.*?([a-zA-Z]+).*/i){ print "else HERE: \"$1\"\n"; @optional = (@optional,($1)); print "\@optional = " . Dumper(\@optional); $switch_param{"optional"} = @optional; print "\$switch_param{\"optional\"} = " . Dumper($switch_param{optional}); }else{ } $alt_line =""; next; } } # handles assigning switches to their respective parameters , handles single switches also, handles mandatory parameteres without switches if ($line =~ /^\-[a-zA-Z]{1}/){ #print "\n$line\n";getc(); push (@switch,$line); } if (($line =~ /\<(.*?)\>/g)){ push (@arg,$1); $switch_param{shift @switch} = "" if ((scalar @switch) > 1); $switch_param{shift @switch} = pop @arg unless ((scalar @switch) == 0); } $switch_param{shift @switch} = "" if ((scalar @switch) > 1); $switch_param{"mandatory"} = [(@mandate,@arg)] if ((scalar @arg) > 0); } return \%switch_param; }