Я реализовал простой итератор в 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;
};
Есть ли указатели, чтобы ускорить это?