Perl token bucket rate limiter

Perl
use strict;
use warnings;
use Time::HiRes qw(time);

sub token_bucket {
    my ($rate, $burst) = @_;
    my ($tokens, $ts) = ($burst, time());
    return sub {
        my ($n) = @_;
        $n //= 1;
        my $now = time();
        $tokens += ($now - $ts) * $rate;
        $tokens = $burst if $tokens > $burst;
        $ts = $now;
        return 0 if $tokens < $n;
        $tokens -= $n;
        return 1;
    };
}
my $take = token_bucket(2, 3);
print $take->() ? "allowed\n" : "throttled\n" for 1 .. 5;