my @EXPORTS=qw(DBG_ONE, DBG_TWO, DBG_FOUR); Readonly my DBG_ONE => 1; Readonly my DBG_TWO => 2; Readonly my DBG_FOUR => 4; foreach $flag (@EXPORTS) { printf "flag = %s, value = 0x%04x\n", $flag, ${$flag}; } #### my $bit=0; sub bit(){ my $s=2**$bit; ++$bit; $s; } sub dbg_flag ($) { my $flag=shift; eval sprintf ( "Readonly my \$$flag => 0x%04x push \@EXPORTS, \$$flag sub $flag () {\$_debug_ops & $\$flag}",$$flag ); } #then use it with something like @myflags=qw{DBG_ONE,DBG_TWO...}; foreach $flag (@myflags) { dbg_flag($flag); }