อะไรคือความแตกต่างระหว่าง $ / และ $ ¢ใน regex?


11

ตามที่ชื่อระบุความแตกต่างระหว่าง$/และคืออะไร ดูเหมือนว่าจะมีค่าเท่ากันเสมอ:

my $text = "Hello world";

$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;

ทั้งสองผลลัพธ์ในการจับคู่วัตถุด้วยค่าเดียวกัน ตรรกะในการใช้อย่างใดอย่างหนึ่งมากกว่าอื่น ๆ คืออะไร?

คำตอบ:


11

ตัวแปร$/อ้างถึงการจับคู่ล่าสุดในขณะที่ตัวแปรอ้างถึงการจับคู่นอกสุดล่าสุด ใน regexes พื้นฐานส่วนใหญ่เช่นข้างต้นที่อาจเป็นหนึ่งเดียวกัน แต่ตามที่เห็นได้จากผลลัพธ์ของ.rakuวิธีการMatchวัตถุสามารถมีMatchวัตถุอื่น ๆ(นั่นคือสิ่งที่คุณได้รับเมื่อคุณใช้$<foo>หรือ$1สำหรับการจับ)

สมมติว่าเรามี regex ต่อไปนี้พร้อมการจับภาพเชิงปริมาณ

/ ab (cd { say $¢.from, " ", $¢.to } ) + /

และวิ่งมันจะเห็นผลลัพธ์ต่อไปนี้ถ้าเราจับคู่กับ "abcdcdcd":

0 2
0 4
0 6

แต่ถ้าเราเปลี่ยนจากการใช้เป็น$/เราจะได้ผลลัพธ์ที่แตกต่าง:

2 2
4 4
6 6

(เหตุผลที่.toดูเหมือนว่าจะปิดสักหน่อยคือ - และ.pos- ไม่ได้รับการปรับปรุงจนกว่าจะสิ้นสุดบล็อกการจับภาพ)

ในคำอื่น ๆจะเสมอหมายถึงสิ่งที่จะเป็นของคุณวัตถุนัดสุดท้าย (คือ$final = $text ~~ $regex) เพื่อให้คุณสามารถสำรวจภายในต้นไม้จับภาพที่ซับซ้อนของ regex ตรงกับที่คุณจะหลังจากเสร็จสิ้นการแข่งขันเต็มรูปแบบดังนั้นในตัวอย่างข้างต้นคุณสามารถเพียงแค่ ทำ$¢[0]เพื่ออ้างถึงการแข่งขันครั้งแรก$¢[1]ที่สอง ฯลฯ

ภายในบล็อกรหัส regex $/จะอ้างอิงการจับคู่ที่ใกล้เคียงที่สุด ในกรณีข้างต้นนั่นคือการจับคู่สำหรับภายใน( )และไม่ทราบเกี่ยวกับการแข่งขันอื่น ๆ หรือการเริ่มต้นของการจับคู่เดิม: เพียงเริ่มต้นสำหรับ( )บล็อก ดังนั้นให้ regex ที่ซับซ้อนมากขึ้น:

/ a $<foo>=(b $<bar>=(c)+ )+ d /

เราสามารถเข้าถึงที่จุดใด ๆ ที่ใช้ $ ¢ทั้งหมดของราชสกุลโดยกล่าวว่าfoo $¢<foo>เราสามารถเข้าถึงbarสัญญาณของความที่กำหนดโดยใช้foo $¢<foo>[0]<bar>หากเราแทรกบล็อครหัสในการfooจับภาพของมันจะสามารถเข้าถึงbarโทเค็นโดยใช้$<bar>หรือ$/<bar>แต่มันจะไม่สามารถเข้าถึงโทเค็นอื่น ๆfooได้


