ProgramlamaBackend geliştirici

Perl'de map ve grep listelerinin nasıl çalıştığı? Aralarındaki fark nedir ve bunları kullanırken beklenmedik yan etkilerden nasıl kaçınılır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

map ve grep — dizilerle çalışmak için Perl'in güçlü fonksiyonlarıdır:

  • map bir ifadeyi dizi içindeki her bir elemana uygular ve sonuçlarla yeni bir dizi döndürür.
  • grep ifadenin doğru değer döndürdüğü dizinin elemanlarını geri döndürür (filtreleme).

Kullanım örneği:

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)

Önemli

  • Kapsam: 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.
  • Dönüş değerleri: map her zaman bir dizi döndürür, grep ise orijinal dizinin bir alt kümesini döndürür.

Kandırmaca Soru

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).

Örnek:

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

Konunun inceliklerinden dolayı gerçek hataların örnekleri


Hikaye Bir projede geliştirici, map { $_++ } @array ifadesinden sonra @array dizisinin 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 grep ile 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 map kullanarak, 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ç map sonuç dizisinde değerleri üzerine yazdı.