Section · language decisions

A comparison is only useful when it names the task.

Every comparison here is scoped to one job with stated constraints. Dimensions are explainable and carry a confidence level. Where we have no basis, the dimension says none instead of inventing a lean.

The format

Five rules that make the comparisons boring in the right way.

  1. 01 One task, stated first The task statement and its constraints appear before any code. If your job is not that job, the conclusion does not transfer — and the page says so rather than implying generality.
  2. 02 No stars, no scores A five-star rating hides the reasoning that makes a comparison worth reading. We publish named dimensions with a lean, a confidence level and the basis for both.
  3. 03 Benchmarks or silence If no benchmark was executed, the results area says not run and stays empty. We will not repeat someone else’s numbers from hardware we did not measure.
  4. 04 Limitations are mandatory The content model refuses to publish a comparison with an empty limitations list. It is a schema rule, not a good intention.
  5. 05 A reviewed date, in public Both languages move. Every comparison carries the date an editor last checked it, and a correction link that goes to a real queue.

What it is good for

Where Perl fits, where it is arguable, and where it is simply the wrong tool.

Five bands, sixteen real task shapes. Open one to see why it sits where it does and what to weigh against it. The bottom two bands exist because a page that only lists strengths is advertising.

▰▰▰▰ Strong fit ▰▰▰▱ Reasonable ▰▰▱▱ Contested ▰▱▱▱ Poor fit ▱▱▱▱ Wrong tool

  1. Strong fit

    The work is shaped like the language. Choosing Perl here needs no argument beyond the code itself.

    Shaping text and log streams regex is syntax, not a library

    Why it sits here

    Extraction, substitution and reshaping are the operations the language was designed around. A binding operator returns captures directly; there is no match object to unpack and no import to remember.

    What else to consider

    Nothing, if the transformation is regex-shaped. Once the output grows into validated records, re-read the comparison below.

    One-off glue between two systems already installed, single file, no lockfile

    Why it sits here

    Unattended glue is judged on what happens in two years. Perl 5 is on effectively every Unix host, a single file has no dependency tree to rot, and you get real data structures the moment shell quoting stops being adequate.

    What else to consider

    Shell, if the job genuinely is three commands and a pipe. A compiled tool, if the host might not have perl — which is increasingly true of minimal container images.

    In-place edits across many files perl -pi -e is still the shortest correct answer

    Why it sits here

    One line, no script file, no temporary directory, and a backup extension if you want one. This is the case where a one-liner is not a party trick but the professional choice.

    What else to consider

    sed for the simplest substitutions. Anything with lookahead, named captures or conditional logic belongs in Perl.

    URL, redirect and link work the shape the Labs tools are built for

    Why it sits here

    Normalising addresses, comparing query signatures, following redirect chains and reasoning about link graphs — string work with structure, which is exactly the intersection Perl sits on.

    What else to consider

    Nothing, for the analysis. A headless browser, if the pages render their content client-side.

  2. Reasonable

    Perl does this well. Whether you should is usually a question about your team rather than about the language.

    A small HTTP service PSGI is clean; the constraint is hiring, not capability

    Why it sits here

    Mojolicious is a complete framework with no non-core dependencies, and PSGI decouples the application from the server entirely. The honest limit is organisational: the pool of people who will maintain it is smaller.

    What else to consider

    Your team's primary language, if the service is greenfield and nothing else nearby is Perl.

    Report generation and templating the original use case, still true

    Why it sits here

    Reading structured input and emitting formatted output is what Perl 1.0 existed for. Template::Toolkit and Mojo::Template are both mature.

    What else to consider

    A reporting tool, if non-engineers need to change the output.

    Systems automation with real data structures past the point where shell breaks

    Why it sits here

    Nested data, error handling beyond exit codes, and code that survives an OS upgrade without a rebuild.

    What else to consider

    Ansible or similar, if the work is configuration management rather than logic.

  3. Contested

    Genuinely arguable. Anyone who tells you this one is obvious has not stated their constraints.

    A CLI other people install deployment beats ergonomics

    Why it sits here

    If your users must not think about a runtime, a single static binary wins the argument before any code is written. If your users are sysadmins on hosts that already have perl, that advantage evaporates.

    What else to consider

    Go or Rust when you ship to strangers. Perl when you control the hosts.

    Long-lived pipelines with a growing schema the schema, not the language, decides

    Why it sits here

    A transformation that stays regex-shaped stays comfortable. One that grows into validated, versioned records starts wanting a type system and a validation library.

    What else to consider

    Python, if the output schema is going to keep growing. Perl, if the shape is stable and the host is locked down.

    Code a large team will maintain depends entirely on discipline

    Why it sits here

    Perl rewards conventions — strict, warnings, named subs, no clever punctuation variables — and punishes their absence more visibly than most languages. With them it reads fine. Without them it becomes the stereotype.

    What else to consider

    Whatever your team already reads fluently. That is not a cop-out; it is usually the correct answer.

  4. Poor fit

    The language can do it. The ecosystem around it cannot, and you will feel the absence daily.

    Numerical and statistical analysis the libraries are not here

    Why it sits here

    Dataframes, statistical modelling and plotting are not where Perl's ecosystem went. Choosing it costs you libraries you will actually need, and no amount of language quality compensates.

    What else to consider

    Python or R. Perl still fits upstream, preparing the data before it reaches the analysis.

    Machine learning of any kind not a close call

    Why it sits here

    Training, inference and the tooling around them live elsewhere. There is no version of this argument where Perl wins.

    What else to consider

    Python.

    Scraping browser-rendered pages fetch-and-parse is fine; rendering is not

    Why it sits here

    Mojo::UserAgent handles static fetch and DOM selection well. Driving a real browser engine is where the tooling ecosystem is decisively elsewhere.

    What else to consider

    Playwright or Puppeteer, in a language they support first.

  5. Wrong tool

    Not a tradeoff. Listing these is how the rest of the scale stays credible.

    Anything that runs in a browser the runtime is not Perl

    Why it sits here

    Frontend code runs in a JavaScript engine. This is a platform fact, not a preference.

    What else to consider

    JavaScript or TypeScript.

    Mobile applications no viable path

    Why it sits here

    There is no maintained route to a shipping iOS or Android application.

    What else to consider

    Swift, Kotlin, or a cross-platform framework.

    Software that must ship as one static binary there is a runtime, by design

    Why it sits here

    Packers exist and are fragile. If a single self-contained artefact with no interpreter is a hard requirement, that requirement has already chosen the language.

    What else to consider

    Go, Rust or C.

