Nói cách khác, làm thế nào tôi có thể kiểm tra coderef "bình đẳng"?Làm cách nào để kiểm tra xem liệu một vô hướng Perl có tham chiếu đến một chương trình con nhất định không?
Nhà điều hành smartmatch không hoạt động for obvious reasons (sẽ đối xử với nó như CODE->(ANY)
), nhưng tôi đã bao gồm nó trong ví dụ này để hiển thị những gì tôi sau:
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" ;
Tôi rất ngạc nhiên khi công trình này hoạt động. Quan tâm để giải thích? – Zaid
@Zaid xem chỉnh sửa. – jpalecek
Lưu ý rằng điều này sẽ phân biệt ngay cả giữa nhiều phiên bản của cùng một đóng, mặc dù cùng một mã cơ bản được gọi là: 'cho $ a (1..2) {push @x, sub {print $ a}} $ x [ 0](); $ x [1](); in $ x [0]! = $ x [1] '' – ysth