# Perl บน Maguyva: กราฟแพ็กเกจและซับรูทีน

Canonical source: https://maguyva.ai/th/languages/perl

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

Maguyva รองรับ Perl ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตามแพ็กเกจ ซับรูทีน การนำเข้าด้วย use และ require และคอนสตรักเตอร์ใน Perl รุ่นเก่า

## ภาพรวมการรองรับ

- ระดับ: รองรับ AST และสัญลักษณ์
- การเขียนโปรแกรม
- นามสกุลไฟล์: .perl, .pl, .pm, .pod, .t
- การแยกวิเคราะห์ AST จริงสำหรับการค้นหาที่รู้จักไวยากรณ์และบริบทเชิงโครงสร้าง
- สัญลักษณ์ที่มีชื่อป้อนข้อมูลให้การค้นหาเชิงความหมายและการอ้างอิงไขว้ การนำทางกราฟจะใช้งานได้เมื่อเปิดใช้การสกัดความสัมพันธ์
- ภาษานี้ส่งสัญลักษณ์และความสัมพันธ์ไปยังการค้นหาแบบรู้บริบทกราฟ โดยประเภทเอดจ์ที่รองรับจะแตกต่างกันตามโครงสร้างเฉพาะของภาษา
- รองรับทั้งการแยกวิเคราะห์ AST และการสกัดสัญลักษณ์

## เหมาะที่สุดสำหรับ

- ทีมที่รับช่วงบริการ Perl แอป CGI หรือสคริปต์งาน batch และรายงานที่ยังทำงานอยู่ในโปรดักชัน
- โค้ดเบสที่ใช้โมดูลเป็นหลัก ซึ่งแพ็กเกจ `.pm` ถูกใช้ร่วมกันในสคริปต์และไฟล์ทดสอบจำนวนมาก
- งานย้ายระบบหรือปลดระวาง ซึ่งคำถามแรกคือสคริปต์ใดพึ่งพาโมดูลใด

## เวิร์กโฟลว์ของเอเจนต์

- แสดงรายการทุกสคริปต์และโมดูลที่ใช้แพ็กเกจที่ใช้ร่วมกัน ก่อนแก้ไขแพ็กเกจนั้น
- หาว่าคลาสถูกสร้างด้วย `->new` ที่ใด และหลังจากนั้นเรียกซับรูทีนใด
- ติดตามรายงานหรืองานหนึ่ง ตั้งแต่สคริปต์เริ่มต้นผ่านโมดูลที่สคริปต์โหลด

## ทำไมมรดก Perl จึงแก้ไขอย่างปลอดภัยได้ยาก

โค้ด Perl หนาแน่น ยืดหยุ่น และมักเขียนโดยคนที่จากไปหลายปีแล้ว sigil เปลี่ยนความหมายของชื่อ แพ็กเกจทำหน้าที่เป็นคลาสด้วย และโมดูลเดียวกันถูกโหลดจากสคริปต์ในหลายไดเรกทอรี การค้นหาข้อความหาสตริงเจอ แต่ไม่ได้บอกเอเจนต์ว่าสคริปต์เรียกซับรูทีนใดจริง

Maguyva ให้แพ็กเกจ ซับรูทีน การนำเข้า และคอนสตรักเตอร์กับเอเจนต์ในรูปของโครงสร้าง เพื่อให้กำหนดขอบเขตการเปลี่ยนแปลงได้ก่อนแตะโค้ด

## Maguyva ดึงอะไรจาก Perl ได้บ้าง

Maguyva ครอบคลุม `.pl`, `.pm`, `.t`, `.pod` และ `.perl` ซับรูทีนถูกดึงออกมาเป็นฟังก์ชัน และการประกาศ `package` เป็นคลาส โดย sigil (`$`, `@`, `%`, `&`, `*`) ถูกตัดออกจากชื่อนิยาม จึงค้นหาตัวแปรและซับรูทีนด้วยชื่อเปล่าได้

การนำเข้ามาจากคำสั่ง `use`, `require` และ `package` การเรียกเมธอดรูปแบบ `Class->new` นับเป็นการสร้างอินสแตนซ์ ส่วน `bless` และ `tie` ถูกเก็บไว้ในกราฟการเรียกโดยตั้งใจ กราฟยังบันทึกการสืบทอด การ override การอ้างอิงชนิดข้อมูล การอ่านและการเขียน และการโยนเอกซ์เซปชันด้วย

ฟังก์ชันในตัวราว 189 รายการ (`print`, `open`, `die`, `warn` และอื่น ๆ ทำนองเดียวกัน) ถูกกรองออกจากความสัมพันธ์การเรียก เพื่อให้โค้ดของรีโพซิทอรีโดดเด่นขึ้นมา

## ตัวอย่างพรอมต์สำหรับเอเจนต์

- "สคริปต์ใดใช้ `Billing::Invoice` และเรียกซับรูทีนใดของแพ็กเกจนี้" (`dependency_search` ทิศทางขาเข้า)
- "`Report::Monthly` ถูกสร้างที่ใด และเกิดอะไรขึ้นหลัง `->new`" (`find_symbol` แล้วตามด้วย `get_task_context`)
- "หาไฟล์ทดสอบทั้งหมดที่ทดสอบ `Auth::Session`" (`text_pattern_search` แล้วตามด้วย `find_symbol`)

## ข้อจำกัดที่ทราบ

- เมธอด Perl แบบดั้งเดิมเป็นเพียงการประกาศ `sub` ภายในแพ็กเกจ ในการค้นหาเชิงโครงสร้าง จึงมีเพียงไวยากรณ์ `method` แบบเฉพาะที่ใหม่กว่าที่ถูกจัดเป็นเมธอด สำหรับ Perl เชิงวัตถุรุ่นเก่า ให้ใช้พรีเซ็ต `functions`
- การเรียกฟังก์ชันในตัวที่ถูกกรองจะไม่ปรากฏเป็นเส้นเชื่อมในกราฟ ใช้ `text_pattern_search` เมื่อต้องการทุกการเรียก `open` หรือ `print`

## ขั้นตอนถัดไป

เชื่อมต่อรีโพซิทอรีด้วย[คู่มือเริ่มต้นใช้งาน](/th/docs/quickstart) แล้วดูตารางการรองรับได้ที่[หน้าความเข้ากันได้](/th/docs/compatibility) หากมรดกโค้ดกำลังย้ายไปภาษาสคริปต์อื่น ให้เทียบกับ[คู่มือภาษา Python](/th/languages/python)

## รายละเอียดเอนจิน

- การรองรับ Perl ครอบคลุม `.pl`, `.pm`, `.t`, `.pod` และ `.perl` ซับรูทีนเป็นฟังก์ชัน และการประกาศ `package` เป็นคลาส
- sigil ถูกตัดออกจากชื่อนิยาม `use` และ `require` กลายเป็นการนำเข้า และ `Class->new` นับเป็นการสร้างอินสแตนซ์
- ฟังก์ชันในตัวราว 189 รายการ เช่น `print`, `open` และ `die` ถูกกรองออกจากการเรียก ขณะที่ `bless` และ `tie` ยังอยู่ในกราฟ

## จุดเริ่มต้น MCP ที่มีประโยชน์

- `find_symbol`: ใช้กับชื่อแพ็กเกจหรือซับรูทีน sigil ถูกตัดออกแล้ว จึงค้นหาด้วยชื่อเปล่า
- `dependency_search`: ใช้การท่องกราฟทิศทางขาเข้าบนโมดูลที่ใช้ร่วมกัน เพื่อดูว่าสคริปต์และแพ็กเกจใดพึ่งพาอยู่
- `text_pattern_search`: ใช้กับฟังก์ชันในตัวที่ถูกกรอง คีย์การตั้งค่า และสตริง SQL ที่อยู่นอกกราฟการเรียก