1
Ohhh! ผมตีความเอกสารของ "ความแตกต่างที่สำคัญระหว่าง$/และขอบเขต: หลังเท่านั้นมีค่าภายใน regex ว่า" เพื่อหมายถึงเป็นเพียงการติดตามร่องรอยเช่นเดียวกับที่Cursorเป็น เมื่อฉันอ่านคำตอบของคุณฉันคิดว่าฉันจะเป็นคนที่$*TOPสร้างขึ้นในการปรับปรุงที่เป็นไปได้หรือไม่? ในส่วนของคำตอบของฉันต่อ "ดังนั้นทำไมจึงต้องมีตัวแปรเพิ่มเติมในการจับคู่อักขระ Arbitary ซ้ำกับกลุ่มการจับภาพ" แต่ความพยายามของฉันที่จะแทนที่$*TOPด้วยล้มเหลว คุณเข้าใจประเด็นของฉันในคำตอบนั้นหรือไม่? คุณสามารถทำให้มันใช้งานได้?
raiph

Raiph: ดังนั้นในไวยากรณ์จะมีการต่ออายุสำหรับแต่ละโทเค็นดังนั้นคุณต้องพูด$*TOP := $¢ในTOPโทเค็น แต่นั่นก็ไม่ได้กำจัดความจำเป็นในการใช้โทเค็น$*TOPแน่นอน ฉันเห็นด้วยว่ามันยอดเยี่ยมมากที่สามารถอ้างอิงการแข่งขันในระดับสูงสุดได้ ในที่สุดปัญหาก็คือสิ่งที่คุณระบุ: เมื่อตำแหน่ง / แฮชตรงกับโพสต์ไปยังวัตถุที่จับคู่ เมื่อใช้- ซึ่งต่อโทเค็นผลลัพธ์จะตามโพสต์ความหมายทันทีที่{ }พบบล็อกล้อมรอบ
user0721090601

สิ่งที่น่าสนใจสำหรับฉันคือในการพัฒนาBinexฉันไม่พบว่าการคำนวณผลการแข่งขันที่แย่กว่านั้นเมื่อพบพวกเขา ในตอนท้ายของวันคุณกำลังกด / popping ไปยังรายการแคช / แฮชหรือคุณกด / popping ไปที่รายการ / แฮชของ Match อย่างไรก็ตามอาจมีการเรียงลำดับของความเร็วภายในบางอย่างฉันไม่ทราบว่าใช้สำหรับ LTM ซึ่งเป็นแกนหลักของมัน (การ{ }ยุติโทเค็นสำหรับวัตถุประสงค์ของ LTM และมีแนวโน้มที่จะเรียกใช้ / ทดสอบมากกว่า โทเค็นที่เหลือในการ|จัดกลุ่ม)
user0721090601

Ahhh ฉันเพิ่มขึ้นถึงข้อสรุปเป็นแบบไดนามิกและรู้สึกประหลาดใจเมื่อมันไม่ทำงาน แต่ตอนนี้เงินของเพนนีลดลงว่ามันเป็นคำศัพท์อย่างที่ฉันเดาได้ว่าคุณใช้คำว่า "นอกสุด" และนั่นก็คือตามที่คุณอธิบายไว้ในตอนต้นของแต่ละกฎ
raiph

ดังนั้น iiuc ที่จุดเริ่มต้นของกฎวัตถุการจับคู่ใหม่จะถูกสร้างขึ้นที่บันทึกตำแหน่งเคอร์เซอร์ของเครื่องมือที่ตรงกันภายในสตริงอินพุตดั้งเดิม แต่จะว่างเปล่า (ใช่ไหม) จากนั้นและ$/ถูกผูกไว้กับวัตถุเดียวกันคือวัตถุการจับคู่ใหม่นี้ซึ่งจะบันทึกสิ่งที่กฎนี้จับคู่และจับในขณะที่มันดำเนินไป จากนั้นเมื่อการจับคู่ดำเนินไปจะยังคงถูกผูกไว้กับออบเจ็กต์การจับคู่โดยรวมในขณะที่$/รีบาวด์ทุกครั้งที่มีการสร้างออบเจ็กต์การจับคู่ใหม่ดังนั้นมันจะสอดคล้องกันเสมอ ขวา?
raiph
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.