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
