#! perl -lw use strict; use Data::Dumper; BEGIN{ our %channels; my $channel; while( @ARGV ) { $_ = shift @ARGV; if( m[-channel] ) { $channel = shift @ARGV; push @{ $channels{ $channel } }, {}; next ; } if( m[-([a-z])] ) { $channels{ $channel }[-1]{ $1 } = shift @ARGV; next; } die "Invalid arg '$_'"; } } our %channels; print Dumper \%channels; __DATA__ P:\test>perl 456642.pl -channel 1 -a 1 -b 1 -c 1 -channel 2 -a 2 -c 2 -channel 3 -b 3 -c 17 -channel 1 -a 2 -c 2 $VAR1 = { '1' => [ { 'c' => '1', 'a' => '1', 'b' => '1' }, { 'c' => '2', 'a' => '2' } ], '3' => [ { 'c' => '17', 'b' => '3' } ], '2' => [ { 'c' => '2', 'a' => '2' } ] };