[SP-pm] Coisas interessantes para fazer com closures [Was: Afinal, o que é Closures ?]

Luis Motta Campos luismottacampos em yahoo.co.uk
Segunda Dezembro 3 08:34:06 PST 2007


Lorn wrote:
> eu também :P
> 
> On Dec 3, 2007 10:38 AM, Gabriel Vieira <gabriel.vieira em gmail.com
> <mailto:gabriel.vieira em gmail.com>> wrote:
> 
>     Pois manda que sempre fico curioso =D
>     haha

EXEMPLO 1: Um iterador

sub iterator_factory {
  my ( $start, $end, $step ) = @_;

  return sub {
    return
      $start <= $end ? $start+=$step : undef;
  }
}

# Usa assim:

my $it = iterator_factory( 2, 20, .5 );
while( my $value = &$it ) {
  print $value;
}


# Um iterator infinito:
sub infinite_iterator_factory {
  my ( $start, $step ) = @_;

  return sub {
    return $start += $step;
  }
}

## Alguem se atreve a declarar um iterador multi-dimensional? :)

################################################################
EXEMPLO 2: Acesso aa base de dados:

#!perl
use strict;
use warnings;
use DBI;
use Data::Dumper;

# Isso declara um closure que produz closures que produz
# "database queries". Por exemplo:

sub query_factory_factory {
  my ( $dbh ) = @_;

  return sub {
    my ( $query, @bind_parameters ) = @_;
    my $sth;

    return sub {
        unless( defined( $sth ) && $sth->isa( 'DBI' ) ) {
            $sth->prepare( $query );
            $sth->execute( @bind_parameters );
        }
        return $sth->fetchrow_hashref;
    };
  };
}

# Conecta na base de dados #1:
my $db1 = DBI->connect( ... );
my $dbase1_query_factory = query_factory_factory( $db1 );

# Conecta na base de dados #2:
my $db2 = DBI->connect( ... );
my $dbase2_query_factory = query_factory_factory( $db2 );

# Query na base de dados #1:
my $q1 = $dbase1(
  q{SELECT a, b FROM table_1 WHERE a = ? AND b = ?},
  qw( parametros aqui )
);

# Agora $q1 eh uma referencia para uma subrotina:
while( my $row = &$q1 ){
  # imprime a referencia de hash retornada por &$q1
  print Dumper( $row );
}

# Eu omiti o tratamento de erros de acesso aa base de
# dados por brevidade.

Perguntas? :)

Putamplexos!
-- 
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}



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