提供现代 Perl 5.36+ 编码惯例与最佳实践,帮助构建稳健且易维护的应用。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "perl-patterns" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ja-JP/skills/perl-patterns/SKILL.md 2. 保存为 ~/.claude/skills/perl-patterns/SKILL.md 3. 装好后重载技能,告诉我可以用了
请为一个基于 Perl 5.36+ 的内部服务项目整理编码规范,涵盖模块组织、错误处理、对象写法、依赖管理、测试结构和命名约定,并给出推荐示例。
一份结构清晰的 Perl 项目规范清单,附带可落地的代码示例与推荐约定。
下面是一段旧版 Perl 脚本,请按照 Modern Perl 5.36+ 的最佳实践重构它,说明哪些写法需要替换、为什么替换,并给出重构后的完整代码和测试建议。
包含问题分析、重构理由、改进后代码以及测试建议的完整重构方案。
请给我一组 Modern Perl 5.36+ 示例,展示严格模式、签名、异常处理、不可变数据、模块拆分和单元测试的推荐写法,每项附简短说明。
一组覆盖核心主题的现代 Perl 示例片段,便于学习和直接复用。
堅牢でメンテナブルなアプリケーションを構築するためのイディオマティックなPerl 5.36+パターンとベストプラクティス。
これらのパターンをModern Perl 5.36+のデフォルトへのバイアスとして適用する: シグネチャ、明示的なモジュール、集中的なエラー処理、テスト可能な境界。以下の例は出発点としてコピーし、目の前の実際のアプリ、依存スタック、デプロイモデルに合わせて締め付けることを意図している。
v5.36プラグマの使用単一のuse v5.36が古い定型文を置き換え、strict、warnings、サブルーチンシグネチャを有効化する。
# Good: モダンなプリアンブル
use v5.36;
sub greet($name) {
say "Hello, $name!";
}
# Bad: レガシーな定型文
use strict;
use warnings;
use feature 'say', 'signatures';
no warnings 'experimental::signatures';
sub greet {
my ($name) = @_;
say "Hello, $name!";
}
明確さと自動アリティチェックのためにシグネチャを使用する。
use v5.36;
# Good: デフォルト値付きシグネチャ
sub connect_db($host, $port = 5432, $timeout = 30) {
# $hostは必須、その他はデフォルトあり
return DBI->connect("dbi:Pg:host=$host;port=$port", undef, undef, {
RaiseError => 1,
PrintError => 0,
});
}
# Good: 可変引数のためのスラーピーパラメータ
sub log_message($level, @details) {
say "[$level] " . join(' ', @details);
}
# Bad: 手動引数アンパック
sub connect_db {
my ($host, $port, $timeout) = @_;
$port //= 5432;
$timeout //= 30;
# ...
}
スカラーvsリストコンテキストを理解する — Perlのコアコンセプト。
use v5.36;
my @items = (1, 2, 3, 4, 5);
my @copy = @items; # リストコンテキスト: すべての要素
my $count = @items; # スカラーコンテキスト: カウント (5)
say "Items: " . scalar @items; # スカラーコンテキストを強制
ネストされた構造で読みやすさのために後置逆参照構文を使用する。
use v5.36;
my $data = {
users => [
{ name => 'Alice', roles => ['admin', 'user'] },
{ name => 'Bob', roles => ['user'] },
],
};
# Good: 後置逆参照
my @users = $data->{users}->@*;
my @roles = $data->{users}[0]{roles}->@*;
my %first = $data->{users}[0]->%*;
# Bad: 前置逆参照(チェーンで読みにくい)
my @users = @{ $data->{users} };
my @roles = @{ $data->{users}[0]{roles} };
isa演算子(5.32+)中置型チェック — blessed($o) && $o->isa('X')を置き換える。
use v5.36;
if ($obj isa 'My::Class') { $obj->do_something }
use v5.36;
sub parse_config($path) {
my $content = eval { path($path)->slurp_utf8 };
die "Config error: $@" if $@;
return decode_json($content);
}
use v5.36;
use Try::Tiny;
sub fetch_user($id) {
my $user = try {
$db->resultset('User')->find($id)
// die "User $id not found\n";
}
catch {
warn "Failed to fetch user $id: $_";
undef;
};
return $user;
}
use v5.40;
sub divide($x, $y) {
try {
die "Division by zero" if $y == 0;
return $x / $y;
}
catch ($e) {
warn "Error: $e";
return;
}
}
軽量でモダンなOOにはMooを優先する。メタプロトコルが必要な場合のみMooseを使用する。
# Good: Mooクラス
package User;
use Moo;
use Types::Standard qw(Str Int ArrayRef);
use namespace::autoclean;
has name => (is => 'ro', isa => Str, required => 1);
has email => (is => 'ro', isa => Str, required => 1);
has age => (is => 'ro', isa => Int, default => sub { 0 });
has roles => (is => 'ro', isa => ArrayRef[Str], default => sub { [] });
sub is_admin($self) {
return grep { $_ eq 'admin' } $self->roles->@*;
}
sub greet($self) {
return "Hello, I'm " . $self->name;
}
1;
# 使用法
my $user = User->new(
name => 'Alice',
email => '[email protected]',
roles => ['admin', 'user'],
);
# Bad: ブレスされたhashref(バリデーションなし、アクセサなし)
package User;
sub new {
my ($class, %args) = @_;
return bless \%args, $class;
}
sub name { return $_[0]->{name} }
1;
package Role::Serializable;
use Moo::Role;
use JSON::MaybeXS qw(encode_json);
requires 'TO_HASH';
sub to_json($self) { encode_json($self->TO_HASH) }
1;
package User;
use Moo;
with 'Role::Serializable';
has name => (is => 'ro', required => 1);
…
提供符合 Pythonic 风格与最佳实践的代码指导,帮助构建健壮易维护的 Python 应用。