Detectando Ciclos

El módulo Devel::Cycle permite la detección de ciclos:
lhp@nereida:~/Lperl/src/testing$ cat -n ciclos.pl
     1  #!/usr/local/bin/perl -w
     2  use strict;
     3  use Devel::Cycle;
     4  my $test = {
     5    fred   => [qw(a b c d e)],
     6    ethel  => [qw(1 2 3 4 5)],
     7    george => {martha => 23, agnes  => 19}
     8  };
     9  $test->{george}{phyllis} = $test;
    10  $test->{fred}[3]      = $test->{george};
    11  $test->{george}{mary} = $test->{fred};
    12  find_cycle($test);
    13  exit 0;
lhp@nereida:~/Lperl/src/t
Al ejecutar produce una salida como esta:
lhp@nereida:~/Lperl/src/testing$ ./ciclos.pl
Cycle (1):
                          $A->{'fred'} => \@B
                               $B->[3] => \%C
                          $C->{'mary'} => \@B

Cycle (2):
                          $A->{'fred'} => \@B
                               $B->[3] => \%C
                       $C->{'phyllis'} => \%A

Cycle (3):
                        $A->{'george'} => \%C
                          $C->{'mary'} => \@B
                               $B->[3] => \%C

Cycle (4):
                        $A->{'george'} => \%C
                       $C->{'phyllis'} => \%A

El módulo permite comprobar la existencia de ciclos con referencias débiles mediante la función find_weakened_cycle . El programa:

lhp@nereida:~/Lperl/src/testing$ cat -n ciclosweaken.pl
 1  #!/usr/local/bin/perl -w
 2  use strict;
 3  use Scalar::Util qw(weaken);
 4  use Devel::Cycle;
 5  my $test = {
 6    fred   => [qw(a b c d e)],
 7    ethel  => [qw(1 2 3 4 5)],
 8    george => {martha => 23, agnes  => 19}
 9  };
10  $test->{george}{phyllis} = $test;
11  $test->{fred}[3]      = $test->{george};
12  $test->{george}{mary} = $test->{fred};
13  weaken($test->{george}->{phyllis});
14  find_weakened_cycle($test);
15  exit 0;

Produce la salida:

lhp@nereida:~/Lperl/src/testing$ ciclosweaken.pl
Cycle (1):
                          $A->{'fred'} => \@B
                               $B->[3] => \%C
                          $C->{'mary'} => \@B

Cycle (2):
                          $A->{'fred'} => \@B
                               $B->[3] => \%C
                   w-> $C->{'phyllis'} => \%A

Cycle (3):
                        $A->{'george'} => \%C
                          $C->{'mary'} => \@B
                               $B->[3] => \%C

Cycle (4):
                        $A->{'george'} => \%C
                   w-> $C->{'phyllis'} => \%A

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19