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); }