ข้ามไปเนื้อหา

วิธีใช้:นิพจน์เงื่อนไข

จากวิกิพีเดีย สารานุกรมเสรี

หน้านี้จะอธิบายวิธีการใช้ฟังก์ชันตัวแจงส่วนต่างๆ เพื่อแสดงผลลัพธ์ที่แตกต่างกันตามเงื่อนไขที่ตรวจพบในหน้าหรือแม่แบบ.

ต่อไปนี้เป็นสรุปโดยย่อของฟังก์ชันเหล่านี้ในแง่ของวิธีการจัดการอินพุต (ชื่อฟังก์ชันมีลิงก์ไปยังคำอธิบายโดยละเอียดเพิ่มเติมซึ่งพบได้ด้านล่างในหน้านี้):

  • #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 }}

ดูที่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}} อนุญาตให้นับ แสดงรายการ แมป กรอง และเผยแพร่พารามิเตอร์ที่เข้ามาทั้งหมดโดยไม่ต้องทราบจำนวนล่วงหน้า

ดูเพิ่ม

[แก้]

แม่แบบ:Wikipedia technical help