Perl live coding

Evaluate Perl from Emacs in a persistent interpreter, with a separate session and REPL for each project.

Install

Requires Perl 5.22+ and Emacs 28.1+.

From MELPA (Emacs)

Install perl-live via package.el:

M-x package-install RET perl-live RET

And add to your Emacs config:

(require 'perl-live)
(add-hook 'cperl-mode-hook #'perl-live-mode)
(add-hook 'perl-mode-hook #'perl-live-mode)

From CPAN (Perl CLI)

cpanm AnyEvent::App::PerlLive

From Source

Install the Perl dependencies:

cpanm --installdeps .

Dependencies: AnyEvent, PadWalker, Package::Stash, and JSON::PP. EV and Package::Stash::XS are optional accelerators.

Keep perl-live.el and perl-live.pl together and add this to your Emacs config:

(add-to-list 'load-path "/path/to/perl-live")
(require 'perl-live)
(add-hook 'cperl-mode-hook #'perl-live-mode)
(add-hook 'perl-mode-hook #'perl-live-mode)

Or enable M-x perl-live-mode in a single buffer.

Use

| Key | Action | | --- | --- | | C-c C-l | Start or show the session | | C-c C-p | Stop | | C-c C-r | Restart | | C-c C-k | Interrupt evaluation | | C-c C-z | Switch to the REPL | | C-c C-c | Evaluate the current line or active region | | C-M-x | Evaluate inside the braces enclosing point |

Evaluation starts a session when needed. Top-level my declarations become package variables, so later evaluations can reuse them. Lexical pragmas persist; default features are enabled when supported by the running Perl. Input and output use UTF-8.

Evaluate these lines separately:

my $answer = 41;
say ++$answer; # 42

In the REPL, Return evaluates input, M-p / M-n browse history, and C-c C-c interrupts evaluation. Interrupting keeps existing variables; declarations in an unfinished evaluation are not exported. Restarting clears the session.

Errors retain source filenames and line numbers. Click an error or use M-g n / M-g p to visit it. Save source buffers for file navigation.

Configure

Sessions use the Emacs project root, an enclosing cpanfile directory, or the current directory. Set perl-live-project-directory to override detection.

Use M-x customize-group RET perl-live RET for options. perl-live-bin selects the interpreter; when it is "perl", an already loaded perlenv selects it in the project directory. Set perl-live-switches to "" to disable variable export.

Directory-local variables can configure each project, for example in .dir-locals.el:

((nil . ((perl-live-bin . "/path/to/project/perl")
         (perl-live-switches . "-g"))))

Restart after changing the interpreter or switches. REPL commands retain the settings used to start the session. Startup errors appear in its buffer.

Without Emacs

perl perl-live.pl -g

Enter Perl, then press Ctrl+D on a new line to evaluate. Ctrl+C interrupts an evaluation; exit; ends the session. Piped input evaluates at EOF and exits.

AI Assistant (MCP Server)

perl-live includes a Model Context Protocol (MCP) server for Claude Desktop, Antigravity, Cursor, and other AI coding assistants:

{
  "mcpServers": {
    "perl-live": {
      "command": "perl-live-mcp.pl"
    }
  }
}

Provides live evaluation tools (perl_live_eval, perl_live_status, perl_live_restart) allowing AI assistants to test expressions and inspect state in a persistent session.

Develop

perl test/check.pl

Runs syntax checks, Perl and Emacs tests, and Elisp byte compilation. Uses the current Perl; set EMACS to select Emacs. Set PERL_ANYEVENT_MODEL to Perl or EV to select a backend. CI covers both on Perl 5.22, 5.40, and 5.42, with Emacs 28.2 and 30.2.

Original demo.