use constant MAX_VERBOSITY => 5; sub vprint { # Or whatever. our $msg; local *msg = \($_[0]); print("$msg\n"); } BEGIN { my $verbosity = $ARGV[0] || 0; # Or whatever my $eval = ''; for (1..MAX_VERBOSITY) { $eval .= ($_ <= $verbosity ? "*vprint$_ = \&vprint;\n" : "use constant vprint$_ => 1;\n" ); } eval $eval."1;\n" or die $@; } vprint1("msg1"); # Optimized away if arg is < 1 vprint2("msg2"); # Optimized away if arg is < 2 vprint3("msg3"); # Optimized away if arg is < 3 vprint4("msg4"); # Optimized away if arg is < 4 vprint5("msg5"); # Optimized away if arg is < 5