Regular expressions and pattern matching
study#
A no-op retained for source compatibility with older Perl code.
study accepts a scalar argument (or operates on $_ when
called with none) and does nothing with it. The call is valid, the
argument is evaluated, and control returns immediately. No index is
built, no regex engine state is altered, no later match runs any
faster or slower because of it.
The name survives because decades of Perl code — books, FAQs, CPAN
distributions, in-house scripts — sprinkle study in front of long
strings about to be matched against many patterns. Those programs
still parse and still run. They just no longer get the optimisation
the keyword once promised.
Synopsis#
study SCALAR
study
What you get back#
Always 1. The return value is not documented as useful and no
idiomatic code inspects it. Treat study as returning nothing worth
capturing.
History#
Through Perl 5.14 study built an inverted index of the bytes in
SCALAR, then biased the regex engine to anchor each subsequent
match on the rarest character in the pattern (rarity estimated from
a static frequency table baked into the interpreter). The intended
workload was “one long string, many m// against it”: the index
amortised across the matches.
The optimisation was removed in Perl 5.16. It interacted badly with
Unicode, /i case folding, and the post-5.10 regex engine, and the
maintenance cost had long outweighed the narrow workload it helped.
The keyword was kept as a no-op so existing source kept compiling.
Examples#
Legacy idiom — still parses, no longer has any effect:
study $big_text;
while ($big_text =~ /$pattern/g) {
# ...
}
No argument — applied to $_, also a no-op:
for (@lines) {
study;
print if /error/;
}
Replacement guidance: if the original code relied on study for
speed, the modern answer is to compile the pattern once with
qr and reuse it, or to restructure so the repeated work is
the pattern side, not the string side:
my $re = qr/$pattern/;
for my $line (@lines) {
print $line if $line =~ $re;
}
Edge cases#
No effect on regex performance. Removing every
studycall from a program changes nothing observable, including timing beyond measurement noise.Argument is still evaluated.
study some_expensive_call()runssome_expensive_call()for its side effects and return value, then discards the result. This is almost never what the author intended.No warning on use.
studydoes not warn underuse warningsand is not deprecated, so a linter is the only way to flag stale occurrences in a codebase.Not a pragma, not a hint.
studyis a regular built-in expression. It does not persist across statements and there is no “studied” state attached to the scalar.Tainting and magic are untouched.
study $tainteddoes not launder taint, does not fireFETCHon a tied scalar more than a plain read would, and does not mark the scalar in any way.
Differences from upstream#
Fully compatible with upstream Perl 5.42. study is a no-op in both.
See also#
qr— compile a pattern once and reuse the compiled form; this is the modern answer to “make many matches against the same text faster”m— the match operator whose performancestudyused to influenceindex— fixed-string search, faster than a regex when the pattern is a literal substringpos— where the last/gmatch left off, relevant to the “one long string, many matches” workloadstudyonce targeted