Aprendiendo Perl, el reto: historia popular

Javier Tiá javier.tia en gmail.com
Dom Jul 8 17:28:46 PDT 2012


Hola,

Mi respuesta a este reto:

------------------------- 8< -------------------------
#!/usr/bin/env perl

use strict;
use warnings;
use File::Basename 'basename';

sub get_cmds_shell_history()
{
    # Llama bash en modo interactivo para llamar el comando interno 'history'
    my $get_cmds =
        qq/$ENV{'SHELL'} -i -c "history -r; history"/
        . q/ | awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}'/;

    chomp(my @cmds = qx# $get_cmds #);

    my @cmds_separated;

    for (@cmds)
    {
        m/\||\|\||&&/ ?
            push @cmds_separated,                 # Considere contar
                map { my ($cmd) = split; {$cmd} } # commands entre
                    split m/\||\|\||&&/,                      # |, || y &&
            :
            push @cmds_separated, (split / /,$_)[0];
    }

    return @cmds_separated ? @cmds_separated : undef;
}

my %cmds_grouped;

(m|/|) ? $cmds_grouped{ basename($_) }++ : $cmds_grouped{$_}++
    for (get_cmds_shell_history);

# Popularidad ordenada en orden decreciente
# Formatea la salida con el conteo indentado
printf("% 8d %s\n", $cmds_grouped{$_}, $_)
    for sort { $cmds_grouped{$b} <=> $cmds_grouped{$a} }
        keys %cmds_grouped;

------------------------- 8< -------------------------

Saludos,


2012/7/6 Marcelo <marcelo.magallon en gmail.com>:
> Hola,
>
> brian volvió a publicar un reto en la serie.  Todavía tengo pendiente
> una traducción de la respuesta del anterior, que resultó un poco
> larga.
>
> El original en Inglés está en http://www.learning-perl.com/?p=302
>
> ------------------------- 8< -------------------------
>
> Para el reto de junio, escriba un programa que lea la historia de
> comandos del shell y determine cuales son los que usted utiliza con
> más frecuencia.
>
> En bash, es posible asignar valores a HISTFILE y HISTFILESIZE para
> controlar el comportamiento de la historia.  Para obtener los comandos
> a contar, puede leer el archivo correcto o hacer una llamada al
> comando "history".  A partir de ahí usted tiene que decidir como
> partir cada línea a fin de determinar cuál es el comando.  ¿Puede
> soportar comandos con paths relativos y absolutos de manera que no los
> cuente de forma separada?
>
> Esto fue un meme hace un tiempo, y me gustaría encontrar mi respuesta
> de entonces.  Si usted la encuentra por favor hágamelo saber.
>
> ------------------------- >8 -------------------------
>
> Como siempre están invitados a poner sus respuestas en el artículo de
> brian o hacer sus preguntas y comentarios por acá.
>
> Saludos,
>
> Marcelo
> __
> Costarica-pm en pm.org
> http://mail.pm.org/mailman/listinfo/costarica-pm



-- 
Javier


Más información sobre la lista de distribución Costarica-pm