Jump to content
Sign in to follow this  
Ragazzo_Programmatore

Programa de Perl. Duvida

Recommended Posts

Ragazzo_Programmatore

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};
}

Share this post


Link to post
Share on other sites
freesumo

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 ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.