Soru tarihi:
While döngüsü, Perl'de veri işleme, dosya okuma ve koleksiyonlar üzerinde yineleme yapmak için kullanılan temel kontrol yapılarına biridir. Dosya veya diğer yinelemelerden satır okurken varsayılan olarak değerleri kabul eden özel $_ değişkeni ile yakın entegrasyon içerisindedir.
Sorun:
$_ değişkeninin yanlış kullanımı, dosyaların açık tanımlayıcılar olmadan okunması ve döngülerin hatalı bir şekilde sonlandırılması, satır işleme hatalarına ve veri kaybına yol açar. Varsayılan otomatik işleme ile $_ kullanımı esnekliği artırsa da, özellikle döngü içinde dize modifikasyonları ve iç içe döngülerde kod yazarken dikkatli olunmasını gerektirir.
Çözüm:
Dosyaları okumak için genellikle şu ifade kullanılır:
while (<FILEHANDLE>) { # ... }
veya giriş akışından ya da komut dosyasına geçirilen dosya listesinden okumak için sadece while (<>) şeklinde kullanılabilir. Böyle bir döngü içinde Perl, okunan satırı otomatik olarak $_ değişkenine yerleştirir, bu da düzenli ifadeleri, değiştirmeleri ve diğer işlemleri kullanmayı kolaylaştırır. Değişkeni açıkça belirtmek gerekiyorsa, while (my $line = <FILEHANDLE>) yapısı kullanılır.
Kod örneği:
open my $fh, '<', 'file.txt' or die $!; while (<$fh>) { chomp; # $_ ile çalışır print "Satır: $_ "; } close $fh;
Anahtar özellikler:
While döngüsü içinde $_ değiştirilirse ne olur?
Döngü içinde $'nin değiştirilmesi, yalnızca tek bir yineleme bağlamında değişkenin değerini etkiler, okunan dosyayı etkilemez. Ancak $'yi tekrar kullanmak, birden fazla veri kaynağıyla aynı anda çalışırken kafa karıştırıcı olabilir.
Açık bir dosya olmadan while (<>) kullanılırsa ne olur?
<> operatörü, açık bir dosya olmadan STDIN'den ya da komut dosyası çalıştırılırken @ARGV'de belirtilen dosyalardan okur. Hiçbir şey belirtilmemişse, klavyeden giriş bekler.
While içinde kaldırmak için chomp kullanmak zorunda mıyım?
Hayır, zorunda değilsiniz, ancak chomp olmadan her satır
yeni satır karakterini içerecektir. Bu sıklıkla beklenmeyen sonuçlara neden olur (örneğin, yazdırma sırasında çift yeni satır aktarımı).
** Olumsuz durum
Logları analiz eden bir betikte, while (<FILE>) içinde chomp eklemeyi unuttuk, bu nedenle konsol çıktısında gereksiz yeni satırlar görünüyordu.
Artılar:
Eksiler:
** Olumlu durum
Geliştirici, her zaman my $line = <$fh> ile açık değişken tanımı yapar ve satır okunduktan sonra hemen chomp kullanır.
Artılar:
Eksiler: