Innymi słowy, w jaki sposób mogę sprawdzić koderef "równość"?Jak mogę sprawdzić, czy skalar Perla zawiera odniesienie do określonego podprogramu?
Operator smartmatch nie działa for obvious reasons (by traktować go jako CODE->(ANY)
), ale podaję go w przykładzie pokazać, co jestem po:
use strict;
use warnings;
use feature 'say';
sub pick_at_random {
my %table = @_;
return (values %table)[ rand(keys %table) ];
}
my %lookup = (A => \&foo,
B => \&bar,
C => \&baz);
my $selected = pick_at_random(%lookup);
say $selected ~~ \&foo ? "Got 'foo'" :
$selected ~~ \&bar ? "Got 'bar'" :
$selected ~~ \&baz ? "Got 'baz'" :
"Got nadda" ;
Jestem zaskoczony, że to działa. Chcesz wyjaśnić? – Zaid
@Zaid patrz edycja. – jpalecek
Należy zauważyć, że rozróżni to nawet między wieloma wystąpieniami tego samego zamknięcia, mimo że wywoływany jest ten sam podstawowy kod: 'dla mojego $ a (1..2) {push @x, sub {print $ a}} $ x [ 0](); $ x [1](); print $ x [0]! = $ x [1] '' – ysth