# Perl trên Maguyva: đồ thị package và subroutine

Canonical source: https://maguyva.ai/vi/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 hỗ trợ Perl với AST, ký hiệu và đồ thị, để agent AI có thể lần theo package, subroutine, lệnh nhập use và require cùng constructor trong mã Perl cũ.

## Tổng quan hỗ trợ

- Cấp độ: Hỗ trợ AST và symbol
- Lập trình
- Phần mở rộng: .perl, .pl, .pm, .pod, .t
- Phân tích AST thật cho tìm kiếm nhận biết cú pháp và context cấu trúc.
- Các symbol có tên cung cấp dữ liệu cho tra cứu ngữ nghĩa và tham chiếu chéo. Điều hướng graph khả dụng khi bật trích xuất quan hệ.
- Ngôn ngữ này đóng góp symbol và quan hệ cho tìm kiếm nhận biết graph; các loại edge được hỗ trợ thay đổi theo cấu trúc riêng của ngôn ngữ.
- Cả phân tích AST và trích xuất symbol đều khả dụng.

## Phù hợp nhất

- Các nhóm thừa hưởng dịch vụ Perl, ứng dụng CGI hoặc script batch và báo cáo vẫn đang chạy trên môi trường production.
- Codebase dựa trên module, nơi package `.pm` được dùng chung bởi nhiều script và tệp kiểm thử.
- Công việc di chuyển hoặc ngừng hoạt động, nơi câu hỏi đầu tiên là script nào phụ thuộc vào module nào.

## Workflow agent

- Liệt kê mọi script và module dùng một package dùng chung trước khi package đó thay đổi.
- Tìm nơi một lớp được tạo bằng `->new` và các subroutine nó gọi sau đó.
- Lần theo một báo cáo hoặc job từ script khởi đầu qua các module mà nó nạp.

## Vì sao di sản Perl khó thay đổi một cách an toàn

Mã Perl dày đặc, linh hoạt và thường do những người đã rời đi nhiều năm trước viết ra. Sigil thay đổi ý nghĩa của một cái tên, package đồng thời đóng vai trò lớp, và cùng một module được nạp từ script ở nhiều thư mục. Tìm kiếm văn bản tìm ra chuỗi, nhưng không cho agent biết script thực sự gọi subroutine nào.

Maguyva đưa cho agent package, subroutine, lệnh nhập và constructor dưới dạng cấu trúc, để nó khoanh vùng một thay đổi trước khi chạm vào mã.

## Maguyva trích xuất gì từ Perl

Maguyva bao phủ `.pl`, `.pm`, `.t`, `.pod` và `.perl`. Subroutine được trích xuất thành hàm và khai báo `package` thành lớp, với sigil (`$`, `@`, `%`, `&`, `*`) được bỏ khỏi tên định nghĩa, nên biến và subroutine có thể được tìm bằng tên trần.

Quan hệ nhập đến từ câu lệnh `use`, `require` và `package`. Lời gọi phương thức dạng `Class->new` được tính là khởi tạo, còn `bless` và `tie` được giữ lại có chủ đích trong đồ thị lời gọi. Đồ thị cũng ghi lại kế thừa, ghi đè, tham chiếu kiểu, đọc và ghi, cùng việc raise ngoại lệ.

Khoảng 189 hàm dựng sẵn (`print`, `open`, `die`, `warn` và tương tự) bị lọc khỏi quan hệ lời gọi, để mã của kho nổi bật lên.

## Ví dụ prompt cho agent

- "Những script nào dùng `Billing::Invoice`, và chúng gọi subroutine nào của nó?" (`dependency_search` theo chiều vào)
- "`Report::Monthly` được tạo ở đâu, và điều gì xảy ra sau `->new`?" (`find_symbol`, sau đó `get_task_context`)
- "Tìm mọi tệp kiểm thử kiểm tra `Auth::Session`." (`text_pattern_search`, sau đó `find_symbol`)

## Giới hạn đã biết

- Phương thức Perl cổ điển chỉ là khai báo `sub` bình thường bên trong một package, nên trong tìm kiếm cấu trúc chỉ cú pháp `method` chuyên biệt mới hơn được phân loại là phương thức. Dùng preset `functions` cho Perl hướng đối tượng kiểu cũ.
- Lời gọi tới các hàm dựng sẵn đã bị lọc không xuất hiện dưới dạng cạnh đồ thị. Dùng `text_pattern_search` khi bạn cần mọi lời gọi `open` hoặc `print`.

## Bước tiếp theo

Kết nối một kho mã bằng [hướng dẫn bắt đầu nhanh](/vi/docs/quickstart), sau đó xem ma trận hỗ trợ trên [trang tương thích](/vi/docs/compatibility). Nếu phần di sản đang được chuyển sang một ngôn ngữ script khác, hãy so sánh với [hướng dẫn Python](/vi/languages/python).

## Chi tiết engine

- Hỗ trợ Perl bao phủ `.pl`, `.pm`, `.t`, `.pod` và `.perl`. Subroutine là hàm, và khai báo `package` là lớp.
- Sigil được bỏ khỏi tên định nghĩa, `use` và `require` trở thành lệnh nhập, và `Class->new` được tính là khởi tạo.
- Khoảng 189 hàm dựng sẵn như `print`, `open` và `die` bị lọc khỏi lời gọi, trong khi `bless` và `tie` vẫn ở lại trong đồ thị.

## Điểm khởi đầu MCP hữu ích

- `find_symbol`: Dùng với tên package hoặc subroutine; sigil đã được bỏ, nên hãy tìm bằng tên trần.
- `dependency_search`: Dùng duyệt theo chiều vào trên một module dùng chung để thấy script và package nào phụ thuộc vào nó.
- `text_pattern_search`: Dùng cho các hàm dựng sẵn đã bị lọc, khóa cấu hình và chuỗi SQL nằm ngoài đồ thị lời gọi.
