Código em Perl
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 ?

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
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.
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.
Nem o nome eu aprendi! …corrigindo: Perl.
De fato..ele subtrai listas! Parabens
(o nome facilita um pouco nesse caso, mas mesmo assim…)
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…
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 …