Sorunun Tarihi:
Perl, başlangıçta metin akışlarını etkili bir şekilde işlemek için bir araç olarak yaratıldı, bu nedenle girdi/çıktı (I/O) mekanizmaları dilin çekirdeğinde en iyi şekilde işlenmiş olanlar arasındadır. Unicode'un geliştirilmesi ve çeşitli girdi-çıktı katmanlarının ortaya çıkmasıyla birlikte, verilerin kaybını veya hasarını önlemek için doğru kodlama seçimi ve akışların yönetimi önemli bir sorun haline geldi.
Sorun:
Dosyaların okunması/yazılması sırasında yanlış seçilen kodlama, verilerin bozulmasına (özellikle ulusal sembollerle) yol açmakta; akışların işlenmesindeki hatalar (örneğin, dosyaların başarıyla açıldığına dair kontrol yapılmaması) genellikle bug ve zafiyetlerin sebebi olmaktadır.
Çözüm:
Dosyaları açmak için üç argümanlı open kullanılır ve bu yöntem daha güvenli ve evrenseldir (yolların ve modların yorumlanmasında zafiyetleri önler). Kodlamalarla doğru etkileşim için katmanlar kullanılır (örneğin, "<:encoding(UTF-8)"). Her zaman dosyanın açılmasının/kapatılmasının başarıyla gerçekleşip gerçekleşmediğini kontrol etmek ve gerekli çalışma modlarını açıkça belirtmek gereklidir.
Örnek:
open my $fh, '<:encoding(UTF-8)', $filename or die "Cannot open $filename: $!"; while (my $line = <$fh>) { chomp $line; # satır sonunu kaldırır print "$line "; } close $fh or warn "Cannot close $filename: $!";
Anahtar özellikler:
Kullanıcı girişini doğrudan open'a geçirebilir miyiz?
Cevap: Hayır! Bu, zafiyetlere (örneğin, güvensiz bir alias ile shell komutlarının yürütülmesi) ve yollarla ilgili hatalara yol açar. Açık üç argümanlı sözdizimini kullanın.
Eğer kodlama katmanı belirtilmezse ve dosya UTF-8 ise ne olur?
Cevap: Perl baytları latin1 olarak yorumlayacaktır, bu da özellikle ulusal alfabelerin kullanılması durumunda okuma/yazmada bozulmuş sembollere yol açar.
Dosyanın düzgün yazıldığından emin olmak için sadece close çağırmak yeterli midir?
Cevap: Hayır. Close'dan sonra dönen değeri kontrol etmek gerekir. Eğer yazım sırasında bir hata oluşursa, Perl yalnızca başarısız close'dan sonra $! ile bildirecektir. Örneğin:
close $fh or die "Write failed: $!";
Log işleyicisi dosyayı open FILE ile "file.txt" açar, başarıyı kontrol etmez, verileri bayt bayt işler – sonucunda, Kiril sembolleri karışır, bazı satırlar kaybolur.
Artılar:
Eksiler:
Tüm dosya işlemleri, kodlamayı belirterek üç argümanlı open ile gerçekleştirilir. Tüm hatalar işlenir ve kaydedilir, sonuç verileri her zaman yerel için doğrudur.
Artılar:
Eksiler: