[SP-pm] Sinal de metodo nao existente
Adriano Ferreira
a.r.ferreira em gmail.com
Sábado Abril 26 14:36:10 PDT 2008
2008/4/25 Lucas Mateus <lucasmateus.oliveira at gmail.com>:
> use Net::FTP;
>
> BEGIN {
> $SIG{__DIE__} = 'IGNORE'
> }
>
> my $ftp = Net::FTP->new();
>
> $ftp->abcd;
>
> print "TESTE\n";
> exit(1);
>
>
> Alguem sabe dizer se esse erro emite sinal ?
Eu acabei de lembrar de um 'hack' horrível para fazer com que Net::FTP
ignore completamente a falta de um método chamado sobre suas
instâncias, como é o caso do "$ftp->abcd" no seu exemplo.
Isto pode ser feito através do Class::BlackHole
(http://search.cpan.org/perldoc?Class::BlackHole).
Abaixo está um ligeira modificação do seu exemplo. Ao invés de setar
em um BEGIN, o $SIG{__DIE__} para 'IGNORE' que não funciona, o
Class::BlackHole é carregado (via require) e adicionado ao final do
@ISA do Net::FTP. Daí em diante, qualquer chamada de método
inexistente em instâncias de Net::FTP será complacente e não fará
absolutamente nada (inclusive não morrerá com "Can't locate object
method "abcd" via package "Net::FTP"").
Foi necessário transformar o
Net::FTP->new()
para
Net::FTP->new( $host )
pois do contrário o construtor do Net::FTP retorna 'undef' por não
achar um servidor ftp válido. (Sobre "undef", método nenhum pode ser
chamado.)
Experimente este código em um arquivo "lucas.pl"
$ perl lucas.pl ; echo $?
TESTE
1
#############
# lucas.pl
use Net::FTP;
#BEGIN {
# $SIG{__DIE__} = 'IGNORE'
# }
BEGIN {
require Class::BlackHole;
push @Net::FTP::ISA, qw( Class::BlackHole )
}
my $ftp = Net::FTP->new( 'cpan.hexten.net' );
$ftp->abcd;
print "TESTE\n";
exit(1);
#############
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
Mais detalhes sobre a lista de discussão SaoPaulo-pm