docs(zh-CN): update

This commit is contained in:
neo
2026-03-13 17:45:44 +08:00
parent f548ca3e19
commit 4c0107a322
88 changed files with 16872 additions and 280 deletions

View File

@@ -0,0 +1,47 @@
---
paths:
- "**/*.pl"
- "**/*.pm"
- "**/*.t"
- "**/*.psgi"
- "**/*.cgi"
---
# Perl 编码风格
> 本文档在 [common/coding-style.md](../common/coding-style.md) 的基础上,补充了 Perl 相关的内容。
## 标准
* 始终 `use v5.36`(启用 `strict``warnings``say` 和子程序签名)
* 使用子程序签名 — 切勿手动解包 `@_`
* 优先使用 `say` 而非显式换行的 `print`
## 不可变性
* 对所有属性使用 **Moo**,并配合 `is => 'ro'``Types::Standard`
* 切勿直接使用被祝福的哈希引用 — 始终通过 Moo/Moose 访问器
* **面向对象覆盖说明**:对于计算得出的只读值,使用 Moo `has` 属性并配合 `builder``default` 是可以接受的
## 格式化
使用 **perltidy** 并采用以下设置:
```
-i=4 # 4-space indent
-l=100 # 100 char line length
-ce # cuddled else
-bar # opening brace always right
```
## 代码检查
使用 **perlcritic**,严重级别设为 3并启用主题`core``pbp``security`
```bash
perlcritic --severity 3 --theme 'core || pbp || security' lib/
```
## 参考
查看技能:`perl-patterns`,了解全面的现代 Perl 惯用法和最佳实践。

View File

@@ -0,0 +1,23 @@
---
paths:
- "**/*.pl"
- "**/*.pm"
- "**/*.t"
- "**/*.psgi"
- "**/*.cgi"
---
# Perl 钩子
> 本文件在 [common/hooks.md](../common/hooks.md) 的基础上扩展了 Perl 相关的内容。
## PostToolUse 钩子
`~/.claude/settings.json` 中配置:
* **perltidy**:编辑后自动格式化 `.pl``.pm` 文件
* **perlcritic**:编辑 `.pm` 文件后运行代码检查
## 警告
* 警告在非脚本 `.pm` 文件中使用 `print` — 应使用 `say` 或日志模块(例如,`Log::Any`

View File

@@ -0,0 +1,77 @@
---
paths:
- "**/*.pl"
- "**/*.pm"
- "**/*.t"
- "**/*.psgi"
- "**/*.cgi"
---
# Perl 模式
> 本文档在 [common/patterns.md](../common/patterns.md) 的基础上扩展了 Perl 特定的内容。
## 仓储模式
在接口背后使用 **DBI****DBIx::Class**
```perl
package MyApp::Repo::User;
use Moo;
has dbh => (is => 'ro', required => 1);
sub find_by_id ($self, $id) {
my $sth = $self->dbh->prepare('SELECT * FROM users WHERE id = ?');
$sth->execute($id);
return $sth->fetchrow_hashref;
}
```
## DTOs / 值对象
使用带有 **Types::Standard****Moo** 类(相当于 Python 的 dataclasses
```perl
package MyApp::DTO::User;
use Moo;
use Types::Standard qw(Str Int);
has name => (is => 'ro', isa => Str, required => 1);
has email => (is => 'ro', isa => Str, required => 1);
has age => (is => 'ro', isa => Int);
```
## 资源管理
* 始终使用 **三参数 open** 配合 `autodie`
* 使用 **Path::Tiny** 进行文件操作
```perl
use autodie;
use Path::Tiny;
my $content = path('config.json')->slurp_utf8;
```
## 模块接口
使用 `Exporter 'import'` 配合 `@EXPORT_OK` — 绝不使用 `@EXPORT`
```perl
use Exporter 'import';
our @EXPORT_OK = qw(parse_config validate_input);
```
## 依赖管理
使用 **cpanfile** + **carton** 以实现可复现的安装:
```bash
carton install
carton exec prove -lr t/
```
## 参考
查看技能:`perl-patterns` 以获取全面的现代 Perl 模式和惯用法。

View File

@@ -0,0 +1,70 @@
---
paths:
- "**/*.pl"
- "**/*.pm"
- "**/*.t"
- "**/*.psgi"
- "**/*.cgi"
---
# Perl 安全
> 本文档在 [common/security.md](../common/security.md) 的基础上扩展了 Perl 相关的内容。
## 污染模式
* 在所有 CGI/面向 Web 的脚本中使用 `-T` 标志
* 在执行任何外部命令前,清理 `%ENV` (`$ENV{PATH}``$ENV{CDPATH}` 等)
## 输入验证
* 使用允许列表正则表达式进行去污化 — 绝不要使用 `/(.*)/s`
* 使用明确的模式验证所有用户输入:
```perl
if ($input =~ /\A([a-zA-Z0-9_-]+)\z/) {
my $clean = $1;
}
```
## 文件 I/O
* **仅使用三参数 open** — 绝不要使用两参数 open
* 使用 `Cwd::realpath` 防止路径遍历:
```perl
use Cwd 'realpath';
my $safe_path = realpath($user_path);
die "Path traversal" unless $safe_path =~ m{\A/allowed/directory/};
```
## 进程执行
* 使用 **列表形式的 `system()`** — 绝不要使用单字符串形式
* 使用 **IPC::Run3** 来捕获输出
* 绝对不要在反引号中使用变量插值
```perl
system('grep', '-r', $pattern, $directory); # safe
```
## SQL 注入预防
始终使用 DBI 占位符 — 绝不要将变量插值到 SQL 中:
```perl
my $sth = $dbh->prepare('SELECT * FROM users WHERE email = ?');
$sth->execute($email);
```
## 安全扫描
运行 **perlcritic** 并使用安全主题,严重级别设为 4 或更高:
```bash
perlcritic --severity 4 --theme security lib/
```
## 参考
有关全面的 Perl 安全模式、污染模式和安全 I/O请参阅技能`perl-security`

View File

@@ -0,0 +1,55 @@
---
paths:
- "**/*.pl"
- "**/*.pm"
- "**/*.t"
- "**/*.psgi"
- "**/*.cgi"
---
# Perl 测试
> 本文档在 [common/testing.md](../common/testing.md) 的基础上扩展了针对 Perl 的内容。
## 框架
在新项目中使用 **Test2::V0**(而非 Test::More
```perl
use Test2::V0;
is($result, 42, 'answer is correct');
done_testing;
```
## 测试运行器
```bash
prove -l t/ # adds lib/ to @INC
prove -lr -j8 t/ # recursive, 8 parallel jobs
```
始终使用 `-l` 以确保 `lib/` 位于 `@INC` 上。
## 覆盖率
使用 **Devel::Cover** —— 目标覆盖率 80%+
```bash
cover -test
```
## 模拟
* **Test::MockModule** —— 模拟现有模块上的方法
* **Test::MockObject** —— 从头创建测试替身
## 常见陷阱
* 测试文件末尾始终使用 `done_testing`
* 使用 `prove` 时切勿忘记 `-l` 标志
## 参考
有关使用 Test2::V0、prove 和 Devel::Cover 的详细 Perl TDD 模式,请参阅技能:`perl-testing`