Bueno, esta es otra forma de hacerlo, un poco más corta, pero espero que no sea muy complicada... te la numero por líneas y te la comento al final.
- Código: Seleccionar todo
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 @ARGV or die "Uso: $0 <campo a buscar>\n";
6 my $valor = $ARGV[0];
7
8 my $fichero = "kk.txt";
9 open FICHERO, '<', $fichero
10 or die "Error: No se pudo abrir el fichero $fichero: $!\n";
11 my @config = <FICHERO>;
12 chomp(@config);
13 close FICHERO;
14
15 if ( my @encontrados = buscar( $valor ) ) {
16 print "Encontrado $valor: @encontrados\n"
17 } else {
18 print "No se encontró $valor en ninguna línea.\n"
19 }
20
21 sub buscar {
22 my $campo_a_buscar = shift @_;
23 my @encontrados;
24 my @campos;
25
26 foreach my $linea ( @config ) {
27 @campos = split(' ', $linea); # Obtenemos los dos campos de la línea
28 next # Miramos siguiente línea...
29 unless @campos == 2; # ...si el número de campos no es 2
30
31 push @encontrados, $campos[1] # Almacenamos el segundo campo...
32 if $campos[0] eq $campo_a_buscar; # ...si hemos encontrado el primero
33 }
34
35 return @encontrados;
36 }
37
* Las 3 primeras líneas son como -casi- siempre, las mismas
* En las líneas 5 y 6, nos leemos el término a buscar
* De la 8 a 13, nos leemos el
$fichero y lo guardamos en
@config. Aprovechamos para quitar (
chomp) los finales de línea a todas las líneas
* En la 15 buscamos el
$valor y lo guardamos en
@resultados. Si el número de elementos devueltos es superior a 1, se cumple la condición cierta del if y pinta la línea 16. Sino, la 18
* En la 26, usamos un bucle
foreach, porque vamos a recorrer todas las líneas. Cada una se queda almacenada, dentro del bucle, en la variable
$linea* En la siguiente, dividimos (
split) la
$linea en
@campos separados por ' ' (un espacio en blanco, que equivale a cualquier número de espacios, tabuladores, etc)
* Si no hemos encontrado exactamente dos campos (línea 29) termina el actual bucle foreach y lo intenta con la siguiente (
next)
$linea (línea 28)
* En la 31 y 32, si hemos encontrado el mismo (eq)
$campo_a_buscar que el primer campo (
$campo[0])...
* ... metemos (
push) en
@resultados el valor del segundo campo (
$campo[1])
* En la 35, devolvemos (
return) todos los valores
@encontrados.