• Publicidad

Problema de eficiencia: ¿hay otro modo de hacerlo?

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

Problema de eficiencia: ¿hay otro modo de hacerlo?

Notapor fgalves » 2006-10-17 08:00 @375

Y alla vuelvo a atacar.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#This array contains now all the reports names
    @reports = ( @$xmlAggregations, @$xmlProjections, @$flatAggregations, @$flatProjections );

    #a new hash "%newSummary" is created from "%Summary", but classifying its content per report
    foreach my $key (keys @Summary ) {
        ###obtener $reportName a partir de $key y de @reports
        $newSummary{ $reportName }{ $key } = $Summary{ $key };
     }  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


En @reports, tengo todos los nombres posibles de reports.
En el foreach, sé que el contenido de $key será un string que empieza por alguno de los elementos de @reports.
Lo que quiero obtener, es la intersección, o sea, $reportName.

Por poner un ejemplo:
@reports = (aa, bb, cc, dd);
$key = "aaValor";
en este caso, $reportName = aa

o tambien $key = "bbContador";
en este caso, $reportName = bb;

o sea, teniendo $key, tengo que buscar en @reports y descubrir cual de sus elementos es el correcto (teniendo en cuenta que $key es la concatenación de dicho elemento con más caracteres)

En resumidas cuentas, lo que deseo es una forma sencilla (la que yo tengo pensada desde luego no lo es, pues consiste en recorrer todo @reports e ir comparando a lo bestia) de obtener $reportName.

¿A alguien se le ocurre una manera eficiente usando los comandos de Perl?

De todos modos, gracias por adelantado,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor fgalves » 2006-10-17 08:15 @385

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  #This array contains now all the reports names
    @reports = ( @$xmlAggregations, @$xmlProjections, @$flatAggregations, @$flatProjections );

    #a new hash "%newSummary" is created from "%Summary", but classifying its content per report
    foreach my $key (keys %Summary ) {
        foreach my $readedreport (@reports)
        {
            if ($key =~ /^$readedreport/) {$reportName = $readedreport;}
        }
        $newSummary{ $reportName }{ $key } = $Summary{ $key };
     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El código que he hecho es este, y funciona, pero me huele a que no es demasiado eficiente. Ese foreach dentro del foreach, ¿es posible suprimirlo por alguna función perl?

¡¡Gracias!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2006-10-17 10:03 @461

Se podría hacer con un grep, pero es posible decir también que si todos los $readedreport tienen la misma longitud, no te hace falta hacer ninguna búsqueda. Sólo las extraes de la $key y ya está.
Última edición por explorer el 2006-10-17 10:23 @474, editado 1 vez en total
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 Perl user » 2006-10-17 10:07 @463

Que tal,

Mira antes de darte sugerencias sobre el código me gustaría comentarte algo referente a la definición que generalmente la asociacian al concepto de 'eficiencia'.

Si bien es cierto que Perl tiene muchas monerías referentes a cómo realizar una misma tarea de diferentes formas, no todas implican que sean mucho mas 'eficientes' que la otra, en la mayoría de las circunstancias es sólo por cuestión de diseño, o también llamado 'forma idiomática' o propia del lenguaje. Sin embargo, eso también está para discutirse ya que la construcción no idiomática tambien funciona, lo que implica que está aprobada por el lenguaje mismo.

Bien, volviendo al término eficiencia. Últimamente los desarrolladores pierden un poquito el sentido de funcionalidad vs eficiencia, intentando rescatar eficiencia sacrificando claridad, extensibilidad y otros factores importantes para mantenimiento de una aplicación y reutilización, como es el caso de la gente que usamos Perl. Muy a menudo confundimos eficiencia con oscuridad en el código, y eso tiende a perder mucho los conceptos que mencioné anteriormente para el desarrollo de una buena aplicación ( buena no implica grande ).

La recomendación siempre ha sido: Intenta generar un buen diseño inicial, realiza la implementación, NO intentes hacer código "eficiente" o matarte por 2 o 3 ciclos menos del procesador, genera código funcional. Ya funciona? Después de un análisis profundo, verifica que partes pueden ser 'optimizadas', verifícalo bien. Vale la pena hacer cambios? entonces aplica una técnica llamada "Refactoring", que no solo es intentar optimizar código, sino eliminar ambiguedades, repeticiones y otros aspectos que pueden evitar que tu código sea reutilizable haciéndolo dificil de mantener.

Recordemos a Knuth con su ya célebre frase: "Early optimizations are the root of all evil.". No lo dijo por nada :)

Te recomiendo leer sobre metodologías Ágiles para el diseño de software, échale un vistazo a algunas técnicas ofrecidas por 'Extreme Programming', posiblemente aprendas mas de ello que intentando "eficientizar" tu aplicación.

Volviendo a tu código... para evitar algo muy oscuro, una solución podría ser:

Código: Seleccionar todo
foreach my $summary ( keys %Summary ) {
    foreach my $report ( @reports ) {
        $newSummary{ $report }{ $summary } = $Summary{ $summary}
                if $summary =~ /^$report/;
    }
}


De cualquier manera te recomiendo le eches un vistazo a perllol, perldsc y perlref para cualquier duda.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor fgalves » 2006-10-18 02:31 @147

Hola a todos,
No explorer, el contenido de $readReport no siempre tiene la misma longitud.

Gracias!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2006-10-18 07:42 @363

Este hilo sigue en otro titulado: "Pequeño problema bucle"
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


Volver a Básico

¿Quién está conectado?

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

cron