- Always begin scripts with `use strict;` and `use warnings;` — they catch undeclared variables and common mistakes at compile time.
- Use `my` for lexical variable declarations and avoid package globals — prefer `local` for temporary overrides of package variables.
- Name subroutines with `snake_case`, packages with `CamelCase::Hierarchy`, and constants with `ALL_CAPS` via `use constant`.
- Use `use utf8;` and `use open qw(:std :utf8);` in scripts that process Unicode text — Perl defaults to bytes, not characters.
- Prefer `say` over `print` for line-terminated output — add `use feature 'say';` or use `use 5.010;` to enable it.
- Use `//` (defined-or) instead of `||` when the default should apply to defined-but-false values like `0` or empty string.
- Document subroutines with a brief comment above the `sub` declaration — include argument types and return value description.
- Use `use Carp qw(croak confess)` for library code — `croak` reports errors from the caller's perspective, unlike `die`.