[Cascavel-pm] RE: [Cascavel-pm] Passando diversos arraies para uma função !

Solli Moreira Honorio shonorio em terra.com.br
Segunda Junho 23 20:27:26 CDT 2003


Pessoal,

Achei interessante as alternativas, mas o código que estou tentando
desenvolver tem pretenções universais, por isto eu gostaria de adotar
'the best Perl practices' :)

Bom, andei pensando (xiiiii)... Pq não usar referências com thread ? E
resolvi ir ao extremo, criei uns testes malucos, como no código abaixo.
O resultado foi aparentemente bom, mas surgiu a mensagem 'Scalars
leaked: 1', no qual estou pesquisando ainda.

A questão é: Pensando mais na questão de segurança do código, do que na
performance, vocês acreditam que pode ser seguro fazer algo como no
código louco exemplo que estou enviando, ou utilizar hash para passar
estas arraies.

Abraços,

Solli

#===== Código =====
use 5.008;
use strict;
use threads;
use warnings;
use diagnostics;
use threads::shared;

my @Threads;
Start (\@Threads);
End   (\@Threads);

sub End
{
    my ( $T ) = @_;
    foreach my $Thread ( @{$T} )
    {
        my $Temp = $Thread->join();
        print $Temp;
    }
}


sub Start
{
    my ( $T ) = @_;
    my %Hash;
    @{$Hash{'Frutas'}{'Elemento1'}}  = qw (Abacaxi Banana Morango);
    @{$Hash{'Frutas'}{'Elemento2'}}  = qw (Amora Caqui Jaboticaba);
    @{$Hash{'Verbos'}{'Elemento1'}}  = qw (Amar Casar Catar);
    @{$Hash{'Verbos'}{'Elemento2'}}  = qw (Agir Nadar Tentar);
    @{$Hash{'Nomes'}{'Elemento1'}}   = qw (Pedro Paulo Joana);
    @{$Hash{'Nomes'}{'Elemento2'}}   = qw (Maria Lucia Cristina);
    @{$Hash{'Cidades'}{'Elemento1'}} = qw (Campinas Maresias Poa);
    @{$Hash{'Cidades'}{'Elemento2'}} = qw (Americana Jales Urania);

    foreach my $Elemento (sort keys %Hash)
    {
        push @{$T}, threads->create(\&Test, $Elemento,
\@{$Hash{$Elemento}{'Elemento1'}}, \@{$Hash{$Elemento}{'Elemento2'}});
    }

}

sub Test
{
    my ($Elemento, $T01, $T02) = @_;
    print "Inicio de processamento do elemento $Elemento...\n";
    sleep (30);
    print "Final de processamento do elemento $Elemento...\n";
    return "\tO elemento $Elemento continha : " . join (' ', @{$T01}) .
" "  . join (' ', @{$T02}) . "\n";
}

#==== output ===
Inicio de processamento do elemento Cidades...
Inicio de processamento do elemento Frutas...
Inicio de processamento do elemento Nomes...
Inicio de processamento do elemento Verbos...
Final de processamento do elemento Cidades...
	O elemento Cidades continha : Campinas Maresias Poa Americana
Jales Urania
Final de processamento do elemento Frutas...
	O elemento Frutas continha : Abacaxi Banana Morango Amora Caqui
Jaboticaba
Final de processamento do elemento Nomes...
	O elemento Nomes continha : Pedro Paulo Joana Maria Lucia
Cristina
Final de processamento do elemento Verbos...
Scalars leaked: 1
Scalars leaked: 1
Scalars leaked: 1
Scalars leaked: 1
	O elemento Verbos continha : Amar Casar Catar Agir Nadar Tentar


> -----Original Message-----
> From: cascavel-pm-admin em mail.pm.org
[mailto:cascavel-pm-admin em mail.pm.org]
> On Behalf Of Fabiano Reese Righetti
> Sent: Monday, June 23, 2003 4:01 PM
> To: cascavel-pm em mail.pm.org
> Subject: Re: [Cascavel-pm] Passando diversos arraies para uma função !
> 
> On 23 Jun 2003 14:10:10 -0300, Nelson Ferraz wrote
> > > > Bom,  normalmente sempre  passo referencias  para as  funções, é
> mais
> > > > rápido, e por este motivo nunca  tive nenhum problema, mas agora
> estou
> > > > programando com thread  e estou evitando esta técnica  para
evitar
> dor
> > > > de cabeça no futuro, mas estou tento agora.
> > >
> > >     Nessa situação, é preciso usar referências!
> >
> > Partindo do principio que ele _nao quer_ usar referencias, uma
possivel
> > solucao seria transformar os arrays em strings (join), e de volta em
> > arrays (split)...
> >
> > []s
> >
> > Nelson
> 
>    Olá.
>    Partindo deste ponto de vista. Podemos também "forçar a coisa",
> utilizando-se do jeitinho brasileiro :). Algo como:
> 
> &bla(@array, $elemento);
> 
> sub bla {
>    my @array = @_;
>    my @elemento = pop(@array);
> }
> 
> ou com dois arrays:
> 
> &bla(@array01, @array02, $#array02);
> 
> sub bla {
>    my @array01 = @_;
>    my $tamanho = pop(@array01);
>    my @array02 = @array01[$#array01-$tamanho..$#array01];
>    splice(@array01,$#array01-$tamanho,$tamanho+1);
> }
> 
> []'s
> --Fabiano Reese Righetti - http://cascavel.pm.org/~fabiano/
> 
> 
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em mail.pm.org
> http://cascavel.pm.org/mailman/listinfo/cascavel-pm
> 
> ---
> Incoming mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.491 / Virus Database: 290 - Release Date: 6/18/2003
> 

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.491 / Virus Database: 290 - Release Date: 6/18/2003
 




Mais detalhes sobre a lista de discussão Cascavel-pm