100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Programming

Perl One-Liners

Master Perl's command-line switches like -e, -n, -p, -a, and -i to write powerful text-processing one-liners without writing a script file.

Advanced PerlIntermediate8 min readJul 10, 2026
Analogies

The Power of -e, -n, -p

Perl earned much of its early reputation as 'the Swiss Army chainsaw' of Unix text processing because you can run entire programs from the shell prompt with the -e switch, which tells perl to execute the string that follows as code instead of reading a script file. Combine -e with -n or -p to get an implicit read loop around your code: -n wraps your code in while (<>) { ... } so it runs once per input line without printing anything automatically, while -p does the same but also prints $_ at the end of each iteration, making it ideal for line-by-line transformations read from STDIN or files listed on the command line.

🏏

Cricket analogy: A commentator's quick aside dropped into live coverage without cutting to a full studio segment is like perl -e — a fast inline execution without the overhead of a whole script file loaded up front.

Common Switches

-i enables in-place editing, rewriting the input file(s) with the output of your code instead of printing to STDOUT; giving it a suffix like -i.bak preserves the original file under that backup name before overwriting. -a turns on autosplit mode, splitting each input line on whitespace (or a custom pattern given with -F) into the @F array, which is invaluable for quick field-based processing of space- or comma-delimited data. -l enables automatic line-ending handling, chomping the input record separator on read and appending it on print, which avoids the common one-liner mistake of doubled or missing newlines.

🏏

Cricket analogy: Editing a scorecard directly on the official ledger while keeping a photocopy as backup mirrors -i.bak — modifying the file in place while preserving the original under a safety copy.

perl
# In-place edit: replace 'foo' with 'bar' in file.txt, keep file.txt.bak
perl -i.bak -pe 's/foo/bar/g' file.txt

# Print the 3rd whitespace-delimited field of each line
perl -lane 'print $F[2]' access.log

# Sum the 2nd column of a CSV (comma-delimited)
perl -F',' -lane '$sum += $F[1] } END { print $sum' data.csv

Practical One-Liner Patterns

Because -a autosplits into @F, field-based reports are trivial: perl -lane 'print $F[0] if $F[2] > 100' file selects lines where the third field exceeds 100. Combining -n with a regex match and print gives you a grep-equivalent: perl -ne 'print if /ERROR/' app.log. A running total or line count uses the special END {} block, which runs once after all input is processed, so perl -ne '$n++ } END { print "$n\n"' counts lines like wc -l, and perl -lne '$sum += $_ } END { print $sum' sums a column of numbers.

🏏

Cricket analogy: Filtering a ball-by-ball log to only show deliveries where the run column exceeds 4 mirrors perl -lane's field-based filtering with $F[n] on live match data.

For quick reformatting, -pe combined with a regex substitution is the most common Perl one-liner idiom in the world: perl -pe 's/,/\t/g' converts commas to tabs across every line and file given, printing each modified line automatically because -p implies auto-print. Multiple -e strings can be given to build up longer logic without a semicolon-separated wall of text, and BEGIN { } / END { } blocks let you run setup and teardown code exactly once regardless of how many lines -n or -p processes, which is useful for opening a second output filehandle or printing a final report line.

🏏

Cricket analogy: Converting every over's ball-by-ball notation from commas to slashes across an entire match transcript mirrors perl -pe 's/,/\t/g' reformatting every line automatically.

BEGIN { } and END { } blocks in a one-liner run exactly once, before the implicit -n/-p loop starts and after it finishes, respectively. This is the idiomatic way to print a header, open a report file, or emit a final total: perl -ne 'BEGIN { print "Report:\n" } print if /WARN/; END { print "Done.\n" }' app.log

Running perl -pe 's/.../.../g' file.txt WITHOUT -i prints the transformed output to STDOUT and leaves file.txt untouched — that is usually what you want for testing. But -i with no suffix argument (bare -i) overwrites the file in place with NO backup, so always test your substitution without -i first, or use -i.bak until you're confident the regex is correct.

  • -e executes a string of Perl code directly from the command line, no script file needed.
  • -n wraps your code in an implicit while(<>) loop with no auto-print; -p does the same but auto-prints $_ each iteration.
  • -a autosplits each line on whitespace (or -F pattern) into @F for easy field access.
  • -i enables in-place file editing; -i.bak keeps a backup copy before overwriting.
  • -l handles line endings automatically, chomping on input and re-appending on output.
  • END { } blocks run once after all input is processed, ideal for totals and summary counts.
  • Always test destructive substitutions without -i (or with -i.bak) before overwriting files for real.

Practice what you learned

Was this page helpful?

Topics covered

#Programming#PerlStudyNotes#PerlOneLiners#Perl#One#Liners#Power#StudyNotes#SkillVeris#ExamPrep