# Maguyva 對 Perl 的支援：套件與副程式圖譜

Canonical source: https://maguyva.ai/zh-hant/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 以 AST、符號與圖譜支援 Perl，讓 AI 代理在舊有 Perl 中追蹤套件、副程式、use 與 require 匯入，以及建構子。

## 支援概況

- 等級: AST 與符號支援
- 程式語言
- 副檔名: .perl, .pl, .pm, .pod, .t
- 真正的 AST 剖析，支援語法感知搜尋與結構化情境。
- 具名符號支援語意查詢與交叉參照。啟用關係擷取後，即可使用圖譜導覽。
- 這個語言會為圖譜感知搜尋提供符號與關係；支援的邊類型會隨其原生構造而異。
- 同時支援 AST 剖析與符號擷取。

## 最適合的情境

- 接手仍在正式環境運作的 Perl 服務、CGI 應用程式或批次與報表腳本的團隊。
- 以模組為主的程式碼庫，`.pm` 套件被大量腳本與測試檔共用。
- 移轉或汰換工作，首先要回答的是哪些腳本依賴哪些模組。

## 代理工作流程

- 在變更共用套件之前，列出所有使用它的腳本與模組。
- 找出某個類別在哪裡以 `->new` 建構，以及接下來呼叫了哪些副程式。
- 從入口腳本出發，沿著載入的模組追蹤一份報表或一個作業。

## 為什麼 Perl 資產很難安全地修改

Perl 程式碼緊湊、靈活，而且往往出自多年前就已離開的人之手。sigil 會改變名稱的意義，套件同時兼任類別，同一個模組會被許多目錄下的腳本載入。文字搜尋找得到字串，卻無法告訴代理一個腳本實際呼叫的是哪個副程式。

Maguyva 會把套件、副程式、匯入與建構子作為結構交給代理，讓它在動到程式碼之前先界定修改的範圍。

## Maguyva 在 Perl 中擷取了什麼

Maguyva 涵蓋 `.pl`、`.pm`、`.t`、`.pod` 與 `.perl`。副程式會被擷取為函式，`package` 宣告會被擷取為類別，定義名稱中的 sigil（`$`、`@`、`%`、`&`、`*`）會被移除，因此變數與副程式都能以原始名稱搜尋。

匯入來自 `use`、`require` 與 `package` 敘述。`Class->new` 形式的方法呼叫會視為實例化，`bless` 與 `tie` 則刻意保留在呼叫圖中。圖譜也會記錄繼承、覆寫、型別參照、讀寫與例外引發。

約 189 個內建函式（`print`、`open`、`die`、`warn` 等）會從呼叫關係中過濾掉，讓儲存庫自身的程式碼更加突出。

## 代理提示範例

- 「哪些腳本使用了 `Billing::Invoice`，它們呼叫了其中哪些副程式？」（`dependency_search` 的 incoming 方向）
- 「`Report::Monthly` 在哪裡被建構，`->new` 之後發生了什麼？」（先用 `find_symbol`，再用 `get_task_context`）
- 「找出所有測試 `Auth::Session` 的測試檔。」（先用 `text_pattern_search`，再用 `find_symbol`）

## 已知限制

- 傳統的 Perl 方法就是套件內一般的 `sub` 宣告，因此在結構搜尋中，只有較新的專用 `method` 語法會被歸類為方法。對於較舊的物件導向 Perl，請使用 `functions` 預設。
- 對已過濾內建函式的呼叫不會以圖譜的邊出現。需要找出每一個 `open` 或 `print` 呼叫時，請使用 `text_pattern_search`。

## 下一步

透過[快速入門](/zh-hant/docs/quickstart)連接儲存庫，然後在[相容性頁面](/zh-hant/docs/compatibility)查看支援矩陣。如果這些資產正要移轉到另一種腳本語言，請對照閱讀 [Python 指南](/zh-hant/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`: 對共用模組使用 incoming 走訪，查看哪些腳本與套件依賴它。
- `text_pattern_search`: 用於查找呼叫圖之外的已過濾內建函式、設定鍵與 SQL 字串。
