Me he topado con un código que básicamente es:
sub get_info{
# ldap requests
return %user_info if ($valid_user) ;
if($error){
return 1 if($network_error);
return 0 if($user_error);
}
}
Básicamente no es tan simple, pero da una idea de los códigos de retorno y de que datos se utiliza en caso de que esté todo bien.
El código donde se usa es:
sub makeSQL{
if(get_info() == 0){
# something
}elsif(get_info() == 1){
# something else
}else{
%user = get_info();
# balblabla
}
El problema es bastante simple, se llama a la función repetidas veces. Y lo peor de todo, es el orden. Usualmente, por lo que pude ver, el peor de los casos es RC==1 (no suele fallar tanto la red). Luego, la que es más usual que tenga datos (que sea un hash) es la última.
El código, para realmente simplificarlo, debería ser algo como:
#!env perl
sub get_info($){
my %ans = ("arbol" => "22",
"kamisama" => "dios",
"gohan" => "arroz");
return \%ans unless(($_[0] == 1) || ($_[0] == 0));
return \$_[0];
}
my @params = (0,1,3);
my $result = {};
foreach my $para (@params){
$result = get_info($para);
if($result=~/HASH/){
use Data::Dumper;
print "result: " . Dumper($result) . "\n";
}else{
print "## result: " . ($$result) . "\n";
}
}
De esta forma se reduce significativamente las llamadas a get_info, usando una variable únicamente las variables y no volviendo a llamar getinfo.
Es obvio que elllamar a get_info es mucho más simple y cómodo, pero a la hora de realmente programar, no se debería tomar tan a la ligera las llamadas a las funciones, sobre todo, funciones que tienen IO o usan redes.