ทำไม Perl Map ของฉันถึงไม่คืนค่าอะไร

หากคุณกำลังทำงานกับ Perl และพบว่าฟังก์ชัน map ของคุณคืนค่ารายการว่าง คุณไม่ได้อยู่คนเดียว ปัญหานี้มักจะสับสนกับนักพัฒนา โดยเฉพาะเมื่อพวกเขาพยายามจัดการสตริงภายในอาเรย์ ในโพสต์บล็อกนี้ เราจะสำรวจกรณีเฉพาะของการกรองอักขระที่ไม่จำเป็นออกจากสตริง และเราจะอธิบายวิธีการแก้ไขปัญหาทั่วไปนี้ทีละขั้นตอน

ปัญหา

เรามาดูโค้ดที่ทำให้เกิดปัญหานี้:

@filtered = map {s/ //g} @outdata;

ในบรรทัดนี้:

  • คุณกำลังพยายามกรองเนื้อหาของ @outdata ซึ่งเป็นอาเรย์ของสตริงที่มีข้อมูล XML
  • คุณต้องการลบทุกกรณีของ   ซึ่งย่อมาจากช่องว่างที่ไม่สามารถเปลี่ยนบรรทัดได้ใน HTML

อย่างไรก็ตาม แทนที่จะคืนค่าอาเรย์ที่แก้ไขแล้ว โค้ดของคุณกลับส่งคืนรายการว่าง ดังนั้น อะไรคือสิ่งที่ผิดพลาด?

เข้าใจปัญหา

ปัญหาหลักอยู่ที่วิธีการทำงานของตัวดำเนินการแทนที่ s/// ใน Perl นี่คือการแจกแจงเล็กน้อย:

  • ตัวดำเนินการ s/// จะปรับแต่งสตริงในที่ (ในกรณีนี้คือ ตัวแปรเริ่มต้น $_) แต่จะ ไม่ คืนค่าสตริงที่แก้ไขสำหรับการใช้งานในฟังก์ชัน map
  • แทนที่จะคืนค่า มันจะส่งกลับจำนวนการเปลี่ยนแปลงที่ทำกับสตริง ซึ่งหมายความว่าหากไม่มีการเปลี่ยนแปลงเกิดขึ้น ค่าที่ส่งคืนอาจเป็นศูนย์หรืออาจไม่ส่งคืนสตริงที่คาดหวังสำหรับการใช้งานต่อไป

ดังนั้นการใช้ map ในลักษณะนี้จึงไม่เก็บสตริงที่แก้ไขแล้วลงใน @filtered ตามที่ตั้งใจไว้ ทำให้ได้รายการว่าง

วิธีแก้ไข

เพื่อให้ได้ผลลัพธ์การกรองที่ต้องการ คุณจำเป็นต้องมั่นใจว่าการแทนที่คืนค่าสตริงที่แก้ไขหลังจากการดำเนินการ นี่คือต้องทำ:

ไวยากรณ์ที่ถูกต้องสำหรับฟังก์ชัน Map

ปรับเปลี่ยนโค้ดของคุณให้รวมตัวแปร $_ ที่จุดสิ้นสุดของบล็อก map:

@filtered = map {s/ //g; $_} @outdata;

คำอธิบายของโค้ดที่แก้ไข

  1. s/ //g; - ส่วนนี้ทำการแทนที่ โดยลบทุกกรณีของ   ออกจาก $_
  2. $_ - ตอนนี้ส่งคืนค่าของ $_ (สตริงที่แก้ไขแล้ว) สำหรับทุกการวนซ้ำของ map นี่ทำให้แน่ใจว่ารายการที่ได้ (@filtered) ประกอบไปด้วยอิลิเมนต์ที่เปลี่ยนแปลงมาจาก @outdata

เคล็ดลับเพิ่มเติม

  • จำไว้เสมอว่าเมื่อใช้ตัวดำเนินการแทนที่ใน map หากคุณต้องการคืนค่าสตริงที่แก้ไข คุณจะต้องใส่มันไว้ที่จุดสิ้นสุดของบล็อก
  • คุณยังสามารถเพิ่มการตรวจสอบความถูกต้องเพื่อตรวจสอบว่า @outdata ไม่ว่างหรือถูกต้องก่อนที่จะดำเนินการได้

สรุป

โดยสรุป หากคุณพบว่าคำสั่ง map ของ Perl คืนค่ารายการว่าง ให้ตรวจสอบการดำเนินการแทนที่ของคุณให้แน่ใจ โดยการคืนค่า $_ หลังจากการแทนที่ของคุณ คุณสามารถประมวลผลและกรองข้อมูลของคุณได้อย่างมีประสิทธิภาพตามที่ต้องการ การปรับเปลี่ยนที่ง่ายแต่สำคัญนี้จะช่วยให้คุณหลีกเลี่ยงความหงุดหงิดจากผลลัพธ์ว่างเปล่า และให้ความสนใจไปที่งานที่ซับซ้อนกว่าได้

ตอนนี้ รหัสกันสนุกกับ Perl!