Perl'de dosya tanımlayıcıları (filehandles), fiziksel veya sanal bir dosyayla ilişkilendirilen özel nesnelerdir (global veya leksikal değişkenler). Kaynak sızıntılarını ve güvenlik ihlallerini önlemek için dosyaların doğru bir şekilde açılması, kontrol edilmesi ve kapatılması çok önemlidir.
Doğru çalışma örneği:
open my $fh, '<', 'myfile.txt' or die "Dosya açılamadı: $!"; while (my $line = <$fh>) { print $line; } close $fh or warn "Dosya kapatılamadı: $!";
İnce detaylar:
open my $fh, ...). Global tanımlayıcılar (OPEN FILE, ...) eski olarak kabul edilmektedir.or die/or warn kullanın.close ile kapatılmalı ve olası hatalar işlenmelidir.binmode $fh.
open FH, ...veopen my $fh, ...yapıları arasındaki fark nedir ve neden ikinci seçenek önerilmektedir?
Cevap: open my $fh, ... yapısı, leksik olarak sınırlı bir dosya tanımlayıcısı yaratmaktadır; yani bu, yalnızca geçerli blok/alt program içinde çalışır ve görünüm dışına çıktığında otomatik olarak yok edilir. Bu, tanımlayıcıların yanlışlıkla örtüşmesini önler, global filehandles isim çatışmalarından korur ve güvenilirliği artırır.
open FH, '<', 'file.txt'; # Global tanımlayıcı! Kaçınılması önerilir. open my $fh, '<', 'file.txt'; # Leksikal, güvenli.
Hikaye
Büyük bir projede aynı global tanımlayıcıların (OPEN LOG, ...) kullanılmasına izin verildi. Sonuç olarak, paralel istekler yanlışlıkla yanlış dosyalara yazıyor, bu da logların kaybına veya karışmasına neden oluyordu.
Hikaye
Geliştirici dosyanın açılış başarısını kontrol etmeyi unuttu; sonuç olarak, dosya mevcut değilse, hata başka bir yerde kaydediliyordu (örneğin, loglar yanlış yere yazılıyordu, başkalarının dosyaları siliniyordu vb.).
Hikaye
close çağrısının eksikliği, sunucuda dosyaların toplu işlenmesi sırasında tanımlayıcıların tükenmesine yol açıyordu — sunucu "donmaya" ve büyük veri hacimlerinde çökmeye başlıyordu.