ワンライナー・ダイス
誰得。
正規表現で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; }