Perl 5 - Iterator

Я реализовал простой итератор в 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;
  };

Есть ли указатели, чтобы ускорить это?

5
задан jonathanpeppers 28 January 2011 в 14:34
поделиться