map ve grep — dizilerle çalışmak için Perl'in güçlü fonksiyonlarıdır:
my @nums = (1, 2, 3, 4, 5, 6); my @squared = map { $_ * $_ } @nums; # (1, 4, 9, 16, 25, 36) my @even = grep { $_ % 2 == 0 } @nums; # (2, 4, 6)
map ve grep blokları içinde $_ değişkeni varsayılan olarak mevcut elemanı içerir. $_'yi değiştirmek, dizi referans ile geçirildiğinde veya foreach aracılığıyla alias kullanıldığında, orijinal diziyi değiştirecektir.map her zaman bir dizi döndürür, grep ise orijinal dizinin bir alt kümesini döndürür.Soru: Aşağıdaki kod ne yapar ve neden?
my @nums = (1..5); my @result = map { $_++ } @nums; print "@nums ";
Cevap: Bu kod @nums dizisini değiştirmeyecektir. $_++ operatörü, blok içinde değişkenin değerini artırır fakat bu değişiklikler orijinal dizide kaydedilmez, çünkü map değiştirilmiş değeri döndürür, ancak orijinal dizi etkilenmez (alias kullanılmadığı sürece).
my @nums = (1..5); my @result = map { $_++ } @nums; # @result (1,2,3,4,5) olur, @nums değişmez print "@nums "; # Çıktı: 1 2 3 4 5
Hikaye Bir projede geliştirici,
map { $_++ } @arrayifadesinden sonra@arraydizisinin değişeceğini bekliyordu. Sonuç olarak, program eski değerlerle çalışmaya devam etti ve bu durum veri toplama sırasında yanlış sonuçlara yol açtı.
Hikaye Bir raporlama sisteminde diziyi
grepile filtrelerken blok içinde yanlışlıkla$result = $_atamasını yaptı; bu da tüm elemanların aynı değişkene yazılmasına sebep oldu ve veri kaynağını kaybetti. Bu durum hata ayıklamayı zorlaştırdı ve raporlamada kayıplara neden oldu.
Hikaye Bir entegrasyon scriptinde iç içe
mapkullanarak, iç bağlamın da ortak değişken$_ile çalıştığını unuttular; bu, elemanların değiştirilirken beklenmedik davranışlara neden oldu çünkü içmapsonuç dizisinde değerleri üzerine yazdı.