David Storrs <[EMAIL PROTECTED]> writes: > I image we've all written logging code that looks something like this > (Perl5 syntax): > > sub foo { > my ($x,$y) = @_; > note("Entering frobnitz(). params: '$x', '$y'"); > ... > } > > This, of course, throws an 'uninitialized value in concatenation or > string' warning when your test suite does this: > > is( foo(undef, undef), undef, "foo(undef, undef) gives undef" ); > > In a testing environment, I don't want to see this warning. > > In a > production environment, I do. Furthermore, when I want it gone, I > want it gone from every instance of C<note>, without having to change > something in every location. I suppose I could change all my logging > calls to look like this: > > { > if ( $DEBUG ) { no warnings 'uninitialized'; note("...."); } > else { note("...."); } > } > > But that's really ugly, takes up a lot of space, is confusing, and is > redundant. > > How would I best solve this problem in Perl6?
Write an appropriate macro: warns(is( foo(undef, undef), undef, "foo(undef, undef) gives undef"), "uninitialized value in concatenation or string"); That way you get to ensure that the warning gets thrown correctly if undef is passed, but you don't get the warning mucking up your test output.