ワンライナー・ダイス

誰得。

正規表現で12d3を置換するだけ。

my $dice = "3d4";
$dice =~ s/(\d+)d(\d+)/my $s = $1; $s += int rand $2 for 1 .. $1; $s/ie;
print $dice;   # ex. 7

ただしfor (foreach)でこっそり$_を使っている。この置換の前後で$_を維持したいときは、s///;の右側にlocal $_を加えるか、変数を明示してループを組まなければならない。

関数として組むときは、ワンライナーを捨てる方が簡単にできる。

sub dice {
  my($k, $n) = shift =~ /(\d+)d(\d+)/;
  my $s = $k;
  $s += int rand $n for 1 .. $k;
  return $s;
}