Я реализовал простой итератор в Perl. Я обычно работаю с C # и довольно часто использую итераторы и функциональное программирование. Поэтому я подумал, что было бы легко получить некоторые основы, работающие в Perl.
Проблема в том, что у меня плохая производительность, я не ожидаю, что будет быстрее, чем для или foreach , но я подумал, что кто-то может дать мне некоторое представление о чтобы ускорить его.
Вот смелость моей посылки:
package Iterator;
use strict;
#Constructor for Iterator type
sub new {
my $type = $_[0];
my $this = {};
#set default values
$this->{Array} = @_[1];
$this->{Index} = 0;
$this->{Sub} = sub {
my @array = @{$this->{Array}};
return $#array >= $this->{Index} ? $array[$this->{Index}++] : undef;
};
#return self
bless($this, $type);
return $this;
}
#Iterates next
sub Next {
return $_[0]->{Sub}->();
}
Позволяет вам сделать это:
my $iterator = Iterator->new(\@array);
while (defined(my $current = $iterator->Next())) {
print $current, "\n";
}
Не бросается в глаза ... пока.
Также включает некоторый функциональный код, подобный этому:
my $sum = 0;
Iterator
->new(\@array)
->Where(sub { $_[0] % 2 == 0 })
->ForEach(sub { $sum += $_[0] });
Что суммирует все четные значения массива.
Моим узким местом является код итерации:
$this->{Sub} = sub {
my @array = @{$this->{Array}};
return $#array >= $this->{Index} ? $array[$this->{Index}++] : undef;
};
Какие-нибудь указатели, чтобы ускорить это?