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.
# 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.csvPractical 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
1. What is the difference between perl -n and perl -p?
2. What does the -a switch do in a Perl one-liner?
3. What is the risk of running `perl -i -pe 's/foo/bar/g' file.txt` compared to `perl -i.bak -pe 's/foo/bar/g' file.txt`?
4. In a one-liner like `perl -ne '$n++ } END { print "$n\n"' file.txt`, when does the END block execute?
5. Which command correctly prints only the lines of app.log containing the string 'ERROR'?
Was this page helpful?
You May Also Like
Closures in Perl
Understand how Perl closures capture lexical variables to create private state, counters, and callback generators using anonymous subroutines.
Perl for System Administration
Use Perl's file, process, and text-processing tools to automate sysadmin tasks like file management, process control, and log analysis.
Hashes of Arrays and Nested Structures
Learn how to build and traverse complex nested data structures in Perl using references, including hashes of arrays, arrays of hashes, and hashes of hashes.
Related Reading
Related Study Notes in Programming
Browse all study notesApache Spark Study Notes
Programming · 30 topics
ProgrammingApache Flink Study Notes
Programming · 30 topics
ProgrammingHadoop Study Notes
Programming · 30 topics
ProgrammingSnowflake Study Notes
Programming · 30 topics
ProgrammingApache Airflow Study Notes
Programming · 30 topics
Programmingdbt (Data Build Tool) Study Notes
Programming · 30 topics