mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-13 05:03:28 +08:00
docs(zh-CN): update
This commit is contained in:
47
docs/zh-CN/rules/perl/coding-style.md
Normal file
47
docs/zh-CN/rules/perl/coding-style.md
Normal 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 惯用法和最佳实践。
|
||||
23
docs/zh-CN/rules/perl/hooks.md
Normal file
23
docs/zh-CN/rules/perl/hooks.md
Normal 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`)
|
||||
77
docs/zh-CN/rules/perl/patterns.md
Normal file
77
docs/zh-CN/rules/perl/patterns.md
Normal 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 模式和惯用法。
|
||||
70
docs/zh-CN/rules/perl/security.md
Normal file
70
docs/zh-CN/rules/perl/security.md
Normal 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`。
|
||||
55
docs/zh-CN/rules/perl/testing.md
Normal file
55
docs/zh-CN/rules/perl/testing.md
Normal 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`。
|
||||
Reference in New Issue
Block a user