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 空格 / 制表符
- 语法不完整时照样输出,不报错
- 支持代码高亮显示
- 全部在本机完成,代码不上传
使用方法
- 把代码粘贴到左侧
- 选择缩进宽度
- 按 Ctrl/⌘ + Enter 或点「运行」
- 点「复制」取走结果
常见问题
- 和那些「在线格式化」网站有什么不同?
- 多数在线格式化工具做的是文本层面的缩进整理 —— 逐字符扫描,看到 `{` 就缩进、看到 `}` 就退回。它们分不清这个括号是在代码里还是在字符串里。这里用的是真正的解析器:代码先被解析成语法树,每一行的层级由它所属的语法结构决定。 代价是要下载一份 Perl 语法文件与解析器运行时(合计约 4.4 MB),而且只在你打开这个工具页时才下载。换来的是结构判断不会出错。
- heredoc 和 POD 会被改动吗?
- 不会,而且这是 Perl 专有的一处小心。heredoc 的正文与 POD 指令(`=head1` 这类)都一行都不碰:heredoc 正文是字符串内容,缩进它等于往字符串里插空格;而 POD 指令必须顶格,缩进之后 Perl 就不再把它当 POD,而是当代码去解析,直接报语法错。 `<<~` 那种按最小缩进去除正文的 heredoc 也一样整块保留 —— 正文各行的相对缩进就是它的语义,动一行结果就变了。
- 为什么我的代码排完之后没变化?
- 那通常说明它本来就是对的,而这正是最好的结果。格式化器最坏的失败不是「排得不好看」,而是把本来正确的代码改动了 —— 那种改动会进 diff、进 code review,而且很难说清是谁改的。所以这里的策略是只在确实需要时动手。 如果代码确实乱了,输出会变。
- 它会动我的代码内容吗?
- 不会。这里只改每行开头的空白 —— 行内的一个字符都不动,不重排、不换行、不删行、不动字符串与注释,heredoc 正文与 POD 更是整块保留。所以即使遇到格式再怪异的代码,最坏的结果也只是缩进不合你的意,代码本身照跑。 顺带一提,这也意味着它不能替你补上缺失的语法(漏掉的括号、少写的分号)。它是缩进工具,不是代码修复工具。
相关工具
JS 美化与压缩
格式化在线 JS 压缩与美化:压缩去掉注释与空白(保留 /*! 许可声明),美化按大括号与分号缩进排版。字符串与模板字符串内容原样保留,文件不上传。
JS 压缩混淆
格式化去掉注释与空白,字符串与数字改成转义写法,局部变量换成短名 —— 体积更小,随手一看也更难读。全部在本机完成。
代码着色
网络把代码染上语法颜色,选中复制即可带颜色贴进 PPT 与 Word;也可以输出内联样式的 HTML 源码,直接放进博客或邮件。支持 26 种语言。
Shell 格式化
格式化给 Shell 脚本按结构缩进:if/fi、for/done、case/esac 与函数体都会对齐。只改行首空白,heredoc 与跨行字符串逐字保留。
JSON 格式化
格式化在线 JSON 格式化与校验工具:树形折叠浏览、搜索键值、逐节点改值与删除、语法错误定位到具体行列,输入框带行号与高亮。全部在浏览器本地完成。
JSON 转代码
格式化把 JSON 样本转成 TypeScript interface、Go struct、Java class 或 Rust struct:不齐的键标成可选、类型冲突退化为联合类型。全程在浏览器本地生成。