piapia123
zh

Perl 代码格式化

格式化

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

Perl 代码的缩进重排。不是数括号 —— 用真正的语法分析器(tree-sitter)把代码解析成语法树,按语法结构决定每一行该缩进几层。 为什么这件事值得用解析器?「数括号」那种做法分不清 `}` 是在代码里还是在字符串或注释里。而在 Perl 里这个坑格外多:`$h->{key}`、`"${name}"`、`q{...}` 里的花括号到处都是。一份含 `"}"` 的代码就能让它后面的缩进全乱,而它自己也看不出哪里错了。有了语法树,缩进块的边界由解析器给出。 ⚠️ 只改每行开头的空白,行内一个字符都不动。 这是刻意的约束:格式化器最坏的失败不是「排得不好看」,而是改坏了用户的代码 —— 那比不做更糟。所以这里不做行内空格规整、不重排、不换行、不删行。 ⚠️ heredoc 正文与 POD 指令是整块保留的。 这两处是 Perl 特有的:heredoc 的正文是字符串内容,缩进它等于往你的数据里插空格(`<<~` 那种按最小缩进去除的更甚 —— 正文各行的相对缩进就是它的语义);POD 指令必须顶格,缩进一下 Perl 就不再当它是 POD,改当代码解析,直接报语法错。别的语言里没有这个问题,所以这是 Perl 单独处理的一处。 语法不完整时照样输出,不报错 —— 边写边格式化就是这么用的。

功能

  • 用 tree-sitter 真的解析语法,缩进按语法结构算
  • 字符串、注释、`q{}` 里的括号不参与结构判断
  • heredoc 正文与 POD 指令一行都不动 —— Perl 特有的保护
  • 只改行首空白,行内一个字符都不动
  • 缩进可选 2 空格 / 4 空格 / 制表符
  • 语法不完整时照样输出,不报错
  • 支持代码高亮显示
  • 全部在本机完成,代码不上传

使用方法

  1. 把代码粘贴到左侧
  2. 选择缩进宽度
  3. 按 Ctrl/⌘ + Enter 或点「运行」
  4. 点「复制」取走结果

常见问题

和那些「在线格式化」网站有什么不同?
多数在线格式化工具做的是文本层面的缩进整理 —— 逐字符扫描,看到 `{` 就缩进、看到 `}` 就退回。它们分不清这个括号是在代码里还是在字符串里。这里用的是真正的解析器:代码先被解析成语法树,每一行的层级由它所属的语法结构决定。 代价是要下载一份 Perl 语法文件与解析器运行时(合计约 4.4 MB),而且只在你打开这个工具页时才下载。换来的是结构判断不会出错。
heredoc 和 POD 会被改动吗?
不会,而且这是 Perl 专有的一处小心。heredoc 的正文与 POD 指令(`=head1` 这类)都一行都不碰:heredoc 正文是字符串内容,缩进它等于往字符串里插空格;而 POD 指令必须顶格,缩进之后 Perl 就不再把它当 POD,而是当代码去解析,直接报语法错。 `<<~` 那种按最小缩进去除正文的 heredoc 也一样整块保留 —— 正文各行的相对缩进就是它的语义,动一行结果就变了。
为什么我的代码排完之后没变化?
那通常说明它本来就是对的,而这正是最好的结果。格式化器最坏的失败不是「排得不好看」,而是把本来正确的代码改动了 —— 那种改动会进 diff、进 code review,而且很难说清是谁改的。所以这里的策略是只在确实需要时动手。 如果代码确实乱了,输出会变。
它会动我的代码内容吗?
不会。这里只改每行开头的空白 —— 行内的一个字符都不动,不重排、不换行、不删行、不动字符串与注释,heredoc 正文与 POD 更是整块保留。所以即使遇到格式再怪异的代码,最坏的结果也只是缩进不合你的意,代码本身照跑。 顺带一提,这也意味着它不能替你补上缺失的语法(漏掉的括号、少写的分号)。它是缩进工具,不是代码修复工具。

相关工具