Io :: Mark.

ler filehandles não excedentes não destrutivos
Baixe Agora

Io :: Mark. Classificação e resumo

Propaganda

  • Rating:
  • Licença:
  • Perl Artistic License
  • Nome do editor:
  • Andy Armstrong
  • Site do editor:
  • http://search.cpan.org/~andya/

Io :: Mark. Tag


Io :: Mark. Descrição

Leia filehandles unseekable não-destrutiva Imagine que você tem uma função get_image_size. Você passá-lo um filehandle que está aberto em um arquivo de imagem e retorna as dimensões do image.Imagine também que você tem uma tomada aberta em que você está esperando para receber uma imagem. Você gostaria de saber as dimensões do que a imagem, e também capturar seu data.If você passar o identificador de soquete para get_image_size ele vai consumir alguns dados de que a tomada - o suficiente para ler o cabeçalho de imagem e trabalho fora suas dimensões. Infelizmente, todos os dados que get_image_size lê está perdido; você conhece as dimensões da imagem, mas você perdeu alguns dos seus dados e você não pode rebobinar o soquete para voltar para o início da imagem; soquetes não são pesquisável. sub send_image {my $ socket = shift; # Isso funciona bem ... minha ($ largura, altura $) = get_image_size ($ socket); # ... mas os dados que enviamos aqui vai estar ausente tudo o cabeçalho # bytes get_image_size consumido. send_image_data ($ largura, altura $, $ soquete); } Você poderia amortecer a imagem inteira em um arquivo, abra o arquivo e passar essa alça para get_image_size. Isso funciona, mas meio que não podemos calcular o tamanho da imagem até que tenhamos toda a imagem. Se em vez de um arquivo de imagem estávamos lidando com streaming de áudio fluxo de entrada pode ser efetivamente infinito - o que tornaria o cache em um arquivo inconvenient.We poderia reescrever get_image_size para armazenar em cache todos os dados que ele lê da tomada. Então poderíamos enviar os dados antes de enviar o restante dos dados da tomada. Isso provavelmente significa cavar em torno dentro de uma função que não escrever e acoplamento sua interface com força para a nossa aplicação. Seria bom evitar that.Here é a solução: use IO :: Mark; sub send_image {my $ socket = shift; my $ mark = IO :: Mark-> new ($ socket); # Isso funciona bem ... minha ($ largura, altura $) = get_image_size ($ marca); $ Mark> close; # ... e assim faz isso! send_image_data ($ largura, altura $, $ soquete); } Uma IO :: Mark é um IO :: Handle que retorna dados da alça do qual ele foi criado sem consumir que os dados a partir do ponto de vista do handle.Note original chamada explícita para perto, uma vez que é feito com $ marca. Enquanto o clonado IO :: Mark alça está no escopo e abrir todos os dados lidos a partir da alça originais que serão colocados na memória no caso ele precisa ser lido a partir da alça clonado também. Para evitar que isso seja explicitamente fechar o identificador clonado ou permitir que ele sair do uso scope.SYNOPSIS IO :: Mark; sub examine {my $ fh = shift; my $ mark = IO :: Mark-> new ($ fh); my $ buf; # Lê $ fh via $ marca de US $ mark> read ($ buf, 1000, 0); # Fazer alguma coisa com $ buf # Quando $ marca sai do escopo $ fh há dados parecem ter sido # consumida a partir de $ fh} Requisitos: · Perl.


Io :: Mark. Software Relacionado