• Publicidad

Uso de Hash

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Uso de Hash

Notapor tetu » 2008-09-18 14:43 @655

Hola, ojalá alguien me pueda ayudar con esta función que fue desarrollada por una persona que no está disponible en este momento y esta "cosa rara" no está funcionando.

Lo que se pretende es que si una persona ($entry que es el parámetro de entrada) es "Trading" (un tipo de empleado), la función devuelva true:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub userHasVariance($)
{
    my ($entry) = @_;
    my %variances;
    my $key;
    my (@attrValues,@varValues);
    my ($attrValue,$varValue);
    my $attrVar;
    my $configVar;
    my $configValue;
    my (@userAttrValues,$userConfigValue,$userAttrValue);
    my $thisValueFound = FALSE;

    # get all of the variances
    %variances = &getConfigFile('variance');

    # look through all of the variances
    foreach $configVar (keys %variances) {
        $userConfigValue = $entry->get_value("$configVar");
        foreach $configValue (keys %{$variances{$configVar}}) {
            # is this user in the group of users we want to check?
            if ($userConfigValue =~ /$configValue/i) {
                #which attribute are we basing the variance on
                $attrVar = $variances{$configVar}{$configValue}{attr};
                $attrValue = $variances{$configVar}{$configValue}{value};
                # get the users attributes
                @userAttrValues = $entry->get_value("$attrVar");
                # check each of the values to see if it is in the list
                foreach $userAttrValue (@userAttrValues) {
                    if ($attrValue =~ /,$userAttrValue,/i) {
                        $thisValueFound = TRUE;
                    } elsif ($attrValue =~ /^$userAttrValue,/i) {
                        $thisValueFound = TRUE;
                    } elsif ($attrValue =~ /,$userAttrValue$/i) {
                        $thisValueFound = TRUE;
                    } elsif ($attrValue =~ /^$userAttrValue$/i) {
                        $thisValueFound = TRUE;
                    } else {        # not found user does not have a variance
                        return FALSE;
                    }

                }
                # if user has nono of these attributes return FALSE (default setting)
                # or the user has all of them, then return TRUE;
                return $thisValueFound;
            }
        }
        # user not in these "Groups"
        return FALSE;
    }
    # no variances found
    return FALSE;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El archivo de configuración es el siguiente:

Código: Seleccionar todo
variance:collectiveParentRDN:Trading:applications:38


ColectiveParentRDN es por ejemplo ou=Trading Partners,o=Com.

Este es el caso que la función debería ser cierta y también, cuando el usuario tiene en el atributo applications el valor 38... lo que ahora sucede es que en donde se usa la función, que es un if... nunca se entra... ¡¡y no puedo sacar por qué!! ¡porqué este código es demasiado complejo! =(

Espero que no falten datos...
¡Mil gracias!
Stefania.
tetu
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2008-09-18 14:31 @646

Publicidad

Notapor explorer » 2008-09-18 15:55 @705

Bienvenido a los foros de Perl en Español, tetu.

Te recomendaría el uso del depurador: ir paso a paso e ir sacando el valor de las variables para ver qué contienen.

Y desde luego, sí que se puede simplificar un poco...

¿Cómo realizas la lectura del fichero de configuración? Es que no veo cómo puede quedar almacenado en %variances.
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

Notapor Jenda » 2008-09-20 09:24 @433

1) No declares las variables antes de que las necesites. Hay lenguajes en que tienes que declarar todas las variables antes del primer comando. No es así en Perl.

Así que es mejor escribir
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $configVar (keys %variances)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
que
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $configVar;
...
foreach $configVar (keys %variances)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


2) Casi nunca es necesario escribir & cuando llamas a una función. Y cuando es necesario deberías saber por qué.

3) "$variable" es inútil. No pongas las comillas sobre la variable. Si la variable contiene una cadena, solo haces una copia. Si contiene un número, fuerzas a Perl a convertirlo en una cadena de caracteres y haces la copia. Pero si la variable contiene una referencia las comillas la matan. Lo que obtienes no será ninguna referencia sino una cadena de caracteres que parece una referencia. Pero no se puede usar así.

4) Ésto es una tontería
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($attrValue =~ /,$userAttrValue,/i) {
        $thisValueFound = TRUE;
} elsif ($attrValue =~ /^$userAttrValue,/i) {
        $thisValueFound = TRUE;
} elsif ($attrValue =~ /,$userAttrValue$/i) {
        $thisValueFound = TRUE;
} elsif ($attrValue =~ /^$userAttrValue$/i) {
        $thisValueFound = TRUE;
} else {        # not found user does not have a variance
        return FALSE;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
eso se puede escribir así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($attrValue =~ /(?:^|,)$userAttrValue(?:,|$)/i) {
        $thisValueFound = TRUE;
} else {        # not found user does not have a variance
        return FALSE;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y hay un problema con ambas soluciones. La $userAttrValue podría contener un carácter especial para expresiones regulares. Para prevenir esos problemas hay que hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($attrValue =~ /(?:^|,)\Q$userAttrValue\E(?:,|$)/i) {
        $thisValueFound = TRUE;
} else {        # not found user does not have a variance
        return FALSE;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa


Volver a Avanzado

¿Quién está conectado?

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