Вы можете выполнить достаточно похожий синтаксис в Perl, если совершите автозагрузку взлома.
Создайте небольшой пакет для обработки автозагрузки:
package Autoloader;
use strict;
use warnings;
our $AUTOLOAD;
sub AUTOLOAD {
my $self = shift;
my ($method) = (split(/::/, $AUTOLOAD))[-1];
die "Object does not contain method '$method'" if not ref $self->{$method} eq 'CODE';
goto &{$self->{$method}};
}
1;
Тогда ваш другой пакет или основной скрипт будет содержать подпрограмму, которая возвращает благословенный объект, который обрабатывается Autoload, когда его метод пытается вызвать.
sub element {
my $elem = shift;
my $sub = {
in => sub {
return if not $_[0];
# you could also implement this as any of the other suggested grep/first/any solutions already posted.
my %hash; @hash{@_} = ();
return (exists $hash{$elem}) ? 1 : ();
}
};
bless($sub, 'Autoloader');
}
Это оставляет вас с использованием, похожим на:
doTask if element('something')->in(@array);
Если вы реорганизуете замыкание и его аргументы, вы можете переключить синтаксис другим способом, чтобы он выглядел следующим образом, что немного ближе к стилю autobox:
doTask if search(@array)->contains('something');
функция для этого:
sub search {
my @arr = @_;
my $sub = {
contains => sub {
my $elem = shift or return;
my %hash; @hash{@arr} = ();
return (exists $hash{$elem}) ? 1 : ();
}
};
bless($sub, 'Autoloader');
}