[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