>>53
やってることは >>59 と同じだが。

use List::Util (sum first);

%data = ( a => 3, b => 2 c =>1 );
$idx = rand(sum values %data);
$select = first { ($idx-=$data{$_}) < 0 } keys %data;

>>58
セキュリティつうか、$param{mode} が foo, bar, baz 以外だったらエラーで落ちるけどいいの?
基本は外からやってくる値は信用しない、だと思う。