Perl x C – Passagem de argumentos por referência

Que tal compararmos Perl com C? A primeira listagem exemplifica a passagem de argumentos por referência com ponteiros em C, baseada no livro “Treinamento em Linguagem C” da Victorine Viviane Mizrahi pela editora Pearson Prentice Hall.

  • Design-time
/*gcc -o c9p259 c9p259.c
passagem de argumentos por referência com ponteiros*/
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>

void reajustar(float *, float *);

int main(){
	setlocale(LC_ALL,"");
   	float preco, aumento;

   	do{
      		printf("\nInforme preço atual: ");
      		scanf("%f", &preco);
		    if(preco == 0.0) break;
	
      		reajustar(&preco, &aumento);

      		printf("\nPreço novo: %.2f\n", preco);
      		printf("Aumento: %.2f\n", aumento);
   	}while(preco != 0.0);

   	system("pause");
   	return 0;
}

void reajustar(float *a, float *b){
   	*b = *a * 0.2;
   	*a *= 1.2; 
}
  • Runtime
  • Design-time
#!/usr/bin/perl
use warnings;
use strict;

my ($preco, $aumento);	# = (0,0);
#my $pr = \$preco;
#my $ar = \$aumento;

{
	do{
		print "\nInforme preco atual: ";
		chomp($preco = <>);
		last if $preco == 0;

		reajustar(\$preco, \$aumento);

		print "Preco novo: \t $preco \n";
		print "Aumento: \t $aumento \n";
	}while($preco != 0);
}

sub reajustar{
	${$_[1]} = ${$_[0]} * 0.2;
	${$_[0]} *= 1.2;
}
  • Runtime
  • Sintaxe

Normalmente uma função ou subrotina pode receber diversos argumentos, mas só retorna um único valor por meio do comando return. Uma forma de modificar os argumentos através de uma subrotina é usar ponteiros (em C) ou referências (em Perl), que são variáveis que armazenam, referenciam ou apontam o endereço de outra variável.

O operador de direção ou de endereço é & em C e \ em Perl e opera sobre o nome da variável resultando no endereço dessa variável. Neste exemplo, temos &preco e &aumento em C equivalentes de \$preco e \$aumento em Perl.

O operador de indireção é * em C e $ em Perl (para escalares; para arrays é @ e para hashes é %) e opera sobre o endereço da variável resultando no nome ou valor dessa variável. Neste exemplo, temos *a e *b em C equivalentes a ${$_[0]} e ${$_[1]} em Perl. Lembre-se que em Perl a lista de argumentos de uma função ou subrotina é um array.

Difícil? Que tal colocar a mão na massa e realizar duas melhorias nos códigos acima?

  1. prevenção no caso de o usuário pressionar a tecla ENTER ao ser questionado sobre o preço.
  2. solicitação do valor do porcentual de aumento (porque neste caso sempre é 20%)

Boa diversão!

  • Reflexão

Dependendo do grau de cultura de uma pessoa, seu assunto preferido pode ser pessoas, acontecimentos ou ideias. Um ti-ti-ti recente nas redes sociais é que o bolsonarista Neymar traiu a namorada grávida e publicamente pediu desculpas. Um dos filmes mais românticos que já vi é Love Story, de Arthur Hiller com a Ali MacGraw e o Ryan O’Neal, cujo slogan “Amar significa nunca ter que pedir desculpas” ficou famoso e inesquecível. Quem trai não ama. Quem trai uma vez, certamente traiu antes ou trairá outras vezes. Que espécie de caráter tem um traidor?

One thought on “Perl x C – Passagem de argumentos por referência

Leave a comment