IO :: Mark.

Lesen Sie ungehinderbare DateiHandles nicht destruktiv
Jetzt downloaden

IO :: Mark. Ranking & Zusammenfassung

Anzeige

  • Rating:
  • Lizenz:
  • Perl Artistic License
  • Name des Herausgebers:
  • Andy Armstrong
  • Website des Verlags:
  • http://search.cpan.org/~andya/

IO :: Mark. Stichworte


IO :: Mark. Beschreibung

Lesen Sie unseekable DateiHandles, die nicht zerstörerisch sind Stellen Sie sich vor, Sie haben eine Funktion get_image_size. Sie geben ein FileHandle an, das auf einer Bilddatei geöffnet ist, und er gibt die Abmessungen des Image.Imagine auch, dass Sie eine offene Buchse haben, auf der Sie ein Bild erhalten möchten. Sie möchten die Abmessungen dieses Bildes kennen und auch seine Daten erfassen. Wenn Sie den Socket-Griff an Get_IMAGE_SIZE angeben, werden Sie einige Daten von dieser Sockel verbrauchen - genug, um den Bildkopf zu lesen und seine Abmessungen auszuarbeiten. Leider sind alle Daten, die get_image_size liest, verloren; Sie kennen die Abmessungen des Bildes, aber Sie haben einige seiner Daten verloren und Sie können den Sockel nicht zurückspulen, um zum Start des Bildes zurückzukehren. Sockel sind nicht suchen. sub send_image {meine $ Sockel = Schicht; # Das funktioniert gut ... meine ($ breite, $ höhe) = get_image_size ($ Sockel); # ... aber die Daten, die wir hier senden, fehlen, was auch immer Header # Bytes get_image_size verbraucht hat. send_image_data (width, $ Höhe, $ Sockel); } Sie können das gesamte Bild in einer Datei einpufferen, die Datei öffnen und diesen Griff an Get_Image_size weitergeben. Das funktioniert, bedeutet aber, dass wir die Bildgröße nicht berechnen können, bis wir das gesamte Bild haben. Wenn wir anstelle einer Bilddatei mit Streaming-Audio befunden haben, könnte der Eingabestrom effektiv unendlich sein - was es in einer Datei caching in einer Datei Caching erstellen würde. Wir könnten get_image_size umschreiben, um die Daten auch immer von der Buchse zu sperren. Dann können wir diese Daten senden, bevor wir den Rest der Daten von der Buchse senden. Das bedeutet wahrscheinlich, in einer Funktion herumzuwenden, die wir nicht geschrieben haben, und kuppeln ihre Schnittstelle fest an unsere Anwendung. Es wäre gut, das zu vermeiden. Hier ist die Lösung: Verwenden Sie IO :: Mark; sub send_image {meine $ Sockel = Schicht; mein $ mark = io :: mark-> neu ($ socker); # Das funktioniert gut ... meine ($ width, $ eignung) = get_image_size ($ mark); $ mark-> schließen; # ... und so tut dies! send_image_data (width, $ Höhe, $ Sockel); } Ein io :: mark ist ein io :: -Reg, der Daten vom Griff zurückgibt, von dem er erstellt wurde, ohne dass diese Daten aus der Sicht des ursprünglichen Griffs verbraucht werden. Nutzen Sie den expliziten Anruf, um zu schließen, sobald wir fertig sind markieren. Solange der klonierte IO :: Mark-Griff in Umfang ist, und öffnen Sie alle vom ursprünglichen Griff gelesenen Daten im Speicher, falls sie auch aus dem klonierten Griff gelesen werden muss. Um zu verhindern, dass dies entweder explizit den klonierten Griff schließt, oder erlauben Sie es, den Umfang auszugleichen.Synopsis verwenden IO :: Mark; Sub untersuchen {MY $ FH = Schicht; meine $ mark = io :: mark-> neu ($ FH); mein $ buf; # Liest von $ FH via $ Mark $ Mark-> Lesen ($ BUF, 1000, 0); # Tun Sie etwas mit $ BUF # Wenn $ mark außer Scope-$ FH ist · Perl.


IO :: Mark. Zugehörige Software