[SP-pm] bons hábitos em perl->sugestões?

Luis Motta Campos luismottacampos at yahoo.co.uk
Thu Jul 31 22:57:04 PDT 2008


Thiago, me desculpe a demora. Eu andei postando para uns novatos na 
lista, sobre erros e sobre o Data::Serializer, no outro thread... :)

Thiago Rondon wrote:
> Como acessar efetuar isto no open ? Honestanemente, nem procurei nem
>  procurei a documentação do open agora. Simplesmente nunca vi em
> algum código espeficicar por exemplo O_NONBLOCK para acessar um
> device com open!
> 
> Aqui fica minha dúvida, como reproduzir o codigo abaixo com open ?
> 
> use Fcntl; sysopen(MODEM, "/dev/cua0", O_NONBLOCK|O_RDWR);

É engraçado que você me colou a receita proposta pelo Perl Cookbook para 
"non-blocking I/O", sem olhar a documentação... mas a tua é pior que a 
do Cookbook, já que você não trata erros:

http://www.unix.com.ua/orelly/perl/cookbook/ch07_15.htm

diz

use Fcntl;
sysopen(MODEM, "/dev/cua0", O_NONBLOCK|O_RDWR)
     or die "Can't open modem: $!\n";

Bom, eu nunca gostei do Cookbook exatamente por causa destas soluções 
meia-boca. Ele tenta resolver o problema, mas é sempre sub-ótimo.

Na minha humilde opinião de quem quase não usa "receitas-de-bolo", se 
você escreve um Cookbook deveria se certificar que você tem a melhor 
solução possível para um dado problema.

O que você está procurano é um módulo chamado FileHandle, que é parte 
dos módulos do Perl Core desde 17/Out/1994:

http://perldoc.perl.org/FileHandle.html

E a forma "boa" de se fazer Non-Blocking I/O é

use FileHandle;
my $fh = new FileHandle '/dev/cua0', O_NONBLOCK | O_RDWR;

Algumas vantagens:

1. Isto é uma chamada de alto nível, não aquela porcaria
    complicada de manter que você viu no Cookbook;
2. Posso fazer coisas bacanas, como setar autoflush: $fh->autoflush(1);
3. Tenho 'non-blocking' print() e printf();
4. Consigo fechar um FileHandle com close() e ainda saber se o
    SO fez a coisa certa pelas variáveis de erro do perl;
5. Ganho todas as vantagens da implementação dos módulos IO::*,
    que são infinitamente mais simples e mais poderosos que o
    sys{open,read,write}();
6. Tiro vantagen do PerlIO, o novo subsistema de IO do Perl
    (a partir do 5.6.X, se eu não estou enganado).

 > Talvez eu seja um brincalhão em Perl. ;) Eu me divirto no Perl, então
 >  vamos nos divertir!

Eu sou um Engenheiro de Software. Eu não brinco em serviço. ;-)

Espero que isso faça você parar de usar sysopen() para sempre.
Putamplexos.
-- 
Luis Motta Campos is a software engineer,
Perl Programmer, foodie and photographer.


More information about the SaoPaulo-pm mailing list