--- paths: - "**/*.pl" - "**/*.pm" - "**/*.t" - "**/*.psgi" - "**/*.cgi" --- # Perl Patterns > This file extends [common/patterns.md](../common/patterns.md) with Perl-specific content. ## Repository Pattern Use **DBI** or **DBIx::Class** behind an interface: ```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 / Value Objects Use **Moo** classes with **Types::Standard** (equivalent to 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); ``` ## Resource Management - Always use **three-arg open** with `autodie` - Use **Path::Tiny** for file operations ```perl use autodie; use Path::Tiny; my $content = path('config.json')->slurp_utf8; ``` ## Module Interface Use `Exporter 'import'` with `@EXPORT_OK` — never `@EXPORT`: ```perl use Exporter 'import'; our @EXPORT_OK = qw(parse_config validate_input); ``` ## Dependency Management Use **cpanfile** + **carton** for reproducible installs: ```bash carton install carton exec prove -lr t/ ``` ## Reference See skill: `perl-patterns` for comprehensive modern Perl patterns and idioms.