Código em Perl

March 31, 2006

sub setSubtraction {
    my ($min, $st) = @_;
    my @minuendo = @{$min};
    my @subt = @{$st};
    my %hm;
    my %hs;
    my @res;

foreach(@minuendo){ $hm{$_} = 1;}
foreach(@subt){$hs{$_} = 1;}

while (($key, $value) = each(%hm)){
    if($hs{$key} != 1){
        push @res, $key;
    }
}

return @res;

}

O código acima ilustra alguns pontos pelos quais eu demorei muito pra aprender Perl. E mesmo já tendo feito alguns programas em Perl, ainda tenho extrema dificuldade em ler um programa….porque nunca me lembro o que %, @ e $ representam, e para qual variável $_ aponta. As coisas são pouco intuitivas, e os programas em geral são feios e difíceis de serem lidos (sobre tudo se tiverem expressões regulares).

Tá certo que eu não sou um grande expert de Perl, mas mesmo pessoas que conhecem a linguagem demoraram pra ver o que o programa fazia. E pior: cada uma das pessoas que viu o código usaria outra síntaxe para escrever alguns trechos do programa (cada uma deu uma sugestão diferente para trechos diferentes). Sem mudar o algoritmo e as estruturas de dados usadas, existem N variantes de sintaxe possíveis. Acho que muita flexibilidade às vezes atrapalha.

Como diria o Raphael, autor do código acima: “Write once, never read it again”. Fico imaginando o trabalho que deve ser manter grandes sistemas.

Agora, reconheço o poder de Perl para tratar strings, textos e afins, e por sua rapidez para escrever protótipos. Foi por isso que escolhi essa linguagem (que na época não conhecia) para escrever um programa que lia um texto e etiquetava as palavras segundo a posição da sílaba tônica e número de sílabas. Em C teria sido muito mais difícil.

Alguém sabe me dizer o que o programinha acima faz ?

tags:
posted in Desenvolvimento by Miguel Galves

Follow comments via the RSS Feed | Leave a comment | Trackback URL

  • http://books4dev.com Raphael

    Truco!

    • Eu nunca escrevi esse código.
    • Aliás, eu escrevi at gunpoint
    • Foram as vozes… as vozes mandaram fazer desse jeito!
    • Sabe como é, né… Veja bem, considerando o paradigma, e a motricidade média do neurônio de um programador em linguagens pseudo-imperativas-funcionais, Orientadas a Objeto, acho que esse código carece de retrabalho.
    • Ah, não enche. O cliente aprovou.
    • Eu só fiz assim pq do outro jeito era tão rápido que dava loop infinito em 30 segundos
    • É uma nova técnica que eu estou desenvolvendo. Chama “Stupid-people oriented programming”. Muito aceita entre programadores treinados pela Impacta.

    Quanto a frase, essa deve ser minha mesmo. Até, Raphael

  • http://www.blogger.com/profile/5832671 Marcos Dumay de Medeiros

    Ahhhhhhhhh! Faz subtração de conjuntos! Cara demorei pra entender esse :)

    Perl é muito dificil de ler sim. Qualquer programa não trivial é complicado. Essas variáveis de nome estranho requerem um tempão pra aprender a reconhecer e os modificadores de expressão regular são quase impossíveis de decodificar.

    Acho que o problema é que parte da sintaxe to Perl foi baseada na do sh, que só serve mesmo para programas curtos. Isso e os modificadores de expresão regular, que foram muito mal bolados.

    Acho que todo mundo tem muito a ganhar saindo do Perl para outras linguágens, mas eu não sei de nehuma em que seja tão fácil trabalhar com expressões regulares.

  • http://www.blogger.com/profile/18345876 D.

    Galves, eu corri, como o diabo corre da cruz, para não aprender Pearl.

    Meu medo era que um dia me mandassem dar manutenção em um código como este acima.

    Felizmente, não sei o que ele faz.

  • http://www.blogger.com/profile/18345876 D.

    Nem o nome eu aprendi! …corrigindo: Perl.

  • http://www.blogger.com/profile/16143854 Miguel Galves

    De fato..ele subtrai listas! Parabens :-) (o nome facilita um pouco nesse caso, mas mesmo assim…)

  • http://lullis.infogami.com Raphael

    Muda o site, cai o cabelo, muda de emprego…

    e mesmo assim NÃO COLOCA A VERSÃO CORRETA DO CÓDIGO.

    Pô, Miguel, atualiza a minha criatura, pelo amor de Deus…

  • Alexandre Barbosa

    Sem querer me deparei com este código hoje, depois de muito tempo. Não sei porque não tinha comentado antes. É um código totalmente compreensível. Não tenho culpa se você não domina a arte de passar arrays a funções em perl, ou os segredos das variáveis especiais. De qualquer forma, eu modificaria o código para torná-lo mais eficiente:

    sub setSubtraction { my ($min, $st) = @_; my @minuendo = @{$min}; my @subt = @{$st}; my %hm; my %hs; my @res;

    foreach(@minuendo){ $hm{$_} = 1;}

    foreach(@subt){$hs{$_} = 1;}
    

    while (($key, $value) = each(%hm)){

     foreach(@minuendo) {
        if($hs{$_} != 1){
            push @res, $_;
        }
    }
    return @res;
    

    }

    Não executei este código pra testá-lo, mas acho que a comparação ‘$hs{$} != 1′ deve lançar algumas mensagens se a opção -w estiver ativa. Eu substituiria por ‘!defined $hs{$}’. De qualquer forma, parabéns Rafael. Um código muito simples e elegante. Pena não haver mais pessoas que dominam Perl … :)

blog comments powered by Disqus

Switch to our mobile site

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org