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