#!/usr/bin/perl while () { #($pre, $ranges) = split /=/, $_, 2; ($pre, $ranges, $value) = $_ =~ /^(.+?)=([^ ]+) (.+)$/; $del = "="; @keys = $pre; for $mult (split /:/, $ranges) { @keys = map { $a=$_; map { "$a$del$_" } split /,/, $mult } @keys; $del = ':'; } #@hash{@keys} = ('value2') x @keys; @hash{@keys} = ($value) x @keys; } use Data::Dump 'dd'; dd \%hash; __DATA__ Prefix1=A,B:c,d value1 Prefix2=A:b,c:1,2 value2 Prefix3=A:*:1,2 value3