วิธีใช้:นิพจน์เงื่อนไข
![]() | หน้าคำอธิบายนี้เป็นคู่มือบอกวิธี ซึ่งบอกรายละเอียดกระบวนการหรือกระบวนวิธีของบางส่วนของบรรทัดฐานและวัตรของวิกิพีเดีย ไม่ใช่ส่วนหนึ่งของนโยบายและแนวปฏิบัติของวิกิพีเดีย
|
หน้านี้จะอธิบายวิธีการใช้ฟังก์ชันตัวแจงส่วนต่างๆ เพื่อแสดงผลลัพธ์ที่แตกต่างกันตามเงื่อนไขที่ตรวจพบในหน้าหรือแม่แบบ.
ต่อไปนี้เป็นสรุปโดยย่อของฟังก์ชันเหล่านี้ในแง่ของวิธีการจัดการอินพุต (ชื่อฟังก์ชันมีลิงก์ไปยังคำอธิบายโดยละเอียดเพิ่มเติมซึ่งพบได้ด้านล่างในหน้านี้):
#if
ตรวจสอบค่าความจริงของสตริง#ifeq
ตรวจสอบว่าสตริงหรือตัวเลขสองตัวเท่ากันหรือไม่#switch
เปรียบเทียบสตริงกับชุดค่าที่เป็นไปได้#expr
ประเมินการแสดงออกทางคณิตศาสตร์#ifexpr
ประเมินนิพจน์ทางคณิตศาสตร์และดำเนินการกับค่าความจริงของผลลัพธ์#iferror
ตรวจสอบว่าสตริง (มักจะเป็นนิพจน์ภายใน#expr
) ทำให้เกิดข้อผิดพลาดของตัวแยกวิเคราะห์#ifexist
ตรวจสอบว่าหน้าที่มีชื่อเรื่องนั้นมีอยู่ในวิกิหรือไม่ (รวมถึงไฟล์รูปภาพ/สื่อ)
สำหรับการใช้งานฟังก์ชันเหล่านี้ในตาราง โปรดดูที่วิธีใช้:ผังเงื่อนไข
สาระสำคัญ
[แก้]รูปแบบพื้นฐาน (และการใช้งาน) ของฟังก์ชันแต่ละอย่างมีดังนี้:
{{#if: สตริงทดสอบ | ค่าถ้าเป็นจริง | ค่าถ้าเป็นเท็จ }}
- (เลือกค่าใดค่าหนึ่งจากสองค่าขึ้นอยู่กับว่าสตริงทดสอบนั้นเป็นจริงหรือเท็จ)
{{#ifeq: สตริง 1 | สตริง 2 | ค่าถ้าเท่ากัน | ค่าถ้าไม่เท่ากัน }}
- (เลือกค่าใดค่าหนึ่งจากสองค่าโดยพิจารณาว่าสตริงทั้งสองเท่ากันหรือไม่ โดยจะทำการเปรียบเทียบเชิงตัวเลขทุกครั้งที่ทำได้)
{{#switch: สตริงทดสอบ | case1 = ค่าสำหรับเคส 1 | ... | default }}
- (เลือกระหว่างทางเลือกหลายทางโดยอิงจากค่าของสตริงทดสอบ ซึ่งโดยพื้นฐานแล้วจะเทียบเท่ากับชุดการทดสอบ
#ifeq
แต่มีประสิทธิภาพมากกว่ามาก)
- (เลือกระหว่างทางเลือกหลายทางโดยอิงจากค่าของสตริงทดสอบ ซึ่งโดยพื้นฐานแล้วจะเทียบเท่ากับชุดการทดสอบ
{{#expr: การแสดงออก }}
- (ประเมินนิพจน์ที่กำหนด ดูรายละเอียดใน วิธีใช้:การคำนวณ)
{{#ifexpr: การแสดงออก | ค่าถ้าเป็นจริง | ค่าถ้าเป็นเท็จ }}
- (เลือกค่าใดค่าหนึ่งจากสองค่าโดยอิงตามค่าความจริงของนิพจน์ที่ประเมินแล้ว)
{{#iferror: สตริงทดสอบ | ค่าถ้าเกิดข้อผิดพลาด | ค่าถ้าไม่มีข้อผิดพลาด }}
- (เลือกค่าใดค่าหนึ่งจากสองค่าขึ้นอยู่กับว่าสตริงทดสอบสร้างข้อผิดพลาดของตัวแยกวิเคราะห์หรือไม่)
{{#ifexist: ชื่อหน้า | ค่าถ้ามีอยู่ | ค่าถ้าไม่มีอยู่ }}
- (เลือกค่าใดค่าหนึ่งจากสองค่าขึ้นอยู่กับการมีอยู่ของหน้าที่มีชื่อเรื่องที่กำหนดไว้)
โปรดทราบว่าค่า "จริง" จะถูกตีความแตกต่างกันมากโดยฟังก์ชัน #if
ที่ใช้สตริงเป็นฐานและฟังก์ชัน #expr
และ #ifexpr
ที่เน้นตัวเลข สตริงจะถือว่าเป็นจริงหากมีอักขระที่ไม่ใช่ช่องว่างอย่างน้อยหนึ่งตัว (ดังนั้น ตัวอย่างเช่น ฟังก์ชัน #if
จะตีความสตริง "0" และ "เท็จ" ว่าเป็นค่าจริง ไม่ใช่เท็จ) สตริงใดๆ ที่มีเฉพาะช่องว่างหรือไม่มีอักขระเลยจะถือว่าเป็นเท็จ (ดังนั้น #if
จึงตีความ " " และ "" รวมถึงพารามิเตอร์ที่ไม่ได้กำหนดเป็นค่าเท็จ) ในทางกลับกัน ในนิพจน์ที่ประเมินโดย #expr
และ #ifexpr
ตัวดำเนินการบูลีน เช่น and
, or
และ not
จะตีความค่าตัวเลข 0 เป็นเท็จ และตัวเลขอื่นๆ เป็นจริง ในแง่ของเอาต์พุต การดำเนินการบูลีนจะส่งคืน 1 สำหรับค่าจริง และส่งคืน 0 สำหรับค่าเท็จ (และตัวดำเนินการตัวเลขจะถือว่าเป็นตัวเลขทั่วไป) สตริงที่ไม่ใช่ตัวเลข (รวมถึงการใช้งานสตริงว่างและพารามิเตอร์ที่ไม่ได้กำหนดส่วนใหญ่) จะทำให้ #expr
และ #ifexpr
รายงานข้อผิดพลาด
โปรดทราบด้วยว่าช่องว่างนำหน้าและต่อท้ายทั้งหมดในแต่ละส่วนของการเรียกใช้ฟังก์ชันตัววิเคราะห์จะถูกลบออก ทำให้สามารถจัดรูปแบบการเรียกใช้ด้วยช่องว่างเพิ่มเติมเพื่อให้สามารถอ่านได้ดีขึ้น ตัวอย่างเช่น:
{{#if: {{{xx|}}}
| ค่าพารามิเตอร์ xx เป็นจริง
| ค่าพารามิเตอร์ xx เป็นเท็จ
}}
ที่นี่ มีเพียงช่องว่างในสตริง "ค่าพารามิเตอร์ xx เป็นจริง" และ "ค่าพารามิเตอร์ xx เป็นเท็จ" เท่านั้นที่มีความสำคัญ ช่องว่างอื่นๆ ทั้งหมดจะถูกละเว้น ดังนั้น โครงสร้างด้านบนจึงเทียบเท่ากับการเรียกต่อไปนี้:
{{#if:{{{xx|}}}|ค่าพารามิเตอร์ xx เป็นจริง|ค่าพารามิเตอร์ xx เป็นเท็จ}}
ในทุกส่วนของการเรียกฟังก์ชันตัววิเคราะห์ที่คาดว่าจะมีสตริง สามารถใช้สตริงตัวอักษร การเรียกแม่แบบการเรียกฟังก์ชันตัววิเคราะห์ หรือ เมจิกเวิร์ดอื่นๆ
การใช้ #if
[แก้]- ดูเพิ่ม: แม่แบบ
{{if}}
ฟังก์ชัน #if
จะเลือกทางเลือกหนึ่งจากสองทางเลือกตามค่าความจริงของสตริงทดสอบ
{{#if: สตริงทดสอบ | ค่าถ้าเป็นจริง | ค่าถ้าเป็นเท็จ }}
ตามที่อธิบายไว้ข้างต้น สตริงจะถือว่าเป็นจริงหากมีอักขระที่ไม่ใช่ช่องว่างอย่างน้อยหนึ่งตัว สตริงใดๆ ที่มีเฉพาะช่องว่างหรือไม่มีอักขระเลยจะถือว่าเป็นเท็จ
ค่าพารามิเตอร์ที่ไม่ได้กำหนดนั้นเป็นเรื่องยุ่งยาก: ถ้าพารามิเตอร์ตำแหน่งแรกไม่ได้ถูกกำหนดไว้ในการเรียกแม่แบบ {{{1}}}
จะประเมินผลเป็นสตริงตัวอักษร "{{{1}}}" (นั่นคือ สตริง 7 อักขระที่มีเครื่องหมายวงเล็บปีกกาสามชุดรอบตัวเลข 1) ซึ่งเป็นค่าจริง (ปัญหานี้เกิดขึ้นกับทั้งพารามิเตอร์ที่มีชื่อและแบบตำแหน่งพารามิเตอร์) แต่ {{{1|}}}
จะประเมินผลเป็นสตริงว่าง (ค่าเท็จ) เพราะอักขระแถบแนวตั้งหรือท่อ "|"
ที่ตามหลังชื่อพารามิเตอร์ทันทีจะระบุค่าเริ่มต้น (ในที่นี้คือสตริงว่างเพราะไม่มีอะไรอยู่ระหว่างท่อและวงเล็บปีกกาปิดตัวแรก) เป็นค่า "สำรอง" ที่จะใช้ถ้าพารามิเตอร์ไม่ได้ถูกกำหนด
ฟังก์ชั่นนี้ใช้ตรวจสอบได้ว่ามีการส่งพารามิเตอร์ไปยังแม่แบบที่มีค่าจริงหรือไม่
ตัวอย่าง:
{{#if: {{{1|}}}
| พารามิเตอร์ตำแหน่งแรกมีค่าที่แท้จริง
| พารามิเตอร์ตำแหน่งแรกมีค่าเท็จ (หรือไม่มีค่า)
}}
{{#if: {{{xx|}}}
| พารามิเตอร์ที่ตั้งชื่อ xx มีค่าที่แท้จริง
| พารามิเตอร์ที่ตั้งชื่อ xx มีค่าเท็จ (หรือไม่มีค่า)
}}
{{#if: {{{xx|}}}{{{yy|}}}
| xx หรือ yy มีค่าเป็นจริงหรือทั้งคู่เป็นจริง
| ทั้ง xx และ yy มีค่าเท็จ (หรือไม่มีค่า)
}}
การทดสอบว่าพารามิเตอร์ทั้งสองเป็นจริงหรือไม่นั้นต้องใช้ความพยายามมากกว่านี้เล็กน้อย ตัวอย่างเช่น:
{{#if: {{{xx|}}}
| {{#if: {{{yy|}}}
| ทั้ง xx และ yy มีค่าจริง
| xx เป็นจริงแต่ไม่ใช่ yy
}}
| ทั้ง xx และ yy เป็นเท็จ
}}
|
{{#if: {{{xx|}}}
| xx เป็นจริง (และ yy ไม่ได้รับการทดสอบ)
| {{#if: {{{yy|}}}
| yy เป็นจริงแต่ไม่ใช่ xx
| ทั้ง xx และ yy เป็นเท็จ
}}
}}
|
โปรดทราบว่าฟังก์ชัน #if
แบบซ้อนกันนี้จะกินทรัพยากรอย่างรวดเร็วมาก ในวิกิบางแห่ง แม้แต่การซ้อนกันถึง 7 ระดับก็อาจเกินขีดจำกัดทรัพยากรได้
ดูการอภิปรายของ #ifeq
เพื่อดูวิธีตรวจจับว่ามีการกำหนดพารามิเตอร์หรือไม่ไม่ว่าค่าจะเป็นจริงหรือเท็จ
การใช้ #ifeq
[แก้]- ดูเพิ่ม: แม่แบบ
{{ifeq}}
ฟังก์ชัน #ifeq
จะเลือกทางเลือกหนึ่งจากสองทางเลือก โดยพิจารณาว่าสตริงทดสอบสองตัวเท่ากันหรือไม่
{{#ifeq:
สตริง 1 | สตริง 2 | ค่าถ้าเท่ากัน | ค่าถ้าไม่เท่ากัน }}
'
หากสตริงทั้งสองเป็นค่าตัวเลขที่ถูกต้อง สตริงเหล่านั้นจะถูกเปรียบเทียบเป็นตัวเลข ไม่ใช่สตริงตัวอักษร:
{{#ifeq: 01 | 1 | เท่ากัน | ไม่เท่ากัน }}
→ เท่ากัน{{#ifeq: x01 | x1 | เท่ากัน | ไม่เท่ากัน }}
→ ไม่เท่ากัน{{#ifeq: 2.000 | 002 | เท่ากัน | ไม่เท่ากัน }}
→ เท่ากัน{{#ifeq: 2.5 | 2+.5 | เท่ากัน | ไม่เท่ากัน }}
→ ไม่เท่ากัน (เลขคณิต!){{#ifeq: 2*10^3 | 2000 | เท่ากัน | ไม่เท่ากัน }}
→ ไม่เท่ากัน (เลขคณิต!){{#ifeq: 2E3 | 2000 | เท่ากัน | ไม่เท่ากัน }}
→ เท่ากัน
จากตัวอย่างที่ 4 และ 5 จะเห็นได้ว่านิพจน์ทางคณิตศาสตร์ไม่ได้ถูกประเมิน แต่จะถูกปฏิบัติเหมือนเป็นสตริงปกติ แต่ #expr
สามารถนำมาใช้ประเมินนิพจน์ดังกล่าวได้
{{#ifeq: {{#expr:2*10^3}} | 2000 | เท่ากัน | ไม่เท่ากัน }}
→ เท่ากัน
การเปรียบเทียบสตริงจะต้องคำนึงถึงตัวพิมพ์เล็ก/ใหญ่:
{{#ifeq: ราชา | ราชา | เท่ากัน | ไม่เท่ากัน }}
→ เท่ากัน
สำหรับการตรวจสอบโดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก ให้ใช้ฟังก์ชัน {{lc:}}
หรือ {{uc:}}
เพื่อบังคับให้สตริงใช้ตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ทั้งหมด วิธีนี้มีประโยชน์มากที่สุดเมื่อต้องจัดการกับค่าพารามิเตอร์:
{{#ifeq: {{lc:King}} | ราชา | เท่ากัน | ไม่เท่ากัน }}
→ ไม่เท่ากัน :{{#ifeq: {{lc: {{{position}}} }} | top | รหัสถ้าเป็นจริง | รหัสถ้าเป็นเท็จ }}
ในตัวอย่างที่สอง ค่า "top" "Top" และ "TOP" จะให้ผลลัพธ์เป็นการจับคู่ที่ประสบความสำเร็จทั้งหมด
ฟังก์ชันตัววิเคราะห์นี้ใช้ตรวจจับว่ามีการกำหนดพารามิเตอร์แม่แบบหรือไม่ แม้ว่าจะตั้งค่าเป็นค่าเท็จก็ตาม ตัวอย่างเช่น เพื่อตรวจสอบว่ามีการส่งพารามิเตอร์ตำแหน่งแรกไปยังแม่แบบหรือไม่ (โปรดทราบว่าสตริง "+
" และ "-
" สามารถเป็นสตริงที่ไม่ใช่ช่องว่างสองสตริงที่แตกต่างกันได้)
{{#ifeq: {{{1|+}}} | {{{1|-}}} | 1 ถูกกำหนด | 1 ไม่ได้ถูกกำหนด }}
หากให้เจาะจง นี่คือสิ่งที่โค้ดนี้สร้างขึ้นเมื่อเรียกใช้ในลักษณะต่อไปนี้:
{{ชื่อแม่แบบ}}
→ 1 ไม่ได้กำหนดไว้{{ชื่อแม่แบบ|}}
→ 1 ถูกกำหนดแล้ว{{ชื่อแม่แบบ|1=}}
→ 1 ถูกกำหนดแล้ว{{ชื่อแม่แบบ|1=foo}}
→ 1 ถูกกำหนดแล้ว
ดูที่ mw:วิธีใช้:ส่วนขยาย:ฟังก์ชันการแยกวิเคราะห์##ifeq สำหรับรายละเอียดเพิ่มเติม รวมถึงผลลัพธ์ที่ขัดกับสามัญสำนึกที่อาจเกิดขึ้นเนื่องจากวิธีการนำฟังก์ชันนี้ไปใช้
การใช้ #switch
[แก้]ฟังก์ชัน #switch
เลือกทางเลือกต่างๆ จากหลายทางเลือกโดยอิงจากสตริงอินพุต
{{#switch: สตริงทดสอบ | case1 = ค่าสำหรับเคส 1 | ... | default }}
เทียบเท่ากับคำสั่งสวิตช์ที่พบในภาษาการเขียนโปรแกรมบางภาษา ถือเป็นวิธีที่สะดวกในการจัดการกับหลายกรณีโดยไม่ต้องเชื่อมโยงฟังก์ชัน #if
จำนวนมากเข้าด้วยกัน อย่างไรก็ตาม โปรดทราบว่าประสิทธิภาพจะลดลงหากมีทางเลือกมากกว่า 100 รายการ การวางค่าทั่วไปไว้ก่อนหน้านี้ในรายการกรณีอาจทำให้ฟังก์ชันทำงานได้เร็วขึ้นอย่างมาก
สำหรับแต่ละกรณี เครื่องหมายเท่ากับ "=
" ทั้งสองด้านสามารถเป็นสตริงธรรมดา การเรียกใช้ฟังก์ชันตัววิเคราะห์ (รวมถึง #expr
เพื่อประเมินนิพจน์) หรือการเรียกใช้แม่แบบ หากกรณีใดไม่เกี่ยวข้องกับค่า (กล่าวคือ ไม่มีการใช้เครื่องหมายเท่ากับ) ค่าที่ระบุถัดไปจะถูกใช้ วิธีนี้ช่วยให้กรณีต่างๆ สามารถแบ่งปันค่าเดียวกันได้โดยไม่ต้องระบุค่าซ้ำๆ (ดังที่เห็นในตัวอย่างด้านล่าง)
หากไม่พบตัวพิมพ์ที่ตรงกัน ค่าเริ่มต้นจะถูกใช้ โดยปกติจะระบุค่านี้ไว้เป็นค่าสุดท้ายโดยไม่มีค่า "ตัวพิมพ์" ที่เกี่ยวข้อง ดังที่เห็นในสรุปไวยากรณ์ด้านบน แต่สามารถระบุค่านี้ได้ทุกเมื่อหลังจากสตริงทดสอบ หากใช้โครงสร้าง | #default = ค่า
(ดูตัวอย่างที่สองด้านล่าง) หากไม่ได้ระบุค่าเริ่มต้นด้วยวิธีใดวิธีหนึ่ง สตริงว่างจะถูกส่งคืนเมื่อไม่มีตัวพิมพ์ที่ตรงกับสตริงอินพุต
ฟังก์ชันนี้ได้รับประโยชน์โดยเฉพาะจากการตั้งค่าในรูปแบบหลายบรรทัด
{{#switch: {{{x|}}}
| 1 = หนึ่ง
| 2 = สอง
| 3 = สาม
| 4 = สี่
| 5
| 6
| 7 = อยู่ในช่วง 5 ถึง 7 | อื่นๆ
}}
ที่นี่ หากค่าของพารามิเตอร์แม่แบบ x
เป็นสตริง "1" ผลลัพธ์จะเป็นสตริง "หนึ่ง" หากเป็น "2" จะเป็น "สอง" เป็นต้น แต่สำหรับค่าใดๆ ก็ตาม เช่น "5" "6" หรือ "7" ผลลัพธ์จะเป็นสตริง "ในช่วง 5 ถึง 7" สำหรับค่าอื่นๆ หรือค่าว่าง ผลลัพธ์จะส่งคืนสตริง "อื่น"
ตัวอย่างต่อไปนี้เทียบเท่ากับตัวอย่างก่อนหน้านี้:
{{#switch: {{{x|}}}
| 1 = หนึ่ง
| 2 = สอง
| 3 = สาม
| 4 = สี่
| 5|6|7 = อยู่ในช่วง 5 ถึง 7 | อื่นๆ
}}
ดูที่วิธีใช้:สลับฟังก์ชั่นการแยกวิเคราะห์ สำหรับคำอธิบายฉบับเต็มและตัวอย่างเพิ่มเติม
การใช้ #expr
[แก้]ฟังก์ชัน #expr
ใช้ในการประเมินนิพจน์ทางคณิตศาสตร์ (รวมถึงนิพจน์บูลีน) แม้ว่าจะไม่ใช่ฟังก์ชันแบบมีเงื่อนไข แต่ก็มักใช้ภายในฟังก์ชันเหล่านี้ ดังนั้นจึงมีคำอธิบายโดยย่อไว้ที่นี่ โปรดดูรายละเอียดเพิ่มเติมใน Manual:Expr parser function syntax
{{#expr: การแสดงออก }}
ฟังก์ชัน #if
ถือว่าค่าทั้งหมดใน expression
ที่ประเมินโดย #expr
เป็นตัวเลข ฟังก์ชันนี้ไม่สามารถทำงานกับสตริงที่กำหนดเองได้ สำหรับวัตถุประสงค์ของการดำเนินการแบบบูลีน (เช่น and
, or
และ not
) ค่า false จะแสดงด้วย 0 และค่า true จะแสดงด้วย 1 โดยตัวดำเนินการตัวเลขจะถือว่าค่าเหล่านี้เป็นตัวเลขปกติ เมื่อเป็นอินพุต ตัวดำเนินการบูลีนจะถือว่า 0 เป็นเท็จ และถือว่าตัวเลขอื่น ๆ เป็นจริง หากใช้สตริงที่ไม่ใช่ตัวเลข จะเกิดข้อผิดพลาดขึ้น
ตัวอย่าง:
{{#expr: ( {{{1}}}+{{{xshift}}} - 6 ) * 18.4 }}
{{#expr: ln(7)^3 - abs(-0.344) + floor(5/3) round 3 }}
{{#expr: {{{n}}}>0 and {{{n}}}<1.0 }}
โปรดทราบว่าตัวอย่างเหล่านี้ถือว่าพารามิเตอร์ทั้งหมดที่อ้างถึงถูกกำหนดไว้และมีค่าตัวเลข หากไม่เป็นเช่นนั้น ข้อผิดพลาดจะเกิดขึ้น โปรดดู #iferror
สำหรับวิธีหนึ่งในการจัดการข้อผิดพลาด
การใช้ #ifexpr
[แก้]ฟังก์ชัน #ifexpr
ประเมินนิพจน์ในลักษณะเดียวกับที่ #expr
ทำ (ดูคำอธิบายของฟังก์ชันดังกล่าวสำหรับรายละเอียด) แต่ส่งคืนค่าที่เป็นไปได้สองค่า ขึ้นอยู่กับค่าความจริงของผลลัพธ์
{{#ifexpr: นิพจน์ | ค่าถ้าเป็นจริง | ค่าถ้าเป็นเท็จ }}
ตัวอย่าง:
{{#ifexpr: ( {{{1}}} + {{{2}}} ) * 2.63 > 45 | เหนือ 45 | ไม่เหนือ 45 }}
{{#ifexpr: {{{1}}} > 0 และ {{{1}}} < 1.0 หรือ {{#ifeq:{{{decimal}}}|yes}} | เป็นทศนิยม | ไม่ใช่ทศนิยม }}
ตามที่อธิบายไว้ข้างต้น สำหรับวัตถุประสงค์ของฟังก์ชันนี้ 0 ถือเป็นเท็จ และค่าตัวเลขอื่น ๆ ถือเป็นจริง
{{#ifexpr: 0 | ใช่ | ไม่ใช่ }}
→ ไม่ใช่{{#ifexpr: 1 | ใช่ | ไม่ใช่ }}
→ ใช่{{#ifexpr: 2 | ใช่ | ไม่ใช่ }}
→ ใช่
นิพจน์อินพุตที่ว่างเปล่าจะประเมินผลเป็นเท็จ
{{#ifexpr: | ใช่ | ไม่ใช่ }}
→ ไม่ใช่
แต่อินพุตที่ไม่ถูกต้อง รวมถึงอินพุตที่มีสตริงที่ไม่ใช่ตัวเลข จะแสดงข้อความแสดงข้อผิดพลาด
{{#ifexpr: = | ใช่ | ไม่ใช่ }}
→ ข้อผิดพลาดนิพจน์: มีตัวดำเนินการ = ซึ่งไม่ควรมี{{#ifexpr: A=B | ใช่ | ไม่ใช่ }}
→ ข้อผิดพลาดนิพจน์: "a" เป็นคำที่ไม่รู้จัก
ภายใต้สถานการณ์ปกติ ฟังก์ชัน #ifexpr
จะเทียบเท่ากับการใช้โครงสร้างต่อไปนี้กับ #ifeq
และ #expr
(โปรดสังเกตการกลับด้านของค่าเอาต์พุต "true" และ "false" เนื่องจากเรากำลังเปรียบเทียบผลลัพธ์อินพุตกับ "0"):
{{#ifeq: {{#expr: expression }} | 0 | ค่าถ้าเป็นเท็จ | ค่าถ้าเป็นความจริง }}
แต่ข้อความแสดงข้อผิดพลาดใดๆ ที่ถูกสร้างโดย #expr
จะถูกมองโดย #ifeq
เป็นสตริงธรรมดาที่ไม่เท่ากับ "0" ดังนั้นจะแสดงผล ค่าถ้าเป็นจริง
{{#ifeq: {{#expr: = }} | 0 | ใช่ | ไม่ใช่ }}
→ ไม่ใช่
ค่าเอาต์พุตทั้งสองค่าหรือค่าใดค่าหนึ่งอาจถูกละเว้น (หรือปล่อยว่างไว้) ในกรณีนี้ (โดยถือว่าเข้าถึงสาขาที่"หายไป" ของคอนสตรัคต์) จะไม่มีผลลัพธ์เอาต์พุตใดๆ
{{#ifexpr: 1 > 0 | yes }}
→ yes{{#ifexpr: 1 > 0 | | no }}
→
![]() | เคล็ดลับ
หากต้องการเปรียบเทียบโดยอิงตามวันที่ (เช่น หากวันที่และเวลาปัจจุบันอยู่หลังวันที่และเวลาอื่นๆ) ขั้นแรกให้แปลงเวลาเป็นจำนวนวินาทีหลังวันที่ 1 มกราคม พ.ศ. 2513 โดยใช้ฟังก์ชัน {{#time: U }} จากนั้นเปรียบเทียบ (หรือบวก ลบ ฯลฯ) ค่าตัวเลขเหล่านั้น |
ดูที่mw:วิธีใช้:ส่วนขยาย:ฟังก์ชันการแยกวิเคราะห์##ifexpr สำหรับรายละเอียดเพิ่มเติม รวมถึงผลลัพธ์ที่ขัดกับสามัญสำนึกที่อาจเกิดขึ้นเนื่องมาจากวิธีการนำฟังก์ชันนี้ไปใช้
การใช้ #iferror
[แก้]ฟังก์ชัน #iferror
จะเลือกทางเลือกใดทางเลือกหนึ่งจากสองทางเลือก ขึ้นอยู่กับว่าอินพุตของฟังก์ชันนี้จะทำให้เกิดข้อผิดพลาดหรือไม่
{{#iferror: สตริงทดสอบ | ค่าถ้าเกิดข้อผิดพลาด | ค่าถ้าถูกต้อง }}
โดยทั่วไปสตริงทดสอบจะเป็นการเรียก #expr
หรือฟังก์ชันตัวแยกวิเคราะห์อื่นๆ แต่สามารถเป็นข้อความธรรมดาหรือการเรียกแม่แบบก็ได้ ซึ่งในกรณีนี้ ข้อผิดพลาดจะถูกทริกเกอร์โดยวัตถุ HTML ใดๆ ที่มี class="error"
หรือข้อผิดพลาดแม่แบบต่างๆ เช่น ลูปและการเรียกซ้ำ หรือข้อผิดพลาดตัวแยกวิเคราะห์ "failsoft" อื่นๆ
สามารถละเว้นค่าส่งคืนหนึ่งค่าหรือทั้งสองค่าได้ หากละเว้น ค่าถ้าถูกต้อง
สตริงทดสอบจะถูกส่งคืนหากไม่ผิดพลาด หากละเว้น ค่าหากมีข้อผิดพลาด
ด้วย สตริงว่างจะถูกส่งคืนเมื่อมีข้อผิดพลาด:
{{#iferror: {{#expr: 1 + 2 }} | ข้อผิดพลาด | ถูกต้อง }}
→ ถูกต้อง{{#iferror: {{#expr: 1 + X }} | ข้อผิดพลาด | ถูกต้อง }}
→ ข้อผิดพลาด{{#iferror: {{#expr: 1 + 2 }} | ข้อผิดพลาด }}
→ 3{{#iferror: {{#expr: 1 + X }} | ข้อผิดพลาด }}
→ ข้อผิดพลาด{{#iferror: {{#expr: 1 + 2 }} }}
→ 3'{{#iferror: {{#expr: 1 + X }} }}
→{{#iferror: {{#expr: . }} | ข้อผิดพลาด | ถูกต้อง }}
→ ถูกต้อง{{#iferror: <strong class="error">a</strong> | ข้อผิดพลาด | ถูกต้อง }}
→ ข้อผิดพลาด
การใช้ #ifexist
[แก้]ฟังก์ชัน #ifexist
จะเลือกทางเลือกใดทางเลือกหนึ่งจากสองทางเลือก ขึ้นอยู่กับว่ามีหน้าที่อยู่ในชื่อที่ระบุหรือไม่
{{#ifexist: ชื่อหน้า | ค่าถ้าหน้ามีอยู่ | ค่าถ้าหน้าไม่มีอยู่ }}
หน้าสามารถอยู่ในเนมสเปซใดก็ได้ ดังนั้นจึงสามารถเป็นบทความหรือ "หน้าเนื้อหา" รูปภาพหรือไฟล์สื่ออื่น ๆ หมวดหมู่ ฯลฯ เนื้อหาจริงของหน้านั้นไม่เกี่ยวข้อง ดังนั้นอาจว่างเปล่าหรือเป็นการเปลี่ยนทาง ชื่อเรื่องที่ส่งผลให้เกิดลิงก์สีแดงจะไม่มีอยู่ (และเช่นเดียวกับลิงก์สีแดง การตรวจสอบการมีอยู่ของหน้าที่ไม่มีอยู่จะทำให้ชื่อเรื่องปรากฏบนพิเศษ:หน้าที่ต้องการ)
การตรวจสอบนั้นรวดเร็วมาก แต่ถูกจำกัดไว้ที่ 500 อินสแตนซ์ต่อหน้า เนื่องจากถือว่าเป็น "ฟังก์ชันการแยกวิเคราะห์ที่มีราคาแพง" (อย่างไรก็ตาม การตรวจสอบชื่อเรื่องเดียวกันหลายครั้งในหน้าเดียวกันจะไม่นับเป็นหลายอินสแตนซ์ เนื่องจากผลลัพธ์ของการตรวจสอบครั้งแรกจะถูกแคชและนำมาใช้ซ้ำสำหรับการตรวจสอบครั้งต่อๆ ไป)
การตรวจสอบพารามิเตอร์แม่แบบ
[แก้]สำนวนทั่วไปที่พบในการเขียนโค้ดแม่แบบคือ "ห่วงโซ่ของค่าสำรอง" ดังที่เห็นในตัวอย่างนี้:
{{{1|{{{url|{{{URL|}}}}}}}}}
ที่นี่ หากกำหนดพารามิเตอร์ตำแหน่งแรกแล้ว ระบบจะใช้ค่าของพารามิเตอร์นั้น หากไม่ได้กำหนดไว้ ระบบจะตรวจสอบพารามิเตอร์ที่มีชื่อว่า url
และหากกำหนดไว้ ระบบจะใช้ค่าของพารามิเตอร์นั้น หากไม่ได้กำหนดพารามิเตอร์ตำแหน่งแรกและ url
ไว้ ระบบจะตรวจสอบพารามิเตอร์ที่มีชื่อว่า URL
หากกำหนดไว้ ระบบจะใช้ค่าของพารามิเตอร์นั้น หากไม่ได้กำหนดไว้ ระบบจะใช้สตริงว่าง
ปัญหาคือ โครงสร้างนี้มักจะถูกตีความว่าเทียบเท่ากับ:
{{#if: {{{1|}}} | {{{1}}} | {{#if: {{{url|}}} | {{{url}}} | {{#if: {{{URL|}}} | {{{URL}}} }} }} }}
และมันไม่ใช่ ความแตกต่างก็คือโครงสร้างแรกซึ่งใช้ค่าเริ่มต้นนั้นขึ้นอยู่กับ ความชัดเจน ของพารามิเตอร์ ในขณะที่โครงสร้างที่สองซึ่งใช้ฟังก์ชัน #if
นั้นขึ้นอยู่กับ ค่าความจริง ของพารามิเตอร์ ซึ่งเป็นสองสิ่งที่แตกต่างกันมาก
หากพารามิเตอร์ใดๆ ในเชนของค่าสำรอง (ในคอนสตรัคต์แรก) ถูกตั้งค่าเป็นค่าว่าง (หรือช่องว่างเท่านั้น) ในการเรียกแม่แบบ ค่าว่างนั้นจะถูกใช้แทนการ "สำรอง" ไปยังพารามิเตอร์ถัดไปในเชน ตัวอย่างเช่น หากแม่แบบถูกเรียกด้วยวิธีใดวิธีหนึ่งจากสองวิธีนี้:
{{template-name||url=https://example.com/}}
{{template-name|url=https://example.com/|}}
พารามิเตอร์ตำแหน่งแรก ได้ถูกกำหนดแล้ว: ค่าของพารามิเตอร์นี้คือสตริงว่าง ดังนั้น ค่าของ url
จึงไม่เกี่ยวข้อง แม่แบบไม่เคย "เข้าถึง" ค่าดังกล่าว
ในทำนองเดียวกัน ถ้ามีการเรียกใช้แม่แบบในลักษณะนี้:
{{template-name|url=|URL=https://example.com/}}
ค่าว่างของ url
จะถูกใช้แทนค่าของ URL
ตัวอย่างเหล่านี้อาจดูประดิษฐ์ขึ้นเล็กน้อย เนื่องจากตัวอย่างเหล่านี้อาศัยการเรียกใช้แม่แบบ "ในทางที่ผิด" แต่การพบกรณีที่ปัญหาเหล่านี้เกิดขึ้นจากการเรียกใช้แม่แบบที่สมเหตุสมผลนั้นเป็นเรื่องที่น่าแปลกใจมาก (โดยเฉพาะอย่างยิ่งหากมี "ลำดับชั้น" ของแม่แบบ ซึ่งแม่แบบหนึ่งเรียกใช้แม่แบบอื่นโดยส่งค่าพารามิเตอร์ของแม่แบบนั้นไปยังพารามิเตอร์ของแม่แบบ "ระดับล่าง" ซึ่งในกรณีดังกล่าว มักจะจบลงด้วยค่าพารามิเตอร์ที่กำหนดไว้แต่ว่างเปล่า)
เนื่องจากปัญหาเช่นนี้ บางครั้งผู้เขียนโค้ดแม่แบบจึงพบว่าจำเป็นต้องแยกความแตกต่างระหว่างชุดค่าผสมที่แตกต่างกันของสามสถานะ ได้แก่ กำหนดและไม่ว่างเปล่า กำหนดและว่างเปล่า และไม่ถูกกำหนด ซึ่งสามารถทำได้ด้วยวิธีต่อไปนี้ (ใช้พารามิเตอร์ตำแหน่งแรกที่นี่ แต่พารามิเตอร์ที่มีชื่อจะทำงานในลักษณะเดียวกัน)
- แบบกำหนดและไม่ว่างเปล่า เทียบกับ แบบไม่ได้กำหนด หรือ แบบกำหนดและว่างเปล่า
{{#if: {{{1|}}} | 1 ถูกกำหนดและประกอบด้วยช่องว่างที่ไม่ใช่ | 1 ไม่ได้ถูกกำหนด ว่างเปล่า หรือมีช่องว่างเท่านั้น }}
- กำหนดไว้ (ไม่ว่าจะไม่ว่างเปล่าหรือว่างเปล่า) เทียบกับ ไม่ได้กำหนดไว้
- ต่อไปนี้เป็นทางเลือกเทียบเท่า:
{{#ifeq: {{{1|+}}} | {{{1|-}}} | 1 ถูกกำหนด (และอาจว่างเปล่าหรือมีเพียงช่องว่าง) | 1 ไม่ได้ถูกกำหนด }}
{{#ifeq: {{{1|/}}}{{{1|}}} | / | 1 ไม่มีการกำหนด | 1 ถูกกำหนด (และอาจว่างเปล่าหรือมีเพียงช่องว่าง) }}
{{#if: {{#if: {{{1|/}}} | {{{1|}}} | / }} | 1 ถูกกำหนด (และอาจว่างเปล่าหรือมีเพียงช่องว่าง) | 1 ไม่ได้ถูกกำหนด }}
โปรดทราบว่าอักขระ +
และ -
สามารถเป็นอักขระที่ไม่ใช่ช่องว่างได้สองตัว นอกจากนี้ หากคุณต้องการใช้ค่าของพารามิเตอร์เมื่อกำหนด และค่าอื่นๆ เมื่อไม่ได้กำหนด คุณสามารถใช้โครงสร้าง "สำรอง" ที่ง่ายกว่าได้:
{{{1|ค่าอื่น ๆ}}}
- กำหนดและไม่ว่างเปล่า เทียบกับ กำหนดและว่างเปล่า เทียบกับ ไม่ได้กำหนดไว้
- ต่อไปนี้เป็นทางเลือกเทียบเท่า:
{{#ifeq: {{{1|+}}} | {{{1|-}}} | 1 ถูกกำหนด {{#if: {{{1|}}} | และไม่ว่างเปล่า | และว่างเปล่า }} | 1 ไม่ได้กำหนดไว้ }}
{{#if: {{{1|/}}} | {{#if:{{{1|}}} | 1 ถูกกำหนดและไม่ว่างเปล่า | 1 ไม่ได้ถูกกำหนด }} | 1 ถูกกำหนดและว่างเปล่า }}
หากคุณไม่สนใจเกี่ยวกับกรณีที่ไม่ได้กำหนด คุณสามารถลบ "|1 undefined
" ออกจากทั้งสองตัวอย่างได้
แม่แบบวาเรียดิก
[แก้]รูปแบบไวยากรณ์ของวิกิเท็กซ์ ไม่อนุญาตให้สร้างแม่แบบวาเรียดิก อย่างแท้จริง แต่ทำได้เฉพาะแม่แบบวาเรียดิก เทียมเท่านั้น ซึ่งจะตรวจสอบพารามิเตอร์ที่เข้ามาทีละตัวจนกว่าจะถึงจำนวนคงที่ที่กำหนด อย่างไรก็ตาม สามารถทำลายข้อจำกัดนี้ได้ด้วยการใช้โมดูลเฉพาะ สำหรับกรณีง่ายๆ {{#invoke:separated entries|main}} อนุญาตให้ขยายพารามิเตอร์ลำดับทั้งหมดอย่างสุ่มสี่สุ่มห้าและสามารถตั้งค่าตัวแบ่งที่กำหนดเองได้ สำหรับกรณีที่ซับซ้อนกว่านั้น {{#invoke:params}} อนุญาตให้นับ แสดงรายการ แมป กรอง และเผยแพร่พารามิเตอร์ที่เข้ามาทั้งหมดโดยไม่ต้องทราบจำนวนล่วงหน้า
ดูเพิ่ม
[แก้]- วิธีใช้:ผังเงื่อนไข
- mw:Help:Extension:ParserFunctions หน้าความช่วยเหลือที่ยาวกว่าและเชิงเทคนิคมากขึ้นที่ MediaWiki.org
- เงื่อนไข (การเขียนโปรแกรมคอมพิวเตอร์)
- ตัวดำเนินการเชิงสัมพันธ์
- วิธีใช้:แม่แบบ และ วิกิพีเดีย:แม่แบบกระบะทรายและกรณีทดสอบ
- m:Help:แม่แบบขั้นสูง
- หมวดหมู่:แม่แบบ if-then-else