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

Dkid

Perl [mini-introdução]

4 mensagens neste tópico

Boas,

Venho aqui partilhar um pouco do meu conhecimento, adquirido no livro “Learning Perl – 5th Edition”. O qual devo dizer, para quem não tem problemas de maior em inglês está muito bem explicado!

Antes de continuar quero dizer que não se devem cingir apenas ao que estou a partilhar neste tópico, devem, se for do vosso interesse investir na vossa curiosidade, pois eu apenas me estou a iniciar na linguagem.

Aconselho-vos também a verem a tabela de “operadores de comparação”, podem ser encontrados nas seguintes hiperligações:

http://www.wdvl.com/Authoring/Languages/Perl/PerlfortheWeb/comparison_table.html

http://www.tizag.com/perlT/perloperators.php

http://docstore.mik.ua/orelly/perl/learn/ch02_04.htm

Shebang

Sabia para o que era, mas ao inicio não lhe dei importância, até entender que em sistemas Unix faz diferença usa-la.

A shebang não é nada menos do que no inicio do documento se declarar da seguinte forma:

#!/usr/bin/perl

Ao faze-lo estamos a dizer que o compilador se encontra no directório /usr/bin/perl, também existe outra maneira para o caso de não saber o caminho #!/usr/bin/env perl entre outras.

Operador chomp

Apesar de ainda não entender bem o objectivo real do operador, a sua função principal é quando uma variável acarreta uma string, e nessa string existe um “\n” (newline character) o operador vai-se ver livre do “\n” no final da string.

#!/usr/bin/perl

chomp($texto="Miguel Angelo \n"); 
print $texto;
print "amanhã encomeda pizzas para o jantar!\n";

print "Indique o seu primeiro e ultimo nome:\n>";
$entrada=<STDIN>;
chomp($entrada);
print $entrada;

print "Indique o seu primeiro e ultimo nome:\n>";
$entrada=<STDIN>;
print $entrada;
print "A diferença está a vista";

Função defined

Em perl até determinada variável ser utilizada esta encontra-se indefinida, para assegurarmo-nos que a mesma foi definida usamos a função defined.

#!/usr/bin/perl
$tartaruga =<STDIN>;
If(defined($tartaruga))
{
print “Escreveu :  “ .$tartaruga;
}
else { print “variável não definida”;}

Arrays

Para quem já tem prática no uso de arrays (que não é o meu forte) o uso de arrays em perl não é nada de novo. No entanto se arrays é algo novo, aconselho a lerem o livro que explica muito bem. Vou tentar dar o meu melhor.

#!/usr/bin/perl

#Os arrays começam todos em 0
$splinter[0]="Donatelo";
$splinter[1]="Leonardo";
$splinter[2]="Miguel Angelo";
$splinter[3]="Rafael";

print $splinter[0]; #output Donatelo

$numero = 2.8;
print "\n" . $splinter[$numero +1]; #O mesmo que print splinter[3];

Índice de arrays

#!/usr/bin/perl

$armas[0]= "Bastão";    #uma arma
$armas[1]= "Matracas";  #mais uma
$armas[2]= "Sai";		#e mais uma
$armas[10]= "Ninjaken"; # e agora temos 7 armas indefinidas (3,4,5,6,7,8,9)

$ultimo = $#armas;  	#se quizermos saber o último elemento no indice
print $ultimo; 			#output : 10
print "\n" .$armas[10]; #output : ninjaken 

$numero_armas= $ultimo +1; #não é a maneira mais correcta
print "\n" .$numero_armas. "\n";
$armas [$#armas] = 'pizza';#a ultima arma

print $armas[5]; #como não é definida vai dar um erro

Como a maneira de ir buscar o ultimo elemento não é a mais correcta, existe uma outra maneira de o fazer.

#!/usr/bin/perl

$armas[0]= "Bastão";    #uma arma
$armas[1]= "Matracas";  #mais uma
$armas[2]= "Sai";		#e mais uma
$armas[10]= "Ninjaken"; # e agora temos 7 armas indefinidas (3,4,5,6,7,8,9)

$armas[-1] = 'pizza';
print $armas[-1]; 		#output : pizza
$primeira = $armas[-11];
print "\n" .$primeira . "\n";  #output : Bastão

$armas[-20] = 'erro';	#fatal error:
					#uma vez que só temos um array até 11 elementos [0 a 10].

Fonte: Livro “Learning Perl – 5th Edition”

Personagens TMNT para os exemplos

Hiperligações de interesse

• www.pm.org – Perl Mongers

• www.cpan.org – CPAN – Comprehensive Perl Archive Network

http://perldoc.perl.org –Perldoc, bons contem exemplos

http://faq.perl.org – PerlFaq, contem a ultima versão do perlfaq

PS:Espero que de certa forma vos seja útil para se iniciarem, pois é uma linguagem com um grande potencial.

Se quiserem poderei continuar, apenas parei por aqui pois não sei qual será a vossa reacção.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A minha recomendação é que nunca faças perl sem ter depois da shebang o seguinte:

use strict;

use warnings;

chomp não é um operador... É uma função que faz parte do Perl.

O objectivo é simples. Mas primeiro tens que te lembrar de onde vem o Perl.

O Perl é inspirado em linguagens com o AWK, o AWK é feito para processar texto.

Em todos os ficheiros, quando queremos guardar dados temos que saber onde começa e onde acaba cada registo. Para isso utilizamos aquilo a que se chama record separator.

Quando obtemos o input esse input inclui os dados todos que foram introduzidos, o que inclui o record separator. Nesse caso o record separator é um input record separator.

O que o chomp faz é retirar o input record separator do fim de uma string. O que é útil, porque para o processamento dos dados isso não costuma ser minimamente útil só para os receber, ou para os enviar.

Em perl até determinada variável ser utilizada esta encontra-se indefinida

Não é até ser usada, é até ser inicializada, ou seja até lhe ser atribuído um valor. Por exemplo:

my $a;

print $a;

$a = 1;

Neste exemplo eu utilizei a variável antes de inicializar. Ela só foi inicializada quando lhe foi atribuído um valor.

Atenção à utilização de defined numa hash. Se por exemplo quiseres verificar se um chave existe, usa a função exists, mas isso não diz se há um valor definido para essa chave. A chave pode corresponder a um valor undef, e por isso se quiseres saber se há valor para a chave usa defined: "defined $hash{'chave'};"

Como a maneira de ir buscar o ultimo elemento não é a mais correcta, existe uma outra maneira de o fazer.

Não é?

Mas porque é que não é?

Não há melhor forma que essa para ir buscar o valor do ultimo elemento de um array.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora é que me matam  :-[

A minha recomendação é que nunca faças perl sem ter depois da shebang o seguinte:

use strict;

use warnings;

Tens razão, já tinha aprendido contigo isso, mas ontem à noite com a vontade de fazer mais um tópico perl, acabei por me esquecer. shame on me! :wallbash:

chomp não é um operador... É uma função que faz parte do Perl.

Talvez o meu inglês não esteja muito bom, mas como estava a ler do livro (que é em inglês), o que eles dizem é o seguinte :

The first time you read about the chomp  operator, it seems terribly overspecialized. It works on a variable. The variable has to hold a string. And if the string ends in a newline character, chomp can get rid of the newline. That's (nearly) all it does.
fonte: http://hell.org.ua/Docs/oreilly/perl3/lperl/ch02_09.htm

Não é?

Mas porque é que não é?

Não há melhor forma que essa para ir buscar o valor do ultimo elemento de um array.

Mais uma vez apenas fui pelo o que o livro diz:

Larry has provided a shortcut: negative array indices count from the end of the array. But don't get the idea that these indices "wrap around." If you've got three elements in the array, the valid negative indices are -1 (the last element), -2 (the middle element), and -3 (the first element). In the real world, nobody seems to use any of these except -1, though.

fonte: http://hell.org.ua/Docs/oreilly/perl3/lperl/ch03_02.htm

Quanto à variável indefinida, tens razão, eu é que entendi mal!  :-[

Obrigado pela atenção e explicações (assim até dá vontade de continuar!!!).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A respeito da função chomp, ela é uma função e é por isso que vem listada na lista de funções do Perl:

http://perldoc.perl.org/functions/chomp.html

Quanto à questão dos arrays.

Estás a confundir, o obter o valor do último elemento de um array, com o obter o número de elementos de um array.

Obter o número de elementos de um array pode ser feito facilmente e de várias formas:

my $array_size = @array;

ou mais explicitamente

my $array_size = scallar @array;

obter o último valor de um array pode ser feito de várias formas, umas destrutivas, outras nem tanto:

forma destrutiva:

my $last = pop(@array);

forma não destrutiva:

my $last = $array[$#array];

Utilizar os indíces negativos é como se tivesse o array ordenado de forma invertida.

Não conhecia isso, com o Perl aprendemos sempre novas formas de fazer as coisas (permite muito mais flexibilidade sintáctica que as outras linguagens). Duvido que muitos programadores de Perl utilizem essa forma de fazer as coisas e que muitos conheçam, ou se lembrem que existe e a não ser que seja terrivelmente conveniente essa é a razão pela qual acho que a outra forma é uma boa prática (até porque é mais semelhante às outras linguagens de programação). Se usares, mete um comentário a explicar o que se trata.

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