ocehb: (Default)
ocehb ([personal profile] ocehb) wrote2006-10-21 10:40 pm
Entry tags:

попытка упрощения кода

столкнулся с неким кодом, который имплементирует итератор по ip адресам:


use IPRange;
my $ip = new IPRange ("254.1.1.1", "254.30.254.254");
while ($ip->next) {
    print $ip->value,"\n";
}



авторский код (удалены несущественные куски):

package IPRange;

sub new {
  my $check = shift;
  my $self = { };
  bless( $self, $class );
  my $start = shift || "1.1.1.1";
  my $last = shift || "255.255.255.255";
  $self->{ START } = $start;
  $self->{ LAST } = $last;
  $self->{ VALUE } = '';
  $self->{ BORD } = 0;
  $self->{ DONE } = 0;
  $self->{ STARTED } = 0;
  return $self;
}

sub value {
  my $self  = shift;
  if (@_) { $self->{ VALUE } = shift; }
  return $self->{ VALUE };
}

sub next {
   my $self = shift;

   if ( !$self->{ STARTED } )
   {
       if ( !$self->{ VALUE } ) { $self->{ VALUE } = $self->{ START } }
       $self->{ STARTED } = 1;
       return $self->{ START };
   }

  if ( !$self->{ DONE } )
  {
      my @four=split(/\./, $self->{ VALUE });
      $four[3]++;

      if ( $self->{ BORD } )
      {
          if ($four[3]==256) { $four[2]++; $four[3]=0; }
          if ($four[2]==256) { $four[1]++; $four[2]=0; }
          if ($four[1]==256) { $four[0]++; $four[1]=0; }
          if ($four[0]==256) { return 0; }
      }

      if ( !$self->{ BORD } )
      {
          if ($four[3]==255) { $four[2]++; $four[3]=1; }
          if ($four[2]==255) { $four[1]++; $four[2]=1; }
          if ($four[1]==255) { $four[0]++; $four[1]=1; }
          if ($four[0]==255) { return 0; }
      }
      $self->{ VALUE }=join('.', @four);
      if ($self->{ LAST } eq $self->{ VALUE }) { $self->{ DONE } = 1; }
  } else { return 0; }
  return $self;
}

1;


а теперь мое:


package IPRange;

sub new ($$$) {
        my ($class,$begin,$end) = @_;
        return bless { 'begin' => $begin,'end' => $end,'first' => 1 },$class;
}

sub next ($) {
        my $self = shift;
        return if ($self->{'begin'} eq $self->{'end'});

        if ($self->{'first'}) {
                $self->{'first'} = 0;
                return $self->{'begin'};
        }

        my @ip = reverse split "\\.",$self->{'begin'};
        foreach (@ip) {
                if (++$_ == 256) { $_ = 0; }
                else { last; }
        }
        return $self->{'begin'} = join ".",reverse @ip;
}

sub value ($) {
        return $_[0]->{'begin'};
}

1;


сравнение скорости:
1. авторский код:
Real: 32.73s User: 32.44s System: 0.09s Percent: 99%% Cmd: perl -MIPRange -e
2. мой код:
Real: 31.66s User: 31.36s System: 0.08s Percent: 99%% Cmd: perl -MIPRange -e

изменились только размеры кода

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org