C<'> is taken to be a I<package qualifier>; see L<perlmod>.
Perl variable names may also be a sequence of digits or a single
-punctuation or control character. These names are all reserved for
+punctuation or control character (with the literal control character
+form deprecated). These names are all reserved for
special uses by Perl; for example, the all-digits names are used
to hold data captured by backreferences after a regular expression
match. Perl has a special syntax for the single-control-character
The subscript separator for multidimensional array emulation. If you
refer to a hash element as
- $foo{$a,$b,$c}
+ $foo{$x,$y,$z}
it really means
- $foo{join($;, $a, $b, $c)}
+ $foo{join($;, $x, $y, $z)}
But don't put
- @foo{$a,$b,$c} # a slice--note the @
+ @foo{$x,$y,$z} # a slice--note the @
which means
- ($foo{$a},$foo{$b},$foo{$c})
+ ($foo{$x},$foo{$y},$foo{$z})
Default is "\034", the same as SUBSEP in B<awk>. If your keys contain
binary data there might not be any safe value for C<$;>.
value in C<ENV> changes the environment for any child processes
you subsequently C<fork()> off.
+As of v5.18.0, both keys and values stored in C<%ENV> are stringified.
+
+ my $foo = 1;
+ $ENV{'bar'} = \$foo;
+ if( ref $ENV{'bar'} ) {
+ say "Pre 5.18.0 Behaviour";
+ } else {
+ say "Post 5.18.0 Behaviour";
+ }
+
+Previously, only child processes received stringified values:
+
+ my $foo = 1;
+ $ENV{'bar'} = \$foo;
+
+ # Always printed 'non ref'
+ system($^X, '-e',
+ q/print ( ref $ENV{'bar'} ? 'ref' : 'non ref' ) /);
+
+This happens because you can't really share arbitrary data structures with
+foreign processes.
+
=item $SYSTEM_FD_MAX
=item $^F
$1 is Mutt; $2 is Jeff
$1 is Wallace; $2 is Grommit
-The C<Devel::NYTProf> and C<Devel::FindAmpersand>
-modules can help you find uses of these
-problematic match variables in your code.
+=head3 Performance issues
+
+Traditionally in Perl, any use of any of the three variables C<$`>, C<$&>
+or C<$'> (or their C<use English> equivalents) anywhere in the code, caused
+all subsequent successful pattern matches to make a copy of the matched
+string, in case the code might subsequently access one of those variables.
+This imposed a considerable performance penalty across the whole program,
+so generally the use of these variables has been discouraged.
+
+In Perl 5.6.0 the C<@-> and C<@+> dynamic arrays were introduced that
+supply the indices of successful matches. So you could for example do
+this:
+
+ $str =~ /pattern/;
-Since Perl v5.10.0, you can use the C</p> match operator flag and the
-C<${^PREMATCH}>, C<${^MATCH}>, and C<${^POSTMATCH}> variables instead
-so you only suffer the performance penalties.
+ print $`, $&, $'; # bad: perfomance hit
-If you are using Perl v5.20.0 or higher, you do not need to worry about
-this, as the three naughty variables are no longer naughty.
+ print # good: no perfomance hit
+ substr($str, 0, $-[0]),
+ substr($str, $-[0], $+[0]-$-[0]),
+ substr($str, $+[0]);
+
+In Perl 5.10.0 the C</p> match operator flag and the C<${^PREMATCH}>,
+C<${^MATCH}>, and C<${^POSTMATCH}> variables were introduced, that allowed
+you to suffer the penalties only on patterns marked with C</p>.
+
+In Perl 5.18.0 onwards, perl started noting the presence of each of the
+three variables separately, and only copied that part of the string
+required; so in
+
+ $`; $&; "abcdefgh" =~ /d/
+
+perl would only copy the "abcd" part of the string. That could make a big
+difference in something like
+
+ $str = 'x' x 1_000_000;
+ $&; # whoops
+ $str =~ /x/g # one char copied a million times, not a million chars
+
+In Perl 5.20.0 a new copy-on-write system was enabled by default, which
+finally fixes all performance issues with these three variables, and makes
+them safe to use anywhere.
+
+The C<Devel::NYTProf> and C<Devel::FindAmpersand> modules can help you
+find uses of these problematic match variables in your code.
=over 8
any matches hidden within a BLOCK or C<eval()> enclosed by the current
BLOCK).
-In Perl v5.18 and earlier, the use of this variable
-anywhere in a program imposes a considerable
-performance penalty on all regular expression matches. To avoid this
-penalty, you can extract the same substring by using L</@->. Starting
-with Perl v5.10.0, you can use the C</p> match flag and the C<${^MATCH}>
-variable to do the same thing for particular match operations.
+See L</Performance issues> above for the serious performance implications
+of using this variable (even once) in your code.
This variable is read-only and dynamically-scoped.
This is similar to C<$&> (C<$MATCH>) except that it does not incur the
performance penalty associated with that variable.
+
+See L</Performance issues> above.
+
In Perl v5.18 and earlier, it is only guaranteed
to return a defined value when the pattern was compiled or executed with
the C</p> modifier. In Perl v5.20, the C</p> modifier does nothing, so
pattern match, not counting any matches hidden within a BLOCK or C<eval>
enclosed by the current BLOCK.
-In Perl v5.18 and earlier, the use of this variable
-anywhere in a program imposes a considerable
-performance penalty on all regular expression matches. To avoid this
-penalty, you can extract the same substring by using L</@->. Starting
-with Perl v5.10.0, you can use the C</p> match flag and the
-C<${^PREMATCH}> variable to do the same thing for particular match
-operations.
+See L</Performance issues> above for the serious performance implications
+of using this variable (even once) in your code.
This variable is read-only and dynamically-scoped.
This is similar to C<$`> ($PREMATCH) except that it does not incur the
performance penalty associated with that variable.
+
+See L</Performance issues> above.
+
In Perl v5.18 and earlier, it is only guaranteed
to return a defined value when the pattern was compiled or executed with
the C</p> modifier. In Perl v5.20, the C</p> modifier does nothing, so
C<${^PREMATCH}> does the same thing as C<$PREMATCH>.
-This variable was added in Perl v5.10.0
+This variable was added in Perl v5.10.0.
This variable is read-only and dynamically-scoped.
/def/;
print "$`:$&:$'\n"; # prints abc:def:ghi
-In Perl v5.18 and earlier, the use of this variable
-anywhere in a program imposes a considerable
-performance penalty on all regular expression matches.
-To avoid this penalty, you can extract the same substring by
-using L</@->. Starting with Perl v5.10.0, you can use the C</p> match flag
-and the C<${^POSTMATCH}> variable to do the same thing for particular
-match operations.
+See L</Performance issues> above for the serious performance implications
+of using this variable (even once) in your code.
This variable is read-only and dynamically-scoped.
This is similar to C<$'> (C<$POSTMATCH>) except that it does not incur the
performance penalty associated with that variable.
+
+See L</Performance issues> above.
+
In Perl v5.18 and earlier, it is only guaranteed
to return a defined value when the pattern was compiled or executed with
the C</p> modifier. In Perl v5.20, the C</p> modifier does nothing, so
record-oriented files), then you'll likely get a full chunk of data
with every read. If a record is larger than the record size you've
set, you'll get the record back in pieces. Trying to set the record
-size to zero or less will cause reading in the (rest of the) whole file.
+size to zero or less is deprecated and will cause $/ to have the value
+of "undef", which will cause reading in the (rest of the) whole file.
+
+As of 5.19.9 setting C<$/> to any other form of reference will throw a
+fatal exception. This is in preparation for supporting new ways to set
+C<$/> in the future.
On VMS only, record reads bypass PerlIO layers and any associated
buffering, so you must not mix record and non-record reads on the
=item ${^ENCODING}
X<${^ENCODING}>
+DEPRECATED!!!
+
The I<object reference> to the C<Encode> object that is used to convert
the source code to Unicode. Thanks to this variable your Perl script
-does not have to be written in UTF-8. Default is I<undef>. The direct
-manipulation of this variable is highly discouraged.
+does not have to be written in UTF-8. Default is C<undef>.
+
+Setting this variable to any other value than C<undef> is deprecated due
+to fundamental defects in its design and implementation. It is planned
+to remove it from a future Perl version. Its purpose was to allow your
+non-ASCII Perl scripts to not have to be written in UTF-8; this was
+useful before editors that worked on UTF-8 encoded text were common, but
+that was long ago. It causes problems, such as affecting the operation
+of other modules that aren't expecting it, causing general mayhem. Its
+use can lead to segfaults.
+
+If you need something like this functionality, you should use the
+L<encoding> pragma, which is also deprecated, but has fewer nasty side
+effects.
+
+If you are coming here because code of yours is being adversely affected
+by someone's use of this variable, you can usually work around it by
+doing this:
+
+ local ${^ENCODING};
+
+near the beginning of the functions that are getting broken. This
+undefines the variable during the scope of execution of the including
+function.
This variable was added in Perl 5.8.2.
The C<%^H> hash provides the same scoping semantic as C<$^H>. This makes
it useful for implementation of lexically scoped pragmas. See
-L<perlpragma>.
+L<perlpragma>. All the entries are stringified when accessed at
+runtime, so only simple values can be accommodated. This means no
+pointers to objects, for example.
When putting items into C<%^H>, in order to avoid conflicting with other
users of the hash there is a convention regarding which keys to use.
Save source code lines into C<@{"_<$filename"}>.
+=item 0x800
+
+When saving source, include evals that generate no subroutines.
+
+=item 0x1000
+
+When saving source, include source that did not compile.
+
=back
Some bits may be relevant at compile-time only, some at
=over 8
-=item $OFMT
-
=item $#
-X<$#> X<$OFMT>
+X<$#>
C<$#> was a variable that could be used to format printed numbers.
After a deprecation cycle, its magic was removed in Perl v5.10.0 and
Removed in Perl v5.10.0.
-=item $ARRAY_BASE
-
=item $[
-X<$[> X<$ARRAY_BASE>
+X<$[>
This variable stores the index of the first element in an array, and
of the first character in a substring. The default is 0, but you could
Deprecated in Perl v5.12.0.
-=item $OLD_PERL_VERSION
-
=item $]
-X<$]> X<$OLD_PERL_VERSION>
+X<$]>
See L</$^V> for a more modern representation of the Perl version that allows
accurate string comparisons.
can be used to determine whether the Perl interpreter executing a
script is in the right range of versions:
- warn "No checksumming!\n" if $] < 3.019;
+ warn "No PerlIO!\n" if $] lt '5.008';
The floating point representation can sometimes lead to inaccurate
-numeric comparisons.
+numeric comparisons, so string comparisons are recommended.
See also the documentation of C<use VERSION> and C<require VERSION>
for a convenient way to fail if the running Perl interpreter is too old.