my (@foo) = do {
...
return ...
};
держа в голове
my (@foo) = eval {
...
return ...
};
А не надо было в варианте с do использовать return, так как это выход не из do, а из подпрограммы, содержащей do.
:-)
Заметки программиста, в основном, о perl. Название блога происходит от трех главных добродетелей программиста: Лень, Нетерпение и Высокомерие. К некоторым статьям следует относиться с определенной долей юмора. Содержание.
my (@foo) = do {
...
return ...
};
my (@foo) = eval {
...
return ...
};
sub wrand($) {
my $data = shift;
my $total = 0;
$total += $_ foreach values %$data;
my @dist = ();
while (my ($value, $weight) = each %$data) {
push @dist, [$value, $weight / $total];
}
return sub {
my $rand = rand;
foreach (@dist) {
return $$_[0] if ($rand -= $$_[1]) < 0;
}
return $dist[-1][0];
}
}
my %foo = (
# value => weight
"one" => 3,
"two" => 2,
"three" => 1,
);
my $wrand = wrand(\%foo);
print $wrand->(), "\n" for 1 .. 10;
sub iwrand($) {
my $data = shift;
my %dist = ();
while (my ($value, $weight) = each %$data) {
$dist{keys %dist} = $value foreach 1 .. $weight;
}
return sub {
$dist{int rand keys %dist};
};
}
sub sum(&$@);
sub sum(&$@) {
my $sub = shift;
my ($sum, $h, @t) = @_;
if (defined $h) {
sum { $sub->(@_) } $sum + $h, @t;
} else {
$sub->($sum);
}
}
my @vector = 1 .. 5;
sum { print shift } 0, @vector;