[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