• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Dkid

[perl] Converter Celsius para Fahrenheits

12 mensagens neste tópico

Boa noite a todos,

Venho aqui partilhar com vocês a minha primeira experiência a programar em perl.

Sempre pensei que perl fosse uma linguagem desinteressante e complicada, mas após a dedicação que tive hoje à linguagem, já aprendi bastantes coisas, e para o primeiro dia até posso dizer que não esperava tanto.

Portanto, aqui fica o meu contributo à comunidade, have fun!

Já agora se quiserem publicar na revista estejam à vontade, não me oponho em nada.

#################################################################
# Desenvolvido por Dkid								
# Objectivo : Dar a conhecer o que aprendi em 1 dia sobre perl	
# Desenvolvido em : 04-08-2009						
# Compilador Strawberry Perl 5.10 @ http://strawberryperl.com/  
#################################################################

while ($opcao ne "3") # ne = NOT EQUAL
{
print "\n1: Converter Celsius para Fahrenheits\n";
print "2: Converter Fahrenheits para Celsius\n";
print "3: Sair\n";
    print "Opcao: ";
$opcao = <STDIN>; #também é aceitavel <> no lugar de <STDIN>
	if ($opcao ==1)
	{
		print "\nIndique os graus Celsius: ";
		$celsius = <STDIN>;
		# Formula Celsius -> Fahrenheit
		$resultado = $celsius * 9/5;
		$resultado = $resultado + 32;
		print $resultado; print " Fahrenheits\n";
		###
	}
	if ($opcao ==2)
	{
		print "\nIndique os graus Fahrenheit: ";
		$far = <STDIN>;
		#Formula Fahrenheit -> Celsius
		$resultado2 = $far - 32;
		$resultado2 = $resultado2 * 5/9;
		print $resultado2; print " Celsius\n";
		###
	}
	if ($opcao ==3)
	{
		exit 1; # die; é uma alternativa
	}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olha mais um que se anda a dedicar ao Perl. Perl é uma linguagem fantástica sem dúvida, e tem uma potência que muitos não imaginam.

Quanto ao exemplo que deste, é um começo mas não mostra nem 1/100000000 do que podes fazer com Perl.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, obrigado pela resposta!

Perl é uma linguagem fantástica sem dúvida, e tem uma potência que muitos não imaginam.

É verdade, estive a ver uns códigos interessantes, talvez daqui a uns tempos tenha capacidade de mostrar alguma coisa por estes lados.

Só não entendo muito bem porque não existe uma secção (nem que seja por estas bandas de "outras linguagens") para perl, penso que as pessoas aprenderiam mais e estariam mais envolvidas.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É verdade, estive a ver uns códigos interessantes, talvez daqui a uns tempos tenha capacidade de mostrar alguma coisa por estes lados.

Não é complicado, só requere tempo e determinação.

Só não entendo muito bem porque não existe uma secção (nem que seja por estas bandas de "outras linguagens") para perl, penso que as pessoas aprenderiam mais e estariam mais envolvidas.

Aqui no fórum, por norma, cria-se uma nova secção quando há uma boa adesão por parte da comunidade a uma determinada linguagem, Perl ainda não teve essa sorte...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também gostava de aprender Perl, mas agora ando com pouco tempo....

Que tutoriais tens seguido, que é para eu guardar comigo, para quando tiver um tempinho livre....  :)

cumps  B)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

As minhas leituras foram:

http://perldoc.perl.org/index.html

http://www.sthomas.net/roberts-perl-tutorial.htm

http://www.comp.leeds.ac.uk/Perl/start.html

http://www.tutorialspoint.com/perl/index.htm

Entre outros que li mas não guardei.

Para compilar uso o Strawberry Perl 5.10!

Hoje descobri um programa chamado "Padre - Perl Application Development and Refactoring Environment" mas ainda não consegui correr um programa. Ainda está a em fase de produção pelo que me parece.

No entanto utilizo o Notepad++.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para compilar uso o Strawberry Perl 5.10!

Hoje descobri um programa chamado "Padre - Perl Application Development and Refactoring Environment" mas ainda não consegui correr um programa. Ainda está a em fase de produção pelo que me parece.

No entanto utilizo o Notepad++.

Coincidência, hoje também andei à procura de IDE's para Python e depois dei comigo numa página onde tinha a lista de IDE's por linguagens.... e tinha lá o Padre para Perl....

cumps :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a utilizar input do utilizador directamente, no teu programa, nunca deves fazer isso.

Recomendo que logo depois da shebang (#!/usr/bin/perl), faças o use de dois módulos que nos ajudam a garantir bom código:

use strict;

use warnings;

Devias ter qualquer coisa como isto:

#!/usr/bin/perl
use strict;
use warnings;


sub get_input {
print "\n>";
my $opt = <STDIN>;
chomp $opt;
($opt) = $opt =~ /(\d)/;

return $opt;
}

sub c_to_f {
print "\nIndique os graus Celsius:";
my $celsius = get_input;

my $resultado = $celsius * 9/5;
$resultado = $resultado + 32;
print "\n$resultado Fahrenheit\n\n";
}


sub f_to_c {
print "\nIndique os graus Fahrenheit:";
my $f = get_input;

my $resultado = $f - 32;
$resultado = $resultado * 5/9;
print "\n$resultado Celsius\n\n";
}


my %opers = (
1	=>	\&c_to_f,
2	=>	\&f_to_c
);

while (1) {

print "\nEscolha a operação que quer realizar:\n\t1 - Converter de graus Celsius para Fahrenheit\n\t2 - Converter graus Fahrenheit para graus Ceslsius\n\t0 - Sair";
my $opt = get_input;

if ( $opt == 0) {
	print "\nA sair da aplicação";
	last;
}
elsif (exists $opers{$opt}) {
	$opers{$opt}->();
}
else{
	print "\nOpção inválida. Tem que introduzir um dos números correspondente a uma das operações.";
}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:eek:

WOW!!! :shocking:

Olha eu só estou em perl à coisa de uns dias (e como hobbie práticamente) será que podias comentar as linhas, para eu entender melhor o que cada uma faz?

Já agora deve haver algum problema com os teus resultados, pois a conversão não está correcta.

Cumps e obrigado por partilhares código!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os meus resultados estavam a dar errados porque a expressão regular que validava que tratava da segurança dos dados do utilizador, só estava a capturar um dos dígitos (o primeiro). Isso foi porque eu escrevi a função para validar o input das escolhas do menu e depois re-aproveitei para o resto, mas sem me lembrar da regra que tinha imposto.

Estive a pensar,  e visto seres um total principiante, não faças tudo isto que eu fiz, mantém o teu código às features do perl que já conheces. Eu utilizei uma feature já mais avançada, que por enquanto deves evitar, até conheceres e teres experiência com referências. Mas é um exemplo interessante de como isto poderia ser feito por alguém com experiência.

Se continuares a entender alguma coisa diz, que eu explico.

Eis o código corrigido e comentado:

#!/usr/bin/perl

#utilizar estes dois módulos para evitar fazermos asneiras:
use strict;
use warnings;


sub get_input {
print "\n> "; #imprime a prompt
my $opt = <STDIN>;
chomp $opt; #retirar o ultimo caracter da string que deve ser um \r, ou outra um \n, mas de qualquer forma não interessa. Neste caso, esta operação não tem utilidade, mas assim mostro mais uma função built-in do Perl

($opt) = $opt =~ /(\d+)/; #esta é a única forma de "garantir" segurança do input do utilizador,
#com $opt =~ /(\d+)/; estamos a comparar uma string com uma expressão regular que basicamente usa \d como a classe que representa qualquer dígito e +, para dizer que pode ser mais que um digito (era aqui que estava o meu bug),
#a utilização de parêntesis em volta do \d+, vai permitir-me capturar o valor que o motor de expressões regulares do Perl encontrou e que corresponde à expressão regular.
# ($opt) = , permite-me atribuir o valor capturado a uma variável com um nome mais interessante e útil, do que aconteceria por omissão no Perl (seria $1), mas no entanto é importante fazer isto no contexto de lista (daí usar os parêntesis), caso contrário $opt, só guardava o primeiro dígito.

return $opt;
}



sub c_to_f {
print "\nIndique os graus Celsius:";
my $celsius = get_input;

print "c: $celsius\n";
my $resultado = $celsius * (9/5);
print "re: $resultado\n";
$resultado = $resultado + 32;
print "\n$resultado Fahrenheit\n\n";
}


sub f_to_c {
print "\nIndique os graus Fahrenheit:";
my $f = get_input;

my $resultado = $f - 32;
$resultado = $resultado * 5/9;
print "\n$resultado Celsius\n\n";
}



#aqui podem surgir dúvidas a newbie como tu, pois estão coisas mais avançadas:
# %oper é uma hash de referências para subs.
# \ é o operador que referência
# isto permite fazer com que as operações sejam dados durante a selecção de qual operação vai ser realizada. E isso vai permitir isolar mais os problemas. E fazer com que para adicionar mais operações não seja preciso fazer nenhuma alteração do if... É só escrever a sub e adicionar uma entrada aqui... Isto se combinado com serialização, pode permitir coisas interessantes.
#Não uses isto no teu código por enquanto, pois ainda não tens conhecimentos e experiência suficiente.

my %opers = (
1	=>	\&c_to_f,
2	=>	\&f_to_c
);

while (1) {

print "\nEscolha a operação que quer realizar:\n\t1 - Converter de graus Celsius para Fahrenheit\n\t2 - Converter graus Fahrenheit para graus Ceslsius\n\t0 - Sair";
my $opt = get_input;

if ( $opt == 0) {
	print "\nA sair da aplicação";
	last;
}
elsif (exists $opers{$opt}) { #exists verifica que uma chave existe numa hash
	$opers{$opt}->(); #isto permite chamar a sub que foi referenciada para essa chave
}
else{
	print "\nOpção inválida. Tem que introduzir um dos números correspondente a uma das operações.";
}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, detesto não responder prontamente, mas ainda estou a associar tudo aquilo que fizeste e a ponderar comprar um livro para melhor aprender boas práticas em Perl.

Mais uma vez obrigado pela partilha de conhecimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se comprares um livro, recomendo o Learning Perl da O'Reily.

Depois à medida que vais evoluindo podes comprar o Intermediate, o Advanced e o Mastering...

O Perl Cookbook e o Perl Hacks (ambos da O'Reily), também podem ser úteis. Mas ver o código de outros e trocar experiências com outros, é algo inestimável. Mas não faças algo só porque os outros o fazem, mesmo que sejam os gurus, faz as coisas só quando são precisas.

Para boas práticas tens o Perl Best Practices da O'Reily, que também é excelente.

Recomendo também que te tornes um Perl Monger... Temos vários grupos de Perl Mongers em Portugal, o mais activo é o Lisbon.pm.

http://lisbon.pm.org/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora