in reply to 'return:' instead of 'return'

The construct is interpreted as a label, as the following code shows:

sub fn { return: 3; print 'code after return?' }; fn()

As the return value of a function is the last expression evaluated, the value of your constant block, 3, is returned.