การเข้าใจตัวดำเนินการเงื่อนไขเทอร์นารีใน Perl
: ปัญหาทั่วไปและทางแก้ไข
ภาษาโปรแกรม Perl
เป็นที่รู้จักกันดีในเรื่องความยืดหยุ่นและพลัง แต่ด้วยความยืดหยุ่นที่ยอดเยี่ยมก็มีความเป็นไปได้ที่จะเกิดความสับสน โดยเฉพาะเมื่อเกี่ยวข้องกับลำดับของตัวดำเนินการ หนึ่งในปัญหาทั่วไปที่นักพัฒนาพบเจอคือการใช้ตัวดำเนินการเงื่อนไขเทอร์นารี โดยเฉพาะเมื่อรวมเข้ากับการกำหนดค่า มาสำรวจปัญหาเฉพาะที่เกี่ยวกับตัวดำเนินการนี้และว่ามันสามารถนำไปสู่ผลลัพธ์ที่ไม่คาดคิดได้อย่างไร
ปัญหา: ผลลัพธ์ที่ทำให้เข้าใจผิด
สมมุติว่าคุณกำลังทำงานกับรหัส Perl
ส่วนหนึ่งและคุณตัดสินใจที่จะใช้ตัวดำเนินการเงื่อนไขเทอร์นารีเพื่อกำหนดค่าให้กับตัวแปรตามเงื่อนไข รหัสตัวอย่างด้านล่างแสดงถึงสถานการณ์นี้:
$condition ? $a = 2 : $a = 3;
print $a;
เมื่อคุณทำการรันรหัสนี้ คุณจะพบว่า ไม่ว่าจะค่า $condition
เป็นอะไร ผลลัพธ์ที่ได้มักจะเป็น 3
นี่อาจทำให้สับสนและนำไปสู่ความหงุดหงิดอย่างมากสำหรับนักพัฒนาที่พยายามตรวจสอบข้อผิดพลาดในรหัสของตน
มีอะไรผิดพลาดไป?
สาเหตุหลักของผลลัพธ์ที่ทำให้เข้าใจผิดอยู่ที่ ลำดับของตัวดำเนินการ ใน Perl
ตัวดำเนินการเงื่อนไขเทอร์นารี (?:
) สามารถสร้างผลลัพธ์ที่สามารถกำหนดค่าได้ ซึ่งบางครั้งนำไปสู่ผลลัพธ์ที่ไม่คาดคิดเนื่องจากวิธีการวิเคราะห์ของนิพจน์
คำสั่งจะถูกวิเคราะห์ดังนี้:
($condition ? $a = 2 : $a) = 3;
สิ่งนี้หมายความว่า:
- ถ้า
$condition
เป็นจริง จะทำการดำเนินการฝั่งซ้าย ซึ่งกลายเป็น($a = 2) = 3
ทำให้$a
ถูกตั้งค่าเป็น3
- ถ้า
$condition
เป็นเท็จ จะดำเนินการฝั่งขวา รleading to$a = 3
ดังนั้น โดยไม่คำนึงถึงค่าจริงของ $condition
$a
จะเป็น 3
เสมอ
ทางแก้ไข: การแก้ไขการกำหนดค่า
เพื่อให้การใช้ตัวดำเนินการเทอร์นารีถูกต้องในกรณีนี้ คุณต้องมั่นใจว่าการกำหนดเขียนในลักษณะที่เคารพต่อความคิดที่ตั้งใจไว้ นี่คือวิธีการทำให้ถูกต้อง:
$a = ($condition ? 2 : 3);
print $a;
การวิเคราะห์การแก้ไข
ด้วยวิธีการที่ถูกต้องนี้:
- นิพจน์
( $condition ? 2 : 3 )
จะถูกประเมินก่อน- หาก
$condition
เป็นจริง2
จะถูกกำหนดให้กับ$a
- หาก
$condition
เป็นเท็จ3
จะถูกกำหนดให้กับ$a
- หาก
- การกำหนดค่าในตอนนี้ชัดเจนและทำงานตามที่คาดหวัง
ข้อคิดที่สำคัญ
- เข้าใจลำดับของตัวดำเนินการ: ควรตระหนักเสมอว่าการวิเคราะห์นิพจน์ใน
Perl
เป็นอย่างไร โดยเฉพาะเมื่อรวมตัวดำเนินการ - ใช้วงเล็บเพื่อความชัดเจน: แม้ว่ากฎของลำดับตัวดำเนินการจะดูชัดเจน การใช้วงเล็บสามารถเพิ่มความสามารถในการอ่านและลดข้อผิดพลาดได้
- ทดสอบรหัสของคุณ: ทดสอบข้อสมมุติฐานของคุณเสมอ! การรันรหัสตัวอย่างเล็กน้อยสามารถช่วยให้เข้าใจพฤติกรรมก่อนที่จะนำไปใช้ในตรรกะที่ใหญ่ขึ้น
ความผิดพลาดง่าย ๆ นี้ทำให้เราไม่ทันตั้งตัวในสภาพแวดล้อมทางอาชีพ ดังนั้นการแชร์ทางแก้ไขนี้หวังว่าจะช่วยให้ผู้อื่นหลีกเลี่ยงปัญหาเดียวกันได้ ขอให้สนุกกับการเขียนโค้ด!