ทำไม 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;
คำอธิบายของโค้ดที่แก้ไข
- s/ //g; - ส่วนนี้ทำการแทนที่ โดยลบทุกกรณีของ
ออกจาก$_
- $_ - ตอนนี้ส่งคืนค่าของ
$_
(สตริงที่แก้ไขแล้ว) สำหรับทุกการวนซ้ำของ map นี่ทำให้แน่ใจว่ารายการที่ได้ (@filtered
) ประกอบไปด้วยอิลิเมนต์ที่เปลี่ยนแปลงมาจาก@outdata
เคล็ดลับเพิ่มเติม
- จำไว้เสมอว่าเมื่อใช้ตัวดำเนินการแทนที่ใน
map
หากคุณต้องการคืนค่าสตริงที่แก้ไข คุณจะต้องใส่มันไว้ที่จุดสิ้นสุดของบล็อก - คุณยังสามารถเพิ่มการตรวจสอบความถูกต้องเพื่อตรวจสอบว่า
@outdata
ไม่ว่างหรือถูกต้องก่อนที่จะดำเนินการได้
สรุป
โดยสรุป หากคุณพบว่าคำสั่ง map ของ Perl คืนค่ารายการว่าง ให้ตรวจสอบการดำเนินการแทนที่ของคุณให้แน่ใจ โดยการคืนค่า $_
หลังจากการแทนที่ของคุณ คุณสามารถประมวลผลและกรองข้อมูลของคุณได้อย่างมีประสิทธิภาพตามที่ต้องการ การปรับเปลี่ยนที่ง่ายแต่สำคัญนี้จะช่วยให้คุณหลีกเลี่ยงความหงุดหงิดจากผลลัพธ์ว่างเปล่า และให้ความสนใจไปที่งานที่ซับซ้อนกว่าได้
ตอนนี้ รหัสกันสนุกกับ Perl!