• Publicidad

Duda con Funciones

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Duda con Funciones

Notapor BigBear » 2013-07-10 13:58 @624

Hola, tengo un problema con el siguiente código. El problema es que no me devuelve los enlaces que le pido a las dos funciones. Probé sacando download_all() y hacer lo mismo y sí funciona, pero el problema es que cuando está en la función no devuelve nada.

¿ Alguien me podría explicar por qué?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use LWP::UserAgent;
  2. use URI::Split qw(uri_split);
  3. use HTML::LinkExtor;
  4.  
  5. my $nave = LWP::UserAgent->new;
  6. $nave->agent( "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12" );
  7. $nave->timeout(10);
  8.  
  9. download_all("http://localhost/test.php");
  10.  
  11. sub download_all {
  12.  
  13.     my $page = "http://localhost/test.php";
  14.  
  15.     my $code = toma($page);
  16.     chomp $code;
  17.  
  18.     my @links_all = get_links($code);
  19.  
  20.     print "paso";
  21.  
  22.     for my $page_down (@links_all) {
  23.         print $page_down. "\n";
  24.  
  25.         #download_this($page_down);
  26.     }
  27.  
  28. }
  29.  
  30. sub toma {
  31.     return $nave->get( $_[0] )->content;
  32. }
  33.  
  34. sub get_links {
  35.  
  36.     $test = HTML::LinkExtor->new( \&agarrar )->parse($code);
  37.     return @links;
  38.  
  39.     sub agarrar {
  40.         my ( $a, %b ) = @_;
  41.         push( @links, values %b );
  42.     }
  43. }
  44.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Duda con Funciones

Notapor explorer » 2013-07-10 14:38 @651

Creo que el problema está en que la variable $code está definida y declarada dentro de download_all(), y cuando el programa llega a get_links(), le dices que use la variable $code, pero Perl no sabe dónde está definida esa variable.

Si usases 'warnings', Perl te avisaría de estos casos.

Prueba con esta línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $code = shift;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De todas maneras... ¿no estás usando demasiadas subrutinas? Para un proceso tan sencillo como ese, no necesitas ni siquiera una.

El peligro de usar subrutinas es que luego puedes tener problemas por usar variables globales.
El uso de variables globales dificulta la legibilidad del código fuente. Dado que en cualquier parte del programa y en todo momento se puede cambiar el valor de la variable, para entender el uso de la variable suele ser necesario tener que comprender el funcionamiento de una parte amplia del programa. También dificultan la separación del código en bibliotecas, ya que muchos sistemas (como por ejemplo DLL) no soportan la visualización directa de variables globales en otros módulos. Wikipedia: Variables globales

Y luego lo intentas arreglar pasando argumentos a las funciones. Y al final queda un lío como por ejemplo la línea 31, donde usas tanto un argumento ($_[0]) como una variable global ($nave).

Si vas a usar variables globales, defínelas al principio del programa.
Si vas a usar argumentos entre funciones, recógelos nada más empezar la subrutina.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda con Funciones

Notapor BigBear » 2013-07-10 17:30 @771

Sí, no sé por qué uso tantas funciones innecesarias, pero bueno, ya encontré el error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub get_links {
  2.  
  3.     $test = HTML::LinkExtor->new( \&agarrar )->parse($code);
  4.     return @links;
  5.  
  6.     sub agarrar {
  7.         my ( $a, %b ) = @_;
  8.         push( @links, values %b );
  9.     }
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y cambié el $code por $_[0].
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con Funciones

Notapor explorer » 2013-07-10 19:17 @845

Ya te digo... con solo ver el ejemplo que trae HTML::LinkExtor:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  require HTML::LinkExtor;
  2.  $p = HTML::LinkExtor->new(\&cb, "http://www.perl.org/");
  3.  sub cb {
  4.      my($tag, %links) = @_;
  5.      print "$tag @{[%links]}\n";
  6.  }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 17 invitados

cron