• Publicidad

Lío con argumentos en función

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

Lío con argumentos en función

Notapor natxo » 2007-12-19 16:35 @733

Hola de nuevo:

Tengo unos cuantos scripts con Net::LDAP que me sirven para localizar de modo rápido determinados atributos del servidor LDAP. Hasta ahora cada vez que necesitaba consultar un nuevo atributo, pues copiaba un script, cambiaba el atributo a buscar y ya está. El problema es que cada vez tengo más programillas dispersos y duplico muchas cosas.

Así que me he puesto a aprender a pasar argumentos al programa y así tener uno solo y poder buscar distintas cosas desde ahí.

Éste es el programilla:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings;
use strict;
use Getopt::Std;

use vars qw/ $opt_e $opt_n $opt_t $opt_h/;
getopts( 'e:t:n:?' );

# croak if no valid switches present:
usage() unless defined($opt_e) or defined($opt_n) or defined($opt_t);

# --- configuration ---
# $ldapserver = "domaincontroller.yourdomain.com";
# my $domain = "YOURDOMAIN";
# my $basedn = "ou=companyxy,dc=companyxy,dc=tld";
my $ldapserver = "name.domain.tld";
# my $domain = "YOURDOMAIN";
# my $username = "myuser";
# my $password = "mypassword";
my $basedn = "dc=domain,dc=tld";
# --- end configuration ---

# if $opt_e we want only attribute mail
# if $opt_n we want attribute sn
# if $opt_t we want mobile, homePhone and telephoneNumber

if (defined($opt_e)) {
    search("$_[0]", "mail");
}

sub search {
use Net::LDAP;
my $ldap = Net::LDAP->new($ldapserver) or die "$0";
# at home I do not need binding, otherwise here bind
my $msg = $ldap->search (base => $basedn,
                         filter => "(|(cn=*$_[0]*)(uid=*$_[0]*))",
                         attrs => ['$_[1]']);

$msg->code && die $msg->error;
foreach my $entry ($msg->all_entries) {
    if ($entry->get_value('$_[1]')) {
        print "$_\n" for $entry->get_value( '$_[1]' );
    }  else { print "bummer\n";}
}
# $ldap->unbind;
}

sub usage {
my $heredoc = <<EOF;
    usage: $0 [-etn?] name
    -e: get e-mail addres
    -t: get telephone number
    -n: get surname
EOF

print $heredoc;
}
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


el resultado es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
~$ ldap.pl -e string
bummer
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Creo que el error lo tengo en la función search(). Mi intención es que el primer argumento sea $opt_e u $opt_t..., etc; y que el segundo argumento sea el atributo que le quiera pasar, en este caso, mail.

Parece que funciona, pero me no encuentra nada. Lo que es curioso es que si busco objetos que tengan varias direcciones de correo, me imprime 'bummer' tantas veces como direcciones tienen los objetos. Lo cual me sugiere que sí encuentra algo pero no del todo bien.

En fin, que ya es tarde para mí hoy y no acabo de verlo. A ver si alguno de ustedes ve el error y si no cuando tenga otro rato a ver si lo encuentro. De antemano gracias por su colaboración.
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Publicidad

creo que lo he encontrado

Notapor natxo » 2007-12-20 16:18 @721

el problema estaba en las comillas. Tenía que poner "$_[1]" en vez de '$_[1]'.

enfins
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Notapor explorer » 2007-12-20 18:06 @796

Un consejo, de Perl: "Menos es más".

En aquellas situaciones en las que solo interviene un valor, no es necesario entrecomillarlo. Así

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
search("$_[0]", "mail");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

es mejor escribirlo como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
search( $_[0], 'mail');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

porque $_[0] está 'solo' (no hay más valores a su alrededor); y 'mail' no es necesario entrecomillado doble, porque no es una variable que vaya a ser interpolada. Así que la ponemos con entrecomillado simple, para indicar visualmente que es una constante.

En el resto
Código: Seleccionar todo
die "$0"                   -> die $0
attrs => ['$_[1]'])        -> attrs => [$_[1]]);
$entry->get_value('$_[1]') -> $entry->get_value($_[1])

Queda el código un pelín(*) más corto, más claro, y nos evitamos la sorpresa de entrecomillar lo que no debemos :-)

(*) De Perl se suele decir que es muy 'peludo', porque está lleno de caracteres 'extra', haciéndolo, en algunas ocasiones, un poco feo. Así que a medida que vamos cogiendo experiencia con Perl, hay que intentar poner solo los 'pelos' justos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor creating021 » 2007-12-20 20:46 @907

Un comentario de más:

use vars;: eso es obsoleto, para eso está our

Por otro lado, si no estás usando AutoLoader o SelfLoader podes usar my.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Básico

¿Quién está conectado?

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

cron