IO :: Mark

Lees niet-destructief onoverselijk bestand
Download nu

IO :: Mark Rangschikking & Samenvatting

Advertentie

  • Rating:
  • Vergunning:
  • Perl Artistic License
  • Naam uitgever:
  • Andy Armstrong
  • Uitgever website:
  • http://search.cpan.org/~andya/

IO :: Mark Tags


IO :: Mark Beschrijving

Lees niet-destructief onkoopbaar filehandles Stel je voor dat je een functie krijgt get_image_size. U passeert het een filehandle dat op een afbeeldingsbestand is geopend en het retourneert de afmetingen van de afbeelding. Emagine ook dat u een open stopcontact hebt waarop u een afbeelding verwacht te ontvangen. Je zou graag de afmetingen van die afbeelding willen weten en ook zijn gegevens vastleggen. Als je de sockethendel doorgeeft aan Get_Image_Size, consumeert je wat gegevens uit die socket - genoeg om de beeldkoptekst te lezen en de dimensies uit te werken. Helaas zijn alle gegevens die worden getapt_image_size leest verloren; U kent de afmetingen van het beeld, maar u bent een deel van zijn gegevens verloren en u kunt de aansluiting niet terugspoelen om terug te gaan naar het begin van de afbeelding; Sockets zijn niet op zoek. Sub Send_Image {My $ Socket = Shift; # Dit werkt prima ... mijn ($ breedte, $ hoogte) = get_image_size ($ socket); # ... maar de gegevens die we hier sturen, ontbreekt welke kopteller # bytes get_image_size wordt geconsumeerd. Send_Image_Data ($ breedte, $ hoogte, $ socket); } U kunt de volledige afbeelding in een bestand bufferen, het bestand openen en deze handvat doorgeven om_image_size te krijgen. Dat werkt, maar betekent dat we de afbeeldingsgrootte niet kunnen berekenen totdat we het hele beeld hebben. Als we in plaats van een afbeeldingsbestand hebben om te maken met streaming-audio, kan de ingangsstroom effectief oneindig zijn - wat het in een bestand ongemakkelijk zou maken. We kunnen GET_IMAGE_SIZE herschrijven om te cachen welke gegevens die het van het stopcontact leest. Dan kunnen we die gegevens verzenden voordat we de rest van de gegevens van de socket verzenden. Dat betekent waarschijnlijk in een functie in een functie graven en de interface niet stevig aan onze applicatie hebben gekoppeld. Het zou goed zijn om dat te vermijden. Hier is de oplossing: gebruik IO :: Mark; Sub Send_Image {My $ Socket = Shift; mijn $ mark = io :: mark-> nieuw ($ socket); # Dit werkt prima ... mijn ($ breedte, $ hoogte) = get_image_size ($ markering); $ mark-> sluiten; # ... en dit doet dit ook! Send_Image_Data ($ breedte, $ hoogte, $ socket); } Een IO :: Mark is een IO :: Handgreep die gegevens van de hendel retourneert van waaruit het is gemaakt zonder te consumeren dat gegevens vanuit het oogpunt van het originele handvat.noot de expliciete oproep om te sluiten zodra we klaar zijn met $ markering. Zolang de Cloned IO :: Mark Hendel in scope is en geopende gegevens die zijn gelezen van de originele handgreep, worden in het geval dat het ook van de gekloonde handvat moet worden gelezen. Om te voorkomen dat dit expliciet de gekloonde handvat sluit of het mogelijk is om uit de scope te gaan. Synopsis Gebruik IO :: Mark; subonderzoek {Myâ $ fh = shift; Mijn $ Mark = io :: Mark-> Nieuw ($ FH); mijn $ buf; # Leest van $ FH via $ mark $ mark-> lezen ($ buf, 1000, 0); # Doe iets met $ buf # wanneer $ merkteken uit de scope van de scope $ FH gaat, geen gegevens lijken # te hebben geconsumeerd van $ FH} vereisten: · Perl


IO :: Mark Gerelateerde software