my %flagvalues = ( R => ~(2**1 - 1), T => ~(2**2 - 1), B => ~(2**3 - 1), I => ~(2**4 - 1), F => ~(2**5 - 1), L => ~(2**6 - 1), ); sub flagValue { my $weight = ~(2**7 - 1); for (split //, shift){ $weight |= $flagvalues{$_} if exists $flagvalues{$_}; } return ~$weight; }