必须显式指定perl.exe的完整路径,如"c:\strawberry\perl\bin\perl.exe",并用$(full_current_path)作为参数;$(current_directory)仅返回目录路径,不可替代。

Notepad++ 运行 Perl 时找不到 perl.exe 怎么办
根本原因是 Notepad++ 不知道 Perl 解释器在哪,它不会自动搜索系统 PATH。哪怕你在命令行里能直接敲 perl -v 成功,Notepad++ 也大概率报错:Cannot execute command: perl.exe not found 或直接闪退无输出。
必须显式指定完整路径。常见位置包括:C:\Perl\bin\perl.exe、C:\Strawberry\perl\bin\perl.exe、C:\xampp\perl\bin\perl.exe。用资源管理器手动找到你安装的 perl.exe,复制其绝对路径。
- 别写成
perl或perl.exe—— 缺少路径会失败 - 路径含空格(如
C:\Program Files\...)必须用双引号包裹,例如:"C:\Program Files\Strawberry\perl\bin\perl.exe" - 如果用的是 64 位 Strawberry Perl,路径通常是
C:\Strawberry\perl\bin\perl.exe;ActivePerl 则多为C:\Perl64\bin\perl.exe
$(FULL_CURRENT_PATH) 和 $(CURRENT_DIRECTORY) 的区别与误用
这两个是 Notepad++ 内置环境变量,但作用完全不同,混用会导致脚本读不到同目录下的配置文件或 require 失败。
$(FULL_CURRENT_PATH) 返回当前编辑文件的完整路径(含文件名),例如 D:\project\test.pl;而 $(CURRENT_DIRECTORY) 只返回目录路径(末尾不带反斜杠),例如 D:\project。
- 运行命令中必须用
$(FULL_CURRENT_PATH):它是perl.exe的参数,告诉解释器执行哪个文件 - 若脚本里用
open my $fh, ',且 <code>config.txt和脚本在同一目录,就必须确保工作目录是脚本所在目录——这靠 NppExec 的Follow $(CURRENT_DIRECTORY)选项实现,不是靠变量本身 - 别在命令里写成
perl.exe $(CURRENT_DIRECTORY)\test.pl:既冗余又容易因路径拼接出错(比如漏掉反斜杠)
窗口一闪而过?& PAUSE 不是唯一解法
直接调用 perl.exe 后窗口立即关闭,是因为进程结束即退出。网上流传的 & PAUSE 方案(如 cmd /k perl.exe "...".pl & PAUSE)确实能停住,但有副作用:它依赖 cmd 环境,且 PAUSE 会阻塞整个控制台,无法响应 Ctrl+C 中断。
- 更干净的做法是在 Perl 脚本末尾加一行:
my $x = <stdin>;</stdin>或<stdin>;</stdin>—— 等待一次回车,不依赖外部 shell - 如果脚本本身已有交互逻辑(比如
print "Press Enter..."; <stdin>;</stdin>),就不用额外加& PAUSE - 用
cmd /k时,& ECHO. & PAUSE & EXIT是常见组合,但EXIT其实多余;cmd /c更轻量,但窗口仍会闪退,所以仍需PAUSE或脚本内等待
NppExec 的 Follow $(CURRENT_DIRECTORY) 为什么必须勾选
默认情况下,Notepad++ 启动的 Perl 进程工作目录是 Notepad++ 自身的安装目录(比如 C:\Program Files\Notepad++),不是你的脚本所在目录。这意味着 require "lib/common.pm" 或 open my $f, ' 会失败,报错 <code>No such file or directory。
- 这个选项必须在
Plugins → NppExec → Options里手动勾选,不是默认开启 - 勾选后,NppExec 才会在执行前自动执行
cd /d "$(CURRENT_DIRECTORY)",把工作目录切到脚本所在文件夹 - 即使你用了
$(FULL_CURRENT_PATH),没勾这个选项,相对路径 I/O 依然会出错 - 验证是否生效:在脚本里加一句
print `cd`;或print getcwd(); use Cwd 'getcwd';,看输出是否为你期望的目录
Follow $(CURRENT_DIRECTORY) 勾选和 perl.exe 绝对路径的双重确认——缺一不可。其他参数再怎么调,这两点错了,脚本就大概率跑不起来或行为异常。











