Mit anderen Worten, wie kann ich für Coderef "Gleichheit" überprüfen?Wie kann ich überprüfen, ob ein Perl-Skalar einen Verweis auf eine bestimmte Subroutine enthält?
Das Smartmatch Operator funktioniert nicht for obvious reasons (würde es als CODE->(ANY)
behandeln), aber ich habe es in dem Beispiel enthalten zu zeigen, was mich nach:
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" ;
Ich bin überrascht, dass das funktioniert. Möchten Sie das erklären? – Zaid
@Zaid siehe bearbeiten. – jpalecek
Beachten Sie, dass dadurch sogar zwischen mehreren Instanzen desselben Closures unterschieden wird, obwohl derselbe zugrunde liegende Code aufgerufen wird: 'for my $ a (1..2) {push @x, sub {print $ a}} $ x 0](); $ x [1](); drucken $ x [0]! = $ x [1] '' – ysth