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

Ragazzo_Programmatore

Programa de Perl. Duvida

2 mensagens neste tópico

Ja devia voltas a sites e ainda nao percebi certos pedaços de codigo deste programa.

Os pedaços de código que nao entendo estao assinalados com um '*'.

Vá dêm ai uma maozinha.

Obrigado. ;)

#!/usr/bin/perl
@list = (1,5,3,9,7);
%array1 = ('a' => 'zwsdre', 'b' => 'ghtrry', 'bb' => 'zwsdr');
%array2 = ('a' => 5, 'b' => 3, 'bb' => 4)

#imprime, na 1ª linha, após o tab a string com os elementos de @list ordenados e separados por ',' 
print "1:\t",join(',',sort @list),"\n";		

#imprime, na 2ª linha, após o tab a string com os valores de %array1 ordenados e separados por ',' 
print "2:\t",join(',',sort values %array1),"\n"; 
print "3:\t",join(',',sort values %array2),"\n";

#imprime, na 4ª linha, após o tab a string com as chaves de %array1 ordenados e separados por ',' 
print "4:\t",join(',',sort keys %array1),"\n";
print "5:\t",join(',',sort keys %array2),"\n";

#imprime, na 6ª linha, após o tab a string com as chaves de %array1 ordenadas, pelo valor respectivo e separados por ',' 
print "6:\t",join(',',sort {$array1{$a} cmp $array1{$b}} keys %array1),"\n";            
* nao entendo o que isto faz, nem $array1{$a} nem o cmp, resumindo n entendo o print

#imprime, na 7ª linha, após o tab a string com as chaves de %array2 ordenadas inversamente, pelo valor respectivo e separados por ',' 
print "7:\t",join(',',sort f keys %array2),"\n";

#imprime, na 8ª linha, após o tab a string com as chaves de %array2 ordenadas, pelo valor respectivo e separados por ',' 
print "8:\t",join(',',sort g keys %array2),"\n";

#em PERL um subrotina é declarada com a palavra sub seguida do nome da mesma
sub f{                          * Estas duas funcoes o que fazem precisamente?
return $array2{$b} <=> $array2{$a};	#ordena inversamente pelo valores das chaves.
}

sub g{
return $array2{$a} <=> $array2{$b};
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmmm...

Isto é uma HASH, tem uma serie de KEY->VALUE PAIRS.

%array1 = ('a' => 'zwsdre', 'b' => 'ghtrry', 'bb' => 'zwsdr');

Isto é o que tu não entendes...

print "6:\t",join(',',sort {$array1{$a} cmp $array1{$b}} keys %array1),"\n"; 

Vamos ao principal...

sort {$array1{$a} cmp $array1{$b}} keys %array1

Isto é uma sorting by value, ou seja tás a ordenar os 'zwsdre', 'ghtrry', etc...

O cmp é um string comparison operator, 0 if equal, 1 if $a greater, -1 if $b greater

O <=> é um numeric comparison operator, idem...

O $a e o $b são variaveis globais próprias da função sort.

O join é só uma maneira de apresentar os valores finais.

Tens aqui outra maneira de apresentar o resultado.

for $key(sort {$array1{$a} cmp $array1{$b}} keys %array1){
print "$key - $array1{$key}\n";
}

Isto é uma subrotina, que faz algum do trabalho necessário ao sorting mas com o operador numerico <=>

sub g{
return $array1{$a} <=> $array1{$b};
}

Vamos trocar <=> pelo string operator cmp.

sub g{
return $array1{$a} cmp $array1{$b};
}

E agora chamas a subrotina...

print "6:\t",join(',',sort g keys %array1),"\n"; 

Ou:

for $key(sort g keys %array1){
print "$key - $array1{$key}\n";
}

cyas ;)

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