In altre parole, come posso verificare la presenza di "uguaglianza" di coder?Come posso verificare se uno scalare Perl contiene un riferimento ad una determinata subroutine?
L'operatore SmartMatch non funziona for obvious reasons (sarebbe trattarlo come CODE->(ANY)
), ma ho incluso nel esempio per mostrare quello che sto cercando:
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" ;
Sono sorpreso che questo funziona. Cura di spiegare? – Zaid
@Zaid vedi modifica. – jpalecek
Si noti che questo si distinguerà anche tra più istanze della stessa chiusura, anche se lo stesso codice sottostante è chiamato: 'per il mio $ a (1..2) {push @x, sub {print $ a}} $ x [ 0](); $ x [1](); stampa $ x [0]! = $ x [1] '' – ysth