วิธีการใช้งาน ExpressionScript
From LimeSurvey Manual
ภาพรวมของสิ่งที่อธิบายไปก่อนหน้านี้
หากคุณอ่านตามโครงสร้างของคู่มือ LimeSurvey มาโดยตลอด แสดงว่าคุณคุ้นเคยกับคำศัพท์ของ LimeSurveyแล้ว จากนั้นเราได้อธิบายเกี่ยวกับนิพจน์และตัวแปรเพื่อเรียนรู้วิธีปรับปรุงแบบสำรวจของเรา ในส่วนถัดไป เราได้อธิบายประเภทและความหมายของการไฮไลต์ไวยากรณ์เพื่อเรียนรู้วิธีแก้ไขข้อผิดพลาดทางไวยากรณ์
เมื่อเข้าใจแนวคิดพื้นฐานเหล่านี้แล้ว เราจะไปดูตัวอย่างและคำอธิบายว่านิพจน์ทำงานอย่างไรภายใน LimeSurvey
การไฮไลต์ไวยากรณ์
ภาพหน้าจอต่อไปนี้เป็นตัวอย่าง แต่ไม่ได้แสดงค่าของทูลทิป ทูลทิปคือกล่องข้อมูลที่แสดงขึ้นเมื่อคุณเลื่อนเมาส์ไปวางเหนือคำที่เป็นตัวหนาและมีสี
เนื่องจากมีการไฮไลต์ไวยากรณ์นี้ จึงเขียนนิพจน์ที่ถูกต้องได้ง่ายมาก แม้แต่นิพจน์ที่ซับซ้อน แม้ว่าทีมงาน LimeSurvey วางแผนที่จะพัฒนา Expression Builder GUI แต่คุณสามารถใช้การไฮไลต์ไวยากรณ์ที่มีอยู่เพื่อค้นหาและแก้ไขการพิมพ์ผิดได้อย่างรวดเร็ว นอกจากนี้ คุณยังสามารถใช้ทูลทิปเพื่อตรวจสอบความถูกต้องของนิพจน์ (เช่น ยืนยันว่าคุณเลือกตัวแปรที่ต้องการแล้ว)
ในแต่ละตัวอย่างจะมีสามคอลัมน์:
- Source - คือข้อความดิบที่คุณจะป้อนลงในช่องคำถามของ LimeSurvey
- Pretty Print - คือข้อความที่คุณป้อนในรูปแบบที่ไฮไลต์ไวยากรณ์แล้ว
- โปรดทราบว่านิพจน์จะแสดงด้วยพื้นหลังสีแทน แต่ไม่มีเครื่องหมายปีกกาล้อมรอบในการไฮไลต์นี้
- เนื่องจาก EM รองรับการแทนที่แบบเรียกซ้ำ การแสดงเครื่องหมายปีกกาในการไฮไลต์จะทำให้เกิดข้อผิดพลาดทางไวยากรณ์
- Result - คือผลลัพธ์ที่สร้างขึ้นเมื่อ EM ประมวลผลต้นฉบับ
- ทุกอย่างที่สามารถแทนที่ได้อย่างถูกต้องจะถูกแทนที่
- นิพจน์ที่มีข้อผิดพลาดจะแสดงในบรรทัดเดียวกันพร้อมการไฮไลต์ไวยากรณ์ ข้อผิดพลาดจะถูกล้อมด้วยกรอบเส้นสีแดง
ไวยากรณ์ที่ถูกต้อง
ด้านล่างนี้เป็นตัวอย่างของไวยากรณ์ที่ถูกต้อง:
- Values: แสดงให้เห็นว่าตัวแปรที่รู้จักจะแสดงด้วยสีต่างกัน ขึ้นอยู่กับว่าได้ตั้งค่าไว้ในหน้าปัจจุบันหรือไม่
- คุณสมบัติคำถาม: แสดงให้เห็นว่าสามารถใช้เครื่องหมายจุด (dot notation) เข้าถึงคุณสมบัติบางอย่างของคำถามได้
- Math: แสดงให้เห็นว่ารองรับการคำนวณทั้งแบบพื้นฐานและแบบซับซ้อน
- TextProcessing: แสดงฟังก์ชันประมวลผลข้อความบางส่วนที่มีให้ใช้งาน
- Dates: แสดงฟังก์ชันที่เกี่ยวกับวันที่สองฟังก์ชันที่มีให้ใช้งาน
- Conditional: แสดงการใช้งานฟังก์ชัน if() โดยสามารถซ้อนตัวเลือกได้
- Tailored paragraph: คุณสามารถปรับแต่งรายงานได้อย่างเต็มที่ตามค่าที่ได้กรอกไว้ก่อนหน้า
- EM processes within strings: แสดงให้เห็นว่าสามารถแทนที่ค่าภายในสตริงได้ ตัวอย่างนี้สร้างชื่อรูปภาพที่ปรับแต่งตามผู้ตอบ
- EM doesn't process curly braces like these: แสดงให้เห็นว่าหากมีการ escape เครื่องหมายปีกกา หรือมีช่องว่างระหว่างนิพจน์กับเครื่องหมายปีกกา ES จะไม่ประมวลผลนิพจน์นั้น

ไวยากรณ์ EM ที่มีข้อผิดพลาด
ต่อไปนี้คือตัวอย่างข้อผิดพลาดที่พบบ่อยเมื่อพิมพ์นิพจน์ ES โปรดทราบว่าทูลทิปจะให้ข้อมูลเพิ่มเติม
- Inline Javascript ที่ลืมเว้นวรรคหลังเครื่องหมายปีกกา
- เนื่องจาก "document.write" ปรากฏทันทีหลังเครื่องหมายปีกกา EM จึงคิดว่าเป็นนิพจน์ และใส่กรอบสีแดงให้ "document" และ "write" เพราะเป็นตัวแปรและฟังก์ชันที่ไม่ได้กำหนดตามลำดับ
- ตัวแปร ฟังก์ชัน และตัวดำเนินการที่ไม่รู้จักหรือสะกดผิด
- ในที่นี้เราลืมว่าเราใช้ชื่อตัวแปร "gender" ไม่ใช่ "sex" แต่ EM ตรวจพบข้อผิดพลาดนั้น และยังใส่กรอบสีแดงให้ '++' เพราะไม่ใช่ตัวดำเนินการที่รองรับ
- แจ้งเตือนหากใช้ = แทน eq หรือทำการกำหนดค่า
- โปรดทราบว่า '=' และ '+=' เป็นข้อความสีแดงแทนที่จะเป็นสีดำ หากคุณเลื่อนเมาส์ไปวางเหนือตัวดำเนินการเหล่านั้น คุณจะเห็นคำเตือนว่าคุณกำลังกำหนดค่า
- จำนวนอาร์กิวเมนต์ของฟังก์ชันไม่ถูกต้อง
- if() รับ 3 อาร์กิวเมนต์ แต่ถูกกำหนดให้ 4 ดังนั้นการเลื่อนเมาส์ไปวางเหนือ "if" ที่มีกรอบสีแดงจะอธิบายข้อผิดพลาดและแสดงไวยากรณ์ที่รองรับ
- sum() รับอาร์กิวเมนต์ได้ไม่จำกัดจำนวน แต่เรามีเครื่องหมายจุลภาคเกินก่อนวงเล็บปิด จึงถูกใส่กรอบสีแดง
- วงเล็บไม่ตรงกัน
- นี่เป็นหนึ่งในข้อผิดพลาดที่พบบ่อยที่สุดเมื่อเขียนนิพจน์
- ตัวอย่างนี้แสดงการขาดวงเล็บปิดสองตัวอย่าง และการมีวงเล็บปิดเกินหนึ่งตัวอย่าง
- ไวยากรณ์ที่ไม่รองรับ
- หากคุณใช้ตัวดำเนินการหรือเครื่องหมายวรรคตอนที่ ES ไม่รองรับ ระบบจะใส่กรอบสีแดงให้
- การกำหนดค่าที่ไม่ถูกต้อง
- ตัวแปรบางตัวเป็นแบบ readWrite และสามารถเปลี่ยนค่าได้ ส่วนตัวแปรอื่นเป็นแบบอ่านอย่างเดียว
- หากคุณพยายามเปลี่ยนค่าของตัวแปรแบบอ่านอย่างเดียว จะไม่สามารถทำได้ EM จะใส่กรอบสีแดงให้กับความพยายามนั้น
- หากคุณพยายามกำหนดค่าให้สมการหรือสตริง คุณจะได้รับข้อผิดพลาดเช่นกัน

ตัวอย่าง "สด" ของการไฮไลต์ไวยากรณ์พร้อมทูลทิปที่ใช้งานได้
| ต้นฉบับ | Pretty Print | ผลลัพธ์ |
|---|---|---|
| ตัวอย่างไวยากรณ์ที่ถูกต้องพร้อมทูลทิป สวัสดี {if(gender=='M','Mr.','Mrs.')} {surname}, ตอนนี้เวลา {date('g:i a',time())}. คุณทราบหรือไม่ว่า {sum(numPets,numKids)} ลูกและสัตว์เลี้ยงของคุณอยู่ที่ไหน? | ตัวอย่างไวยากรณ์ที่ถูกต้องพร้อมทูลทิป สวัสดี if(gender == 'M','Mr.','Mrs.') surname, ตอนนี้เวลา date('g:i a',time()). คุณทราบหรือไม่ว่า sum(numPets,numKids) ลูกและสัตว์เลี้ยงของคุณอยู่ที่ไหน? | ตัวอย่างไวยากรณ์ที่ถูกต้องพร้อมทูลทิป สวัสดี Mr. Smith, ตอนนี้เวลา 6:07 am. คุณทราบหรือไม่ว่า 3 ลูกและสัตว์เลี้ยงของคุณอยู่ที่ไหน? |
| ตัวอย่างข้อผิดพลาดที่พบบ่อยเพื่อให้คุณดูทูลทิป ตัวแปรที่ใช้ก่อนที่จะประกาศ: {notSetYet} ฟังก์ชันที่ไม่รู้จัก: {iff(numPets>numKids,1,2)} ตัวแปรที่ไม่รู้จัก: {sum(age,num_pets,numKids)} จำนวนพารามิเตอร์ไม่ถูกต้อง: {sprintf()},{if(1,2)},{date()} กำหนดค่าให้ตัวแปรแบบอ่านอย่างเดียว:{TOKEN:ATTRIBUTE_1+=10},{name='Sally'} วงเล็บไม่สมดุล: {pow(3,4},{(pow(3,4)},{pow(3,4))} | นี่คือข้อผิดพลาดที่พบบ่อย เพื่อให้คุณเห็นทูลทิป ตัวแปรที่ใช้ก่อนที่จะถูกประกาศ: notSetYet ฟังก์ชันที่ไม่รู้จัก: iff(numPets > numKids,1,2) ตัวแปรที่ไม่รู้จัก: sum(age,num_pets,numKids) จำนวนพารามิเตอร์ไม่ถูกต้อง: sprintf(),if(1,2),date() การกำหนดค่าให้ตัวแปรแบบอ่านอย่างเดียว:TOKEN:ATTRIBUTE_1+=10,name='Sally' วงเล็บไม่สมดุล: pow(3,4,(pow(3,4),pow(3,4)) | นี่คือข้อผิดพลาดที่พบบ่อย เพื่อให้คุณเห็นทูลทิป ตัวแปรที่ใช้ก่อนที่จะถูกประกาศ: notSetYet ฟังก์ชันที่ไม่รู้จัก: iff(numPets > numKids,1,2) ตัวแปรที่ไม่รู้จัก: sum(age,num_pets,numKids) จำนวนพารามิเตอร์ไม่ถูกต้อง: sprintf(),if(1,2),date() การกำหนดค่าให้ตัวแปรแบบอ่านอย่างเดียว:TOKEN:ATTRIBUTE_1+=10,name='Sally' วงเล็บไม่สมดุล: pow(3,4,(pow(3,4),pow(3,4)) |
| นี่คือตัวอย่างบางส่วนของไวยากรณ์ที่ไม่รองรับ ไม่รองรับ '++', '--', '%',';': {min(++age, --age,age % 2);} และไม่รองรับ '|', '&', '^': {(sum(2 | 3,3 & 4,5 ^ 6)}} และไม่รองรับอาร์เรย์: {name[2], name['mine']} | นี่คือตัวอย่างบางส่วนของไวยากรณ์ที่ไม่รองรับ ไม่รองรับ '++', '--', '%',';': min( ++ age, -- age,age % 2) ; และไม่รองรับ '|', '&', '^': (sum(2 | 3,3 & 4,5 ^ 6)} และไม่รองรับอาร์เรย์: name [ 2 ] ,name [ 'mine' ] | นี่คือตัวอย่างบางส่วนของไวยากรณ์ที่ไม่รองรับ ไม่รองรับ '++', '--', '%',';': min( ++ age, -- age,age % 2) ; และไม่รองรับ '|', '&', '^': (sum(2 | 3,3 & 4,5 ^ 6)} และไม่รองรับอาร์เรย์: name [ 2 ] ,name [ 'mine' ] |
ตัวอย่างการปรับแต่งข้อความ
"เรียนคุณ {Mr}/{Mrs} Smith..."
ใช้ฟังก์ชัน if() เพื่อเลือกแสดง 'Mr.' หรือ 'Mrs.' ตามเงื่อนไข
ไวยากรณ์คือ if(test,do_if_true,do_if_false)
| # | รหัส | คำถาม | ประเภท |
| 1 | gender | What is your gender? | เพศ |
| 2 | example1 | Dear {if(gender=='M','Mr.','Mrs.')} Smith, ... | ข้อความแบบยาว |

ดังที่เห็นด้านล่าง "Mr" และ "Mrs" จะถูกปรับตามคำตอบที่ผู้ตอบเลือกในคำถาม "gender"

"เรียนคุณ {Mr}/{Mrs} Smith..." ใน email เชิญชวน
คุณสามารถใช้ตัวอย่างข้างต้นใน email เชิญชวนได้ โดยใช้แอตทริบิวต์จากตารางโทเคน ใช้ฟังก์ชัน if() เพื่อเลือกว่าจะใช้ 'Mr.' หรือ 'Mrs.' ในอีเมล
ไวยากรณ์คือ "if(test,do_if_true,do_if_false)"
| # | แอตทริบิวต์ | ค่า |
| 1 | นามสกุล | Smith |
| 2 | ที่อยู่อีเมล์ | test@test.com |
| 3 | ATTRIBUTE_2 | M |
ข้อความใน email เชิญชวน:
Dear {if(ATTRIBUTE_2=='M','Mr','Mrs')} {LASTNAME},
you have been invited to participate in a survey:
https:/...

การดูอีเมล:

ตัวอย่างการคำนวณ / การประเมิน
คำนวณค่าการประเมินขณะทำงานและจัดเก็บผลลัพธ์ในข้อมูลแบบสำรวจ
ตัวอย่างนี้ใช้ฟีเจอร์ทั้งหมดของ EM รวมถึงความสัมพันธ์กัน การปรับแต่งข้อความ (Tailoring) และคำถามประเภทสมการ
ตัวอย่างนี้ยังแสดงให้เห็นว่าฟีเจอร์ทั้งหมดรองรับ JavaScript ดังนั้นหากคุณใช้ฟีเจอร์เหล่านี้ในหน้าเดียวกัน หน้านั้นจะเปลี่ยนแปลงแบบไดนามิกเมื่อผู้ตอบกำหนดและเปลี่ยนคำตอบ
| # | รหัส | คำถาม | ประเภท | ความสัมพันธ์กัน |
| 1 | numKids | How many children do you have? | อินพุตตัวเลข | 1 |
| 2 | kid1 | How old is your first child? | อินพุตตัวเลข | numKids >= 1 |
| 3 | kid2 | How old is your second child? | อินพุตตัวเลข | numKids >= 2 |
| 4 | kid3 | How old is your third child? | อินพุตตัวเลข | numKids >= 3 |
| 5 | kid4 | How old is your fourth child? | อินพุตตัวเลข | numKids >= 4 |
| 6 | sumKidAges | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK)} | สมการ | 1 |
| 7 | kidSummary | You said that you have {numKids}. {if(numKids==1,'child','children')}. {if(numKids>1,implode(' ','The sum of ages of your first ',min(numKids,4),' kids is ',sumKidAges,'.'),' ')} | การแสดงผลข้อความ | 1 |
หากต้องการดาวน์โหลดตัวอย่างนี้ โปรดคลิกลิงก์ต่อไปนี้: Assessments_survey_example
ด้านล่างนี้คือภาพหน้าจอของคำถามตัวอย่าง จะเห็นได้ว่า EM ไฮไลต์ไวยากรณ์ในทุกช่องที่อาจมีการปรับแต่งข้อความ (tailoring) ในที่นี้คุณจะเห็นตัวอย่างการไฮไลต์ไวยากรณ์ของความสัมพันธ์กัน (Relevance) ชนิดของคำถามแบบสมการ (Equation) และการแทนที่ค่าภายในคำถาม นอกจากนี้ คุณยังสามารถใช้การแทนที่ค่าภายในส่วนวิธีใช้ (Help) การแสดงส่วนหัวของกลุ่ม (Group header display) ข้อความต้อนรับ และข้อความลงท้ายได้
ในตัวอย่างถัดไป เนื่องจากความสัมพันธ์กันคือ {numKids >= 2) คำถามนี้จะแสดงก็ต่อเมื่อผู้ตอบแจ้งว่ามีบุตรอย่างน้อยสองคนเท่านั้น

ด้านล่างนี้ คุณจะเห็นว่าตัวแปรแต่ละตัวมีคำต่อท้าย .NAOK ติดอยู่ ทั้งนี้เนื่องจากวิธีที่ EM รองรับความสัมพันธ์กันแบบต่อเนื่อง (cascading relevance) หากไม่มี .NAOK ผลรวมจะถูกคำนวณก็ต่อเมื่อผู้ตอบบอกว่ามีบุตร 4 คนเท่านั้น (กล่าวคือ เมื่อตัวแปรทั้งหมดมีความสัมพันธ์กัน) การใช้ .NAOK หมายความว่าเราต้องการคำนวณผลรวมแม้ว่าตัวแปรทั้งหมดหรือบางส่วนจะไม่เกี่ยวข้องกันก็ตาม (กล่าวคือ "Not Applicable" (NA) ถือว่าใช้ได้ (OK))
อย่างไรก็ตาม แอตทริบิวต์ .NAOK มีผลเฉพาะกับการส่งตัวแปรเข้าสู่ EM เท่านั้น หากผู้ตอบบอกในตอนแรกว่ามีบุตร 3 คนและกรอกอายุของแต่ละคน จากนั้นเปลี่ยนใจและบอกว่ามี 2 คน เราไม่ต้องการให้แสดงผลรวมของค่าทั้ง 3 ที่กรอกไว้ เพราะบุตรคนที่สามถือว่า "ไม่เกี่ยวข้อง" (not applicable) ในกรณีนี้แล้ว:

นิพจน์แต่ละรายการจะถูกแยกสีด้วยพื้นหลังสีแทน (tan) จะเห็นว่ามีนิพจน์แยกกันสามรายการในที่นี้ รายการสุดท้ายมีข้อความที่จะแสดงตามเงื่อนไขเฉพาะเมื่อผู้ตอบมีบุตรมากกว่าหนึ่งคนเท่านั้น

ต่อไปนี้คือภาพหน้าจอของแบบสำรวจขณะใช้งานจริง
เมื่อเข้าสู่หน้านี้ครั้งแรก คุณจะเห็นดังนี้ โปรดสังเกตว่าข้อความแสดงว่า "You have 0 children" แทนที่จะเป็น "You have 0 child"

หากฉันเปลี่ยนค่าจำนวนบุตรเป็น 1 การแสดงผลจะเปลี่ยนเป็นดังนี้ทันที ทั้งที่อยู่ในหน้าเดียวกัน:

สังเกตว่าตอนนี้ไวยากรณ์ถูกต้องแล้ว: "You have 1 child"
ตอนนี้ฉันเปลี่ยนค่าจำนวนบุตรเป็น 3 และการแสดงผลจะเปลี่ยนเป็นดังนี้ทันที
สังเกตว่าตอนนี้คุณจะเห็นข้อความตามเงื่อนไขที่ด้านล่าง: "The sum of ages of your first 3 kids is 0."
ต่อไปฉันจะกรอกอายุของบุตรสมมติ และจะได้การแสดงผลที่รวมอายุของพวกเขาดังนี้:

คะแนนและการแสดงผลจะอัปเดตทันทีเมื่อฉันกรอกค่า ดังนั้นคุณจึงสามารถใช้วิธีนี้เพื่อแสดงผลรวมสะสมของคะแนนการประเมินได้
ตอนนี้ฉันเปลี่ยนค่าจำนวนบุตรเป็น 2 การแสดงผลจะเปลี่ยนเป็นดังนี้:

สังเกตว่าแม้ว่าฉันจะกรอกค่า 5.5 สำหรับบุตรคนที่สามไว้ แต่ตอนนี้รายงานจะรวมเฉพาะค่าของบุตร 2 คนแรกเท่านั้น
สาเหตุคือค่าที่ 3 ไม่เกี่ยวข้องอีกต่อไป และ EM จะละเว้นค่าที่ไม่เกี่ยวข้องโดยอัตโนมัติ
หากฉันเปลี่ยนจำนวนบุตรกลับเป็น 3 ฉันจะเห็นค่า 5.5 ที่เคยกรอกไว้อีกครั้ง ดังนั้นข้อมูลที่ฉันกรอกในหน้านี้จะไม่สูญหายไป
อย่างไรก็ตาม หากฉันไปยังหน้าถัดไปหรือหน้าก่อนนี้ ค่าที่ไม่เกี่ยวข้องทั้งหมดจะถูกตั้งเป็น NULL ในเซสชันและในฐานข้อมูล ดังนั้น หากฉันคงค่าไว้ที่ 2 ไปยังหน้าถัดไป แล้วกลับมาและระบุว่ามีบุตร 3 คน ฉันจะไม่เห็นอายุ 5.5 อีกต่อไป
กรอกข้อมูลและดูรายงานที่เปลี่ยนแปลงแบบไดนามิกของข้อมูลที่กรอกในหน้าเดียวกัน
ตัวอย่างนี้แสดงกระบวนการปรับแต่งข้อความ (Tailoring) ภายใน LimeSurvey
หากต้องการดาวน์โหลดตัวอย่างนี้ ให้คลิกลิงก์ต่อไปนี้: ตัวอย่างแบบสำรวจการเปลี่ยนแปลงแบบไดนามิก
นี่คือหน้าตาของหน้าในตอนเริ่มต้น คุณจะเห็นเฉพาะคำถามที่ถามว่าคุณอาศัยอยู่ในเมืองใด:

เมื่อคุณเริ่มป้อนคำตอบ กระบวนการปรับแต่งเนื้อหา (tailoring) ก็จะเริ่มทำงานเช่นกัน:

เมื่อคุณป้อนคำตอบ ตารางที่ด้านล่างของหน้าจะอัปเดตเพื่อแสดงรหัสคำตอบและค่าของคำตอบของคุณ

ตัวอย่างการดีบักที่พบบ่อย
คำสั่ง if() แบบซ้อนกัน (ตรรกะเงื่อนไข)
EM รองรับฟังก์ชัน "if(test,do_if_true,do_if_false)" เพื่อให้คุณสามารถทำตรรกะเงื่อนไขหรือการปรับแต่งเนื้อหาได้ ฟังก์ชันนี้สามารถซ้อนกันได้เพื่อให้ได้ผลเทียบเท่ากับ "if { } else if { } else { }" EM จะแจ้งให้คุณทราบหากวงเล็บไม่สมดุลกัน (เช่น ขาดวงเล็บปิดขวา) หรือหากมีวงเล็บปิดขวาเกินมา คุณควรลองนับวงเล็บขณะเขียนคำสั่ง if แบบซ้อนกันที่ยาว จากนั้นบันทึก ตรวจสอบข้อผิดพลาดของไวยากรณ์ และแก้ไขหากพบข้อผิดพลาด มาลองตรวจสอบตัวอย่างด้านล่างไปด้วยกัน
คุณสามารถเข้าถึงกลุ่มคำถามที่ใช้ด้านล่างนี้ได้จากที่นี่: ตัวอย่างแบบสำรวจการปรับแต่งเนื้อหา.lsg
ก่อนอื่น เมื่อยังไม่ได้ป้อนอะไร คุณจะเห็นเพียง "สวัสดี"

หากคุณป้อนชื่อ ระบบจะแสดงว่า "สวัสดี {name}"

หากคุณป้อนอายุ คุณจะได้รับข้อความที่ปรับแต่งตามว่าคุณเป็นเด็กวัยก่อนเข้าเรียนหรือไม่:

วัยเรียน วัยรุ่น หรือผู้ใหญ่ นี่คือวัยรุ่นที่ต้องการไม่เปิดเผยตัวตน:

นี่คือไฟล์ตรรกะของกลุ่ม ดังที่เห็นในคำถามแบบ "if-based" มีคำสั่ง if แบบซ้อนกันตามอายุของบุคคลนั้น

เมื่อคุณแก้ไขคำถามนี้ครั้งแรก มีแนวโน้มว่าในบางจุดคุณจะใส่จำนวนวงเล็บผิด นี่คือสิ่งที่เกิดขึ้นหากวงเล็บน้อยเกินไป:

หากคุณวางเมาส์เหนือคำว่า "if" ซึ่งถูกล้อมด้วยกรอบสีแดง จะแสดงข้อความ "Parentheses not balanced" ในกรณีนี้ ควรมีวงเล็บปิดสี่ตัวหลังคำว่า "already an adult!" แต่มีเพียงสามตัว
ในทางกลับกัน หากคุณมีวงเล็บปิดขวาเกินมา วงเล็บนั้นจะถูกล้อมด้วยกรอบสีแดง ดังนี้:

เมื่อคุณกำลังแก้ไขคำถามจริง คำถามจะมีลักษณะดังนี้:

