Un Ejemplo de uso de Referenciado Simbólico: La función can

El ejemplo que sigue muestra un pequeño intérprete. El usuario llama al programa con un comando y un glob que especifica un conjunto de ficheros.

lhp@nereida:~/Lperl/src/perl_testing_adn_examples/chapter_09$ symbolic.pl dirs /p*
/pendriver
/proc
lhp@nereida:~/Lperl/src/perl_testing_adn_examples/chapter_09$ symbolic.pl latest *
symbolic.pl
lhp@nereida:~/Lperl/src/perl_testing_adn_examples/chapter_09$ symbolic.pl sort_by_time *.pl
symbolic.pl
simplecalc.pl
make_test_files.pl
filefilter.pl
lhp@nereida:~/Lperl/src/perl_testing_adn_examples/chapter_09$ symbolic.pl chuchu *.pl
Unknown command 'chuchu'
Para cada comando el programa implanta una función de filtro e imprime el resultado del filtro.
lhp@nereida:~/Lperl/src/perl_testing_adn_examples/chapter_09$ cat -n symbolic.pl
 1  #!/usr/local/bin/perl
 2  use strict;
 3  use warnings;
 4
 5  main( @ARGV );
 6
 7  sub main {
 8      die "Usage:\n$0 <command> [file_pattern]\n" unless @_;
 9      my $command = shift;
10
11      die "Unknown command '$command'\n" unless  main->can( $command );
12
13      no strict 'refs';
14      my @r = $command->( @_ );
15      local $" = "\n";
16      print "@r\n";
17  }
18
19  sub sort_by_time {
20      map  { $_->[0] }
21      sort { $a->[1] <=> $b->[1] }
22      map  { [ $_, -M $_ ] } @_
23  }
24
25  sub latest {
26      (sort_by_time( @_ ) )[0];
27  }
28
29  sub dirs {
30      grep { -d $_ } @_;
31  }
La principal novedad en este código se refiere al control (línea 11) de que comandos están disponibles. La función can puede ser llamada de la forma:

paquete->can('nombre_de_subrutina')

devuelve cierto si existe una subrutina con ese paquete y falso en caso contrario. De hecho devuelve una referencia (dura/no simbólica) a la subrutina si esta existe.

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