こりずにfizzbuzz

  1. クロージャ化:ループ変数からの独立
  2. パラメータのハッシュ化:'fizz'を'pizz'に変えたいときでも、引数の変更で対応できる。また、2の倍数の時が増えても対応できる
sub create_fizzbuzz{
  my ($p) = @_;
  my %count;
  my $n = 1;
  return sub{
    my $str = '';
    foreach my $k (sort keys %$p){
      $count{$k}++;
      if ( $count{$k} < $k ){
        $str .= '';
      }else{
        $str .= $p->{$k};
        $count{$k} = 0;
      }
    }
    $str ||= $n;
    $n++;
    return $str;
  };
};

※ 昨晩思いついたものと同じく、配列用意してやってたけど、不要なので削除した

実行するとき

my $fizzbuzz = create_fizzbuzz({
  3=>'fizz',
  5=>'buzz'
});

for(my $i=0;$i<100;$i++){
  print $fizzbuzz->()."\n";
}

2の倍数で「piyo」が増えたとき

my $fizzbuzz = create_fizzbuzz({
  3=>'fizz',
  5=>'buzz',
  2=>'piyo'
});

for(my $i=0;$i<100;$i++){
  print $fizzbuzz->()."\n";
}

※ buzzfizzと表示されるようだったので、ハッシュを数値=>文字列で作るよう変更