Tôi đang cố gắng viết một số mã trừu tượng để tìm kiếm thông qua danh sách các đối tượng tương tự cho đối tượng đầu tiên có thuộc tính khớp với các giá trị cụ thể. Để làm điều này, tôi cần phải gọi một loạt các phương thức accessor và kiểm tra tất cả các giá trị của chúng từng cái một. Tôi muốn sử dụng tính trừu tượng như sau:Trong Perl, làm thế nào tôi có thể gọi một phương thức có tên tôi có trong một chuỗi?
sub verify_attribute {
my ($object, $attribute_method, $wanted_value) = @_;
if (call_method($object, $attribute_method) ~~ $wanted_value) {
return 1;
}
else {
return;
}
}
Sau đó, tôi có thể lặp qua băm có khóa là tên phương thức truy cập và giá trị của nó là giá trị tôi đang tìm kiếm cho các thuộc tính đó. Ví dụ, nếu băm đó được gọi là %wanted
, tôi có thể sử dụng mã như thế này để tìm đối tượng tôi muốn:
my $found_object;
FINDOBJ: foreach my $obj (@list_of_objects) {
foreach my $accessor (keys %wanted) {
next FINDOBJ unless verify_attribute($obj, $accessor, $wanted{$accessor});
}
# All attrs verified
$found_object = $obj;
last FINDOBJ;
}
Tất nhiên, vấn đề duy nhất là call_method
không exsit. Hay không? Làm thế nào tôi có thể gọi một phương thức nếu tôi có một chuỗi có chứa tên của nó? Hoặc là có một giải pháp tốt hơn cho toàn bộ vấn đề này?
Ye ah, tôi đã chỉ ra điều này trong một vài seoncds trước đây bằng thử và sai. Mát mẻ. –
Tôi chỉ sử dụng 'Danh sách :: AllUtils'. Hoặc 'Util :: Any qw (: all)'. Nhưng trong mã ví dụ của tôi, tôi cố gắng gắn bó với cốt lõi. –
Tôi tin rằng để làm việc này bạn phải vô hiệu hóa các kiểm tra nghiêm ngặt với 'không nghiêm ngặt;' (không nhất thiết trên toàn cầu) - đúng không? –