How to read this A band is a claim about task shape, not about difficulty or about the language's quality. Everything in the bottom two bands is something Perl is technically capable of — the placement is about what the ecosystem around it will cost you. If you think one of these is in the wrong band, say which and why.

Published

Comparisons you can read now.

One published, two commissioned. The in-progress entries are listed with their real status, not hidden until launch day.

Perl · Python14 minNo benchmark recorded

Perl or Python for a log-shaping pipeline?

Read a mixed-format access log from stdin, extract five fields, normalise timestamps to UTC, drop bot traffic and emit newline-delimited JSON — as one file a colleague can run with no build step. Both implementations are on the page. The deciding factor turns out not to be the language.

Editorial check · 5 dimensions · 3 limitations

Perl · GoDraft — 2026-09

Perl or Go for a distributable CLI?

The comparison where deployment, not language ergonomics, decides the answer. Not published — this is the backlog entry, listed so you can see it exists.

Perl · shellDraft — 2026-10

Perl or shell for glue scripts?

Where shell quoting stops being adequate, and what you give up by moving. Not published.

Propose a comparison, or challenge one.

The most useful submissions name a task precisely enough that two implementations can be judged against it. The second most useful are corrections to a dimension we got wrong.

What we will not publish A comparison with no task, a benchmark with no harness, a “winner” framed as universal, or a dimension whose basis is “everyone knows”. If a piece cannot survive its own limitations section, it does not run.