Perl'de dosyalarla çalışmak için open kullanılarak tanıtıcılar açılır. Standart tanıtıcıların (STDIN, STDOUT, STDERR) yanı sıra, kendi tanıtıcılarınızı oluşturabilir ve bunlarla yönetebilirsiniz.
Perl, farklı dosya türlerini ve kodlamalarını doğru bir şekilde işlemek için girdi-çıktı katmanları (:encoding, :utf8, :raw vb.) kavramını kullanır. Varsayılan olarak Perl, metin modunda (satır sonu dönüşü ile) veya ikili modda çalışabilir.
open my $fh, '<:encoding(UTF-8)', 'file.txt' or die $!; while (my $line = <$fh>) { print $line; } close $fh;
open my $fh, '<:raw', 'image.bin' or die $!; read($fh, my $data, -s 'image.bin'); close $fh;
Doğru katman seçimi (:raw ikililer için, :encoding(NAME) metin dosyaları için) okuma ve yazmanın doğru olmasını sağlar.
Eğer
open FH, '<', $fileyapısıyla bir dosya açarsak ve ikili verileri okursak, her zaman doğru sonucu mu alırız?
Cevap: Hayır! :raw belirtilmediği takdirde, Perl bazı platformlarda otomatik olarak satır sonu karakterlerini dönüştürür (örneğin, Windows'ta CRLF → LF). İkili dosyaları okuyabilmek için her zaman :raw modunu kullanın:
open my $fh, '<:raw', 'file.bin';
Hikaye
Bir kurumsal projede geliştiriciler kodlama belirtmeden metin loglarıyla çalışıyorlardı. Sonuç olarak, UTF-8'deki loglar bazen "bozuluyordu" —
readdosyası, Kiril karakterleri okunurken bozuldu, çünkü Perl baytları yanlış yorumladı. Hata,opençağrısında:encoding(UTF-8)katmanının açıkça eklenmesiyle düzeltildi.
Hikaye
Windows'ta ikili dosyaları kopyalarken, verileri
open FH, '<', 'binfile.dat'ile okuyup, mod belirtmeden yazıyorlardı. Program, CRLF satır sonu akışındaki değişim nedeniyle görüntüleri "bozuyordu", bu da geçersiz ikili verilere yol açıyordu.:rawkatmanı sorunu düzeltti.
Hikaye
Dış API, sadece UTF-8'de STDOUT çıktısı gerektiriyordu, fakat programcılar yazma katmanını değiştirmeden
binmode STDOUT, ':encoding(UTF-8)'açıkça uygulandıktan sonra sorun ortadan kalktı.