C<BELL> mean the ASCII C<BEL> character, U+0007. In Perl 5.14,
C<\N{BELL}> will continue to mean U+0007, but its use will generate a
deprecated warning message, unless such warnings are turned off. The
-new name for U+0007 in Perl will be C<ALERT>, which corresponds nicely
-with the existing shorthand sequence for it, C<"\a">. C<\N{BEL}> will
-mean U+0007, with no warning given. The character at U+1F514 will not
+new name for U+0007 in Perl is C<ALERT>, which corresponds nicely
+with the existing shorthand sequence for it, C<"\a">. C<\N{BEL}>
+means U+0007, with no warning given. The character at U+1F514 will not
have a name in 5.14, but can be referred to by C<\N{U+1F514}>. The plan
is that in Perl 5.16, C<\N{BELL}> will refer to U+1F514, and so all code
that uses C<\N{BELL}> should convert by then to using C<\N{ALERT}>,
=head3 Assignment to C<$0> sets the legacy process name with C<prctl()> on Linux
-On Linux the legacy process name will be set with L<prctl(2)>, in
+On Linux the legacy process name is now set with L<prctl(2)>, in
addition to altering the POSIX name via C<argv[0]> as perl has done
-since version 4.000. Now system utilities that read the legacy process
+since version 4.000. Now system utilities that read the legacy process
name such as ps, top and killall will recognize the name you set when
-assigning to C<$0>. The string you supply will be cut off at 16 bytes,
+assigning to C<$0>. The string you supply will be cut off at 16 bytes;
this is a limitation imposed by Linux.
=head3 C<srand()> now returns the seed
In L<perlunicode/"User-Defined Character Properties">, it says you can
create custom properties by defining subroutines whose names begin with
-"In" or "Is". However, Perl did not actually enforce that naming
-restriction, so \p{foo::bar} could call foo::bar() if it existed. Now this
+"In" or "Is". However, Perl did not actually enforce that naming
+restriction, so \p{foo::bar} could call foo::bar() if it existed. Now this
convention has been enforced.
Also, Perl no longer allows a tainted regular expression to invoke a
-user-defined. It simply dies instead [perl #82616].
+user-defined property. It simply dies instead [perl #82616].
=head1 Incompatible Changes
double-quote-like contexts. Since 5.10.1, a deprecated warning message
has been raised when this happens. Now, all double-quote-like contexts
have the same behavior, namely to be equivalent to C<\x{100}> -
-C<\x{1FF}>, with no deprecation warning. Use of these values in the
+C<\x{1FF}>, with no deprecation warning. Use of these values in the
command line option C<"-0"> retains the current meaning to slurp input
files whole; previously, this was documented only for C<"-0777">. It is
recommended, however, because of various ambiguities, to use the new
$foo =~ $bar; # when $bar contains (?{...})
$foo =~ /$bar(?{ $finished = 1 })/;
-This was a bug, which has now been fixed. But it has the potential to break
+This was a bug, which has now been fixed. But
+it has the potential to break
any code that was relying on it.
=head2 Stashes and Package Variables
# here, @a refers again to the old, tied array
The new local array used to be made tied too, which was fairly pointless,
-and has now been fixed. This fix could however potentially cause a change
+and has now been fixed. This fix could however potentially cause a change
in behaviour of some code.
=head3 Stashes are now always defined
Calling defined on a stash has been deprecated since 5.6.0, warned on
lexicals since 5.6.0, and warned for stashes (and other package
-variables) since 5.12.0. C<defined %hash> has always exposed an
+variables) since 5.12.0. C<defined %hash> has always exposed an
implementation detail - emptying a hash by deleting all entries from it does
not make C<defined %hash> false, hence C<defined %hash> is not valid code to
-determine whether an arbitrary hash is empty. Instead, use the behaviour
+determine whether an arbitrary hash is empty. Instead, use the behaviour
that an empty C<%hash> always returns false in a scalar context.
+=head3 Clearing stashes
+
+Stash list assignment C<%foo:: = ()> used to make the stash anonymous
+temporarily while it was being emptied. Consequently, any of its
+subroutines referenced elsewhere would become anonymous (showing up as
+"(unknown)" in C<caller>). Now they retain their package names, such that
+C<caller> will return the original sub name if there is still a reference
+to its typeglob, or "foo::__ANON__" otherwise [perl #79208].
+
=head3 Dereferencing typeglobs
If you assign a typeglob to a scalar variable:
$glob = *foo;
the glob that is copied to C<$glob> is marked with a special flag
-indicating that the glob is just a copy. This allows subsequent assignments
-to C<$glob> to overwrite the glob. The original glob, however, is
+indicating that the glob is just a copy. This
+allows subsequent assignments to C<$glob> to
+overwrite the glob. The original glob, however, is
immutable.
-Many Perl operators did not distinguish between these two types of globs.
+Some Perl operators did not distinguish between these two types of globs.
This would result in strange behaviour in edge cases: C<untie $scalar>
-would do nothing if the last thing assigned to the scalar was a glob
+would not untie the scalar if the last thing assigned to it was a glob
(because it treated it as C<untie *$scalar>, which unties a handle).
Assignment to a glob slot (e.g., C<*$glob = \@some_array>) would simply
assign C<\@some_array> to C<$glob>.
copy. This allows operators that make a distinction between globs and
scalars to be modified to treat only immutable globs as globs. (C<tie>,
C<tied> and C<untie> have been left as they are for compatibility's sake,
-but will warn. See L</Deprecations>.)
+but will warn. See L</Deprecations>.)
This causes an incompatible change in code that assigns a glob to the
-return value of C<*{}> when that operator was passed a glob copy. Take the
+return value of C<*{}> when that operator was passed a glob copy. Take the
following code, for instance:
$glob = *foo;
*$glob = *bar;
The C<*$glob> on the second line returns a new immutable glob. That new
-glob is made an alias to C<*bar>. Then it is discarded. So the second
+glob is made an alias to C<*bar>. Then it is discarded. So the second
assignment has no effect.
See L<http://rt.perl.org/rt3/Public/Bug/Display.html?id=77810> for even
more detail.
-=head3 Clearing stashes
-
-Stash list assignment C<%foo:: = ()> used to make the stash anonymous
-temporarily while it was being emptied. Consequently, any of its
-subroutines referenced elsewhere would become anonymous (showing up as
-"(unknown)" in C<caller>). Now they retain their package names, such that
-C<caller> will return the original sub name if there is still a reference
-to its typeglob, or "foo::__ANON__" otherwise [perl #79208].
-
=head3 Magic variables outside the main package
In previous versions of Perl, magic variables like C<$!>, C<%SIG>, etc. would
This has been fixed (or the feature has been removed, depending on how you see
it).
+=head3 local($_) will strip all magic from $_
+
+local() on scalar variables will give them a new value, but keep all
+their magic intact. This has proven to be problematic for the default
+scalar variable $_, where L<perlsub> recommends that any subroutine
+that assigns to $_ should localize it first. This would throw an
+exception if $_ is aliased to a read-only variable, and could have
+various unintentional side-effects in general.
+
+Therefore, as an exception to the general rule, local($_) will not
+only assign a new value to $_, but also remove all existing magic from
+it as well.
+
=head2 Changes to Syntax or to Perl Operators
=head3 C<given> return values
Due to this bug fix [perl #75904], functions
using the C<(*)>, C<(;$)> and C<(;*)> prototypes
-are parsed with higher precedence than before. So in the following example:
+are parsed with higher precedence than before. So
+in the following example:
sub foo($);
foo $a < $b;
the second line is now parsed correctly as C<< foo($a) < $b >>, rather than
-C<< foo($a < $b) >>. This happens when one of these operators is used in
+C<< foo($a < $b) >>. This happens when one of these operators is used in
an unparenthesised argument:
< > <= >= lt gt le ge
=head3 Negative zero
Negative zero (-0.0), when converted to a string, now becomes "0" on all
-platforms. It used to become "-0" on some, but "0" on others.
+platforms. It used to become "-0" on some, but "0" on others.
If you still need to determine whether a zero is negative, use
C<sprintf("%g", $zero) =~ /^-/> or the L<Data::Float> module on CPAN.
Previously C<my $pi := 4;> was exactly equivalent to C<my $pi : = 4;>,
with the C<:> being treated as the start of an attribute list, ending before
-the C<=>. The use of C<:=> to mean C<: => was deprecated in 5.12.0, and is now
-a syntax error. This will allow the future use of C<:=> as a new token.
+the C<=>. The use of C<:=> to mean C<: => was deprecated in 5.12.0, and is
+now a syntax error. This will allow the future use of C<:=> as a new
+token.
We find no Perl 5 code on CPAN using this construction, outside the core's
tests for it, so we believe that this change will have very little impact on
On systems other than Windows that do not have
a C<fchdir> function, newly-created threads no
-longer inherit directory handles from their parent threads. Such programs
+longer inherit directory handles from their parent threads. Such programs
would usually have crashed anyway [perl #75154].
=head3 C<close> on shared pipes
The C<close> function no longer waits for the child process to exit if the
underlying file descriptor is still in use by another thread, to avoid
-deadlocks. It returns true in such cases.
+deadlocks. It returns true in such cases.
=head3 fork() emulation will not wait for signalled children
On Windows parent processes would not terminate until all forked
childred had terminated first. However, C<kill('KILL', ...)> is
inherently unstable on pseudo-processes, and C<kill('TERM', ...)>
-might not get delivered if the child if blocked in a system call.
+might not get delivered if the child is blocked in a system call.
To avoid the deadlock and still provide a safe mechanism to terminate
the hosting process, Perl will now no longer wait for children that
have been sent a SIGTERM signal. It is up to the parent process to
waitpid() for these children if child clean-up processing must be
-allowed to finish. However, it is also the responsibility of the
+allowed to finish. However, it is also the responsibility of the
parent then to avoid the deadlock by making sure the child process
can't be blocked on I/O either.
been fixed, standardizing on the variable names used in config.sh.
This will change the behavior of Policy.sh if you happen to have been
-accidentally relying on the Policy.sh incorrect behavior.
+accidentally relying on its incorrect behavior.
=head3 Perl source code is read in text mode on Windows
The following modules will be removed from the core distribution in a
future release, and should be installed from CPAN instead. Distributions
-on CPAN which require these should add them to their prerequisites. The
+on CPAN which require these should add them to their prerequisites. The
core versions of these modules will issue a deprecation warning.
If you ship a packaged version of Perl, either alone or as part of a
=head2 "Safe signals" optimisation
-Signal dispatch has been moved from the runloop into control ops. This
+Signal dispatch has been moved from the runloop into control ops. This
should give a few percent speed increase, and eliminates almost all of
the speed penalty caused by the introduction of "safe signals" in
-5.8.0. Signals should still be dispatched within the same statement as
+5.8.0. Signals should still be dispatched within the same statement as
they were previously - if this is not the case, or it is possible to
create uninterruptible loops, this is a bug, and reports are encouraged
of how to recreate such issues.
When an object has many weak references to it, freeing that object
can under some some circumstances take O(N^2) time to free (where N is the
-number of references). The number of circumstances has been reduced
+number of references). The number of circumstances has been reduced
[perl #75254]
=head2 Lexical array and hash assignments
=head2 Size optimisations to SV and HV structures
xhv_fill has been eliminated from struct xpvhv, saving 1 IV per hash and
-on some systems will cause struct xpvhv to become cache-aligned. To avoid
+on some systems will cause struct xpvhv to become cache-aligned. To avoid
this memory saving causing a slowdown elsewhere, boolean use of HvFILL
now calls HvTOTALKEYS instead (which is equivalent) - so while the fill
data when actually required are now calculated on demand, the cases when
=head2 Memory savings for weak references
For weak references, the common case of just a single weak reference per
-referent has been optimised to reduce the storage required. In this case it
+referent has been optimised to reduce the
+storage required. In this case it
saves the equivalent of one small Perl array per referent.
=head2 C<%+> and C<%-> use less memory
C<CPAN::Meta::YAML> 0.003 has been added as a dual-life module. It supports a
subset of YAML sufficient for reading and writing META.yml and MYMETA.yml files
included with CPAN distributions or generated by the module installation
-toolchain. It should not be used for any other general YAML parsing or
+toolchain. It should not be used for any other general YAML parsing or
generation task.
=item *
-C<CPAN::Meta> version 2.110440 has been added as a dual-life module. It
+C<CPAN::Meta> version 2.110440 has been added as a dual-life module. It
provides a standard library to read, interpret and write CPAN distribution
metadata files (e.g. META.json and META.yml) which describes a
distribution, its contents, and the requirements for building it and
-installing it. The latest CPAN distribution metadata specification is
+installing it. The latest CPAN distribution metadata specification is
included as C<CPAN::Meta::Spec> and notes on changes in the specification
over time are given in C<CPAN::Meta::History>.
=item *
-C<HTTP::Tiny> 0.011 has been added as a dual-life module. It is a very
+C<HTTP::Tiny> 0.012 has been added as a dual-life module. It is a very
small, simple HTTP/1.1 client designed for simple GET requests and file
mirroring. It has has been added to enable CPAN.pm and CPANPLUS to
"bootstrap" HTTP access to CPAN using pure Perl without relying on external
=item *
The following modules were added by the C<Unicode::Collate>
-upgrade. See below for details.
+upgrade. See below for details.
C<Unicode::Collate::CJK::Big5>
=item *
+C<attributes> has been upgraded from version 0.12 to 0.14.
+
+=item *
+
C<Archive::Extract> has been upgraded from version 0.38 to 0.48.
Updates since 0.38 include: a safe print method that guards
=item *
-C<bignum> has been upgraded from version 0.23 to 0.26.
+C<Benchmark> has been upgraded from version 1.11 to 1.12.
+
+=item *
+
+C<bignum> has been upgraded from version 0.23 to 0.27.
=item *
=item *
+C<DBM_Filter> has been upgraded from version 0.03 to 0.04.
+
+=item *
+
C<Devel::DProf> has been upgraded from version 20080331.00 to 20110228.00.
Merely loading C<Devel::DProf> now no longer triggers profiling to start.
=item *
+C<Devel::Peek> has been upgraded from version 1.04 to 1.07.
+
+=item *
+
C<Devel::SelfStubber> has been upgraded from version 1.03 to 1.05.
=item *
=item *
+C<DirHandle> has been upgraded from version 1.03 to 1.04.
+
+=item *
+
C<Dumpvalue> has been upgraded from version 1.13 to 1.16.
=item *
=item *
-C<ExtUtils::ParseXS> has been upgraded from version 2.21 to 2.2209.
+C<ExtUtils::ParseXS> has been upgraded from version 2.21 to 2.2210.
+
+=item *
+
+C<Fcntl> has been upgraded from version 1.06 to 1.11.
+
+=item *
+
+C<File::Basename> has been upgraded from version 2.78 to 2.81.
=item *
=item *
+C<File::Copy> has been upgraded from version 2.17 to 2.21.
+
+=item *
+
C<File::DosGlob> has been upgraded from version 1.01 to 1.04.
It allows patterns containing literal parentheses (they no longer need to
=item *
+C<File::Glob> has been upgraded from version 1.07 to 1.12.
+
+=item *
+
C<File::Spec> has been upgraded from version 3.31 to 3.33.
Several portability fixes were made in C<File::Spec::VMS>: a colon is now
=item *
+C<Hash::Util::FieldHash> has been upgraded from version 1.04 to 1.09.
+
+=item *
+
C<I18N::Collate> has been upgraded from version 1.01 to 1.02.
=item *
C<IO> has been upgraded from version 1.25_02 to 1.25_04.
-=item *
-
-C<IO::Select> has been upgraded from version 1.17 to 1.20.
-
-It now allows IO::Handle objects (and objects in derived classes) to be
-removed from an IO::Select set even if the underlying file descriptor is
-closed or invalid.
+This version of C<IO> includes a new C<IO::Select>, which now allows IO::Handle
+objects (and objects in derived classes) to be removed from an IO::Select set
+even if the underlying file descriptor is closed or invalid.
=item *
=item *
-C<NDBM_File> has been upgraded from version 1.08 to 1.11.
+C<mro> has been upgraded from version 1.02 to 1.07.
+
+=item *
+
+C<NDBM_File> has been upgraded from version 1.08 to 1.12.
This fixes a memory leak when DBM filters are used.
=item *
-C<overload> has been upgraded from 1.10 to 1.12.
+C<Opcode> has been upgraded from version 1.15 to 1.18.
+
+=item *
+
+C<overload> has been upgraded from 1.10 to 1.13.
C<overload::Method> can now handle subroutines that are themselves blessed
into overloaded classes [perl #71998].
=item *
+C<PerlIO::encoding> has been upgraded from version 0.12 to 0.14.
+
+=item *
+
C<PerlIO::scalar> has been upgraded from 0.07 to 0.11.
A C<read> after a C<seek> beyond the end of the string no longer thinks it
=item *
+C<PerlIO::via> has been upgraded from version 0.09 to 0.11.
+
+=item *
+
+C<Pod::Html> has been upgraded from version 1.09 to 1.11.
+
+=item *
+
C<Pod::LaTeX> has been upgraded from version 0.58 to 0.59.
=item *
=item *
+C<SDBM_File> has been upgraded from version 1.06 to 1.09.
+
+=item *
+
C<SelfLoader> has been upgraded from 1.17 to 1.18.
It now works in taint mode [perl #72062].
=item *
+C<Sys::Hostname> has been upgraded from version 1.11 to 1.16.
+
+=item *
+
C<Term::ANSIColor> has been upgraded from version 2.02 to 3.00.
=item *
=item *
+C<Tie::Hash::NamedCapture> has been upgraded from version 0.06 to 0.08.
+
+=item *
+
C<Tie::RefHash> has been upgraded from version 1.38 to 1.39.
=item *
The names returned by C<Win32::GetOSName> and C<Win32::GetOSDisplayName>
have been corrected.
+=item *
+
+C<XS::Typemap> has been upgraded from version 0.03 to 0.05.
+
=back
=head2 Removed Modules and Pragmata
=head3 L<perlsource>, L<perlinterp>, L<perlhacktut>, and L<perlhacktips>
-See L</L<perlhack> and perlrepository revamp>, below.
+See L</perlhack and perlrepository revamp>, below.
=head2 Changes to Existing Documentation
=head3 L<perlmodlib> is now complete
The perlmodlib page that came with Perl 5.12.0 was missing a lot of
-modules, due to a bug in the script that generates the list. This has been
+modules, due to a bug in the script that generates the list. This has been
fixed [perl #74332] (5.12.1).
=head3 Replace wrong tr/// table in L<perlebcdic>
The documentation for the C<SvTRUE> macro in
L<perlapi> was simply wrong in stating that
-get-magic is not processed. It has been corrected.
+get-magic is not processed. It has been corrected.
=head3 L<perlvar> revamp
=head3 L<overload>
-L<overload>'s documentation has practically undergone a rewrite. It
+L<overload>'s documentation has practically undergone a rewrite. It
is now much more straightforward and clear.
-=head3 L<perlhack> and perlrepository revamp
+=head3 perlhack and perlrepository revamp
The L<perlhack> and perlrepository documents have been heavily edited and
split up into several new documents.
The L<perlhack> document is now much shorter, and focuses on the Perl 5
-development process and submitting patches to Perl. The technical content has
+development process and submitting patches
+to Perl. The technical content has
been moved to several new documents, L<perlsource>, L<perlinterp>,
-L<perlhacktut>, and L<perlhacktips>. This technical content has only been
+L<perlhacktut>, and L<perlhacktips>. This technical content has only been
lightly edited.
-The perlrepository document has been renamed to L<perlgit>. This new document
-is just a how-to on using git with the Perl source code. Any other content
+The perlrepository document has been renamed to
+L<perlgit>. This new document is just a how-to
+on using git with the Perl source code. Any other content
that used to be in perlrepository has been moved to perlhack.
=head3 Time::Piece examples
=item Operation "%s" returns its argument for ...
Performing an operation requiring Unicode semantics (such as case-folding)
-on a Unicode surrogate or a non-Unicode character now triggers a warning:
-'Operation "%s" returns its argument for ...'.
+on a Unicode surrogate or a non-Unicode character now triggers this
+warning.
=item Use of qw(...) as parentheses is deprecated
=item Apollo DomainOS
The last vestiges of support for this platform have been excised from the
-Perl distribution. It was officially discontinued in version 5.12.0. It had
+Perl distribution. It was officially discontinued
+in version 5.12.0. It had
not worked for years before that.
=item MacOS Classic
The last vestiges of support for this platform have been excised from the
-Perl distribution. It was officially discontinued in an earlier version.
+Perl distribution. It was officially discontinued in an earlier version.
=back
=head3 IRIX
+=over
+
+=item *
+
Conversion of strings to floating-point numbers is now more accurate on
IRIX systems [perl #32380].
+=back
+
=head3 Mac OS X
+=over
+
+=item *
+
Early versions of Mac OS X (Darwin) had buggy implementations of the
C<setregid>, C<setreuid>, C<setrgid> and C<setruid> functions, so perl
would pretend they did not exist.
These functions are now recognised on Mac OS 10.5 (Leopard; Darwin 9) and
higher, as they have been fixed [perl #72990].
+=back
+
=head3 MirBSD
+=over
+
+=item *
+
Previously if you built perl with a shared libperl.so on MirBSD (the
default config), it would work up to the installation; however, once
installed, it would be unable to find libperl. So path handling is now
treated as in the other BSD dialects.
+=back
+
=head3 NetBSD
+=over
+
+=item *
+
The NetBSD hints file has been changed to make the system's malloc the
default.
+=back
+
=head3 Recent OpenBSDs now use perl's malloc
+=over
+
+=item *
+
OpenBSD E<gt> 3.7 has a new malloc implementation which is mmap-based
and as such can release memory back to the OS; however, perl's use of
this malloc causes a substantial slowdown so we now default to using
perl's malloc instead [perl #75742].
+=back
+
=head3 OpenVOS
+=over
+
+=item *
+
perl now builds again with OpenVOS (formerly known as Stratus VOS)
[perl #78132] (5.12.3).
+=back
+
=head3 Solaris
-DTrace is now supported on Solaris. There used to be build failures, but
+=over
+
+=item *
+
+DTrace is now supported on Solaris. There used to be build failures, but
these have been fixed [perl #73630] (5.12.3).
+=back
+
=head3 VMS
=over
=item *
-F<git_version.h> is now installed on VMS. This was an oversight in v5.12.0 which
+F<git_version.h> is now installed on VMS. This
+was an oversight in v5.12.0 which
caused some extensions to fail to build (5.12.2).
=item *
It is now possible for XS code to hook into Perl's lexical scope
mechanism at compile time, using the new C<Perl_blockhook_register>
-function. See L<perlguts/"Compile-time scope hooks">.
+function. See L<perlguts/"Compile-time scope hooks">.
=head3 The recursive part of the peephole optimizer is now hookable
C<UNICODE_IS_ILLEGAL> have been removed, as they stem from a
fundamentally broken model of how the Unicode non-character code points
should be handled, which is now described in
-L<perlunicode/Non-character code points>. See also L</Selected Bug Fixes>.
-
-XXX Which bugs in particular? Selected Bug Fixes is too long for this link
-to be meaningful right now
-I don't see the bugs in that section currently -- khw
+L<perlunicode/Non-character code points>. See also the Unicode section
+under L</Selected Bug Fixes>.
=head2 Deprecated C APIs
run-time.
Use the new C<find_rundefsv> function or the C<UNDERBAR> macro
-instead. They directly return the right SV representing C<$_>, whether it's
+instead. They directly return the right SV
+representing C<$_>, whether it's
lexical or dynamic.
=item C<CALL_FPTR> and C<CPERLscope>
=item *
PerlIO no longer crashes when called recursively, e.g., from a signal
-handler. Now it just leaks memory [perl #75556].
+handler. Now it just leaks memory [perl #75556].
=item *
Most I/O functions were not warning for unopened handles unless the
-'closed' and 'unopened' warnings categories were both enabled. Now only
+'closed' and 'unopened' warnings categories were both enabled. Now only
C<use warnings 'unopened'> is necessary to trigger these warnings (as was
always meant to be the case).
A regular expression match in the right-hand side of a global substitution
(C<s///g>) that is in the same scope will no longer cause match variables
-to have the wrong values on subsequent iterations. This can happen when an
+to have the wrong values on subsequent iterations. This can happen when an
array or hash subscript is interpolated in the right-hand side, as in
C<s|(.)|@a{ print($1), /./ }|g> [perl #19078].
=item *
The C<(?|...)> regular expression construct no longer crashes if the final
-branch has more sets of capturing parentheses than any other branch. This
+branch has more sets of capturing parentheses than any other branch. This
was fixed in Perl 5.10.1 for the case of a single branch, but that fix did
not take multiple branches into account [perl #84746].
$text =~ /phoo/
-at compile time. Now it correctly matches against C<$_> [perl #20444].
+at compile time. Now it correctly matches against C<$_> [perl #20444].
=item *
=item *
-C<state> can now be used with attributes. It used to mean the same thing as
+C<state> can now be used with attributes. It
+used to mean the same thing as
C<my> if attributes were present [perl #68658].
=item *
C<PL_isarev>, which is accessible to Perl via C<mro::get_isarev> is now
updated properly when packages are deleted or removed from the C<@ISA> of
-other classes. This allows many packages to be created and deleted without
+other classes. This allows many packages to be created and deleted without
causing a memory leak [perl #75176].
=back
=item *
Assigning a glob to a PVLV used to convert it to a plain string. Now it
-works correctly, and a PVLV can hold a glob. This would happen when a
+works correctly, and a PVLV can hold a glob. This would happen when a
nonexistent hash or array element was passed to a subroutine:
sub { $_[0] = *foo }->($hash{key});
During the restoration of a localised typeglob on scope exit, any
destructors called as a result would be able to see the typeglob in an
inconsistent state, containing freed entries, which could result in a
-crash. This would affect code like this:
+crash. This would affect code like this:
local *@;
eval { die bless [] }; # puts an object in $@
}
Now the glob entries are cleared before any destructors are called. This
-also means that destructors can vivify entries in the glob. So perl tries
+also means that destructors can vivify entries in the glob. So perl tries
again and, if the entries are re-created too many times, dies with a
'panic: gp_free...' error message.
=item *
-What has become known as the "Unicode Bug" is mostly resolved in this release.
-Under C<use feature 'unicode_strings'>, the internal storage format of a
-string no longer affects the external semantics. There are two known
-exceptions. User-defined case changing functions, which are planned to
-be deprecated in 5.14, require utf8-encoded strings to function; and the
-character C<LATIN SMALL LETTER SHARP S> in regular expression
-case-insensitive matching has a somewhat different set of bugs depending
-on the internal storage format. Case-insensitive matching of all
-characters that have multi-character matches, as this one does, is
-problematical in Perl [perl #58182].
+What has become known as the "Unicode Bug" is almost completely resolved in
+this release. Under C<use feature 'unicode_strings'> (which is
+automatically selected by C<use 5.012> and above), the internal
+storage format of a string no longer affects the external semantics.
+[perl #58182].
+
+There are two known exceptions:
+
+=over
+
+=item 1
+
+The now-deprecated user-defined case changing
+functions require utf8-encoded strings to function. The CPAN module
+L<Unicode::Casing> has been written to replace this feature, without its
+drawbacks, and the feature is scheduled to be removed in 5.16.
+
+=item 2
+
+C<quotemeta> (and its in-line equivalent C<\Q>) also can give different
+results if a string is encoded in UTF-8 or not. See
+L<perlunicode/The "Unicode Bug">.
+
+=back
=item *
-The handling of Unicode non-characters has changed.
+The handling of Unicode non-character code points has changed.
Previously they were mostly considered illegal, except that only one of
the 66 of them was known about in places. The Unicode standard
considers them legal, but forbids the "open interchange" of them.
=item *
+Case-insensitive C<"/i"> regular expression matching of Unicode
+characters which match multiple characters now works much more as
+intended. For example
+
+ "\N{LATIN SMALL LIGATURE FFI}" =~ /ffi/ui
+
+and
+
+ "ffi" =~ /\N{LATIN SMALL LIGATURE FFI}/ui
+
+are both true. Previously, there were many bugs with this feature.
+What hasn't been fixed are the places where the pattern contains the
+multiple characters, but the characters are split up by other things,
+such as in
+
+ "\N{LATIN SMALL LIGATURE FFI}" =~ /(f)(f)i/ui
+
+or
+
+ "\N{LATIN SMALL LIGATURE FFI}" =~ /ffi*/ui
+
+or
+
+ "\N{LATIN SMALL LIGATURE FFI}" =~ /[a-f][f-m][g-z]/ui
+
+None of these match.
+
+Also, this matching doesn't fully conform to the current Unicode
+standard, which asks that the matching be made upon the NFD
+(Normalization Form .ecomposed) of the text. However, as of this
+writing, March 2010, the Unicode standard is currently in flux about
+what they will recommend doing with regard to such cases. It may be
+that they will throw out the whole concept of multi-character matches.
+[perl #71736].
+
+=item *
+
Naming a deprecated character in \N{...} no longer leaks memory.
=item *
In-memory files created by C<open $fh, 'E<gt>' \$buffer> were not calling
FETCH/STORE at all [perl #43789] (5.12.2).
+=item *
+
+utf8::is_utf8 now respects get-magic (e.g. $1) (5.12.1).
+
=back
=item *
=item *
-C<sprintf> now dies when passed a tainted scalar for the format. It did
+C<sprintf> now dies when passed a tainted scalar for the format. It did
already die for arbitrary expressions, but not for simple scalars
[perl #82250].
=item *
-utf8::is_utf8 now respects get-magic (e.g. $1) (5.12.1).
+C<lc>, C<uc>, C<lcfirst> and C<ucfirst> no longer return untainted strings
+when the argument is tainted. This has been broken since perl 5.8.9
+[perl #87336].
=back
C<#line> directives in string evals were not properly updating the arrays
of lines of code (C<< @{"_<..."} >>) that the debugger (or any debugging or
-profiling module) uses. In threaded builds, they were not being updated at
-all. In non-threaded builds, the line number was ignored, so any change to
+profiling module) uses. In threaded builds, they were not being updated at
+all. In non-threaded builds, the line number was ignored, so any change to
the existing line number would cause the lines to be misnumbered
[perl #79442].
crash, because the handles were not cloned, but simply passed to the new
thread, resulting in a double free.
-Now directory handles are cloned properly, on systems that have a C<fchdir>
-function. On other systems, new threads simply do not inherit directory
+Now directory handles are cloned properly, on Windows
+and on systems that have a C<fchdir> function. On other
+systems, new threads simply do not inherit directory
handles from their parent threads [perl #75154].
=item *
=item *
Perl now does a timely cleanup of SVs that are cloned into a new thread but
-then discovered to be orphaned (i.e., their owners are I<not> cloned). This
+then discovered to be orphaned (i.e., their
+owners are I<not> cloned). This
eliminates several "scalars leaked" warnings when joining threads.
=back
=item *
A signal handler called within a signal handler could cause leaks or
-double-frees. Now fixed. [perl #76248].
+double-frees. Now fixed [perl #76248].
=back
L<pos()|perlfunc/"index STR,SUBSTR,POSITION">, L<keys()|perlfunc/"keys HASH">,
and L<vec()|perlfunc/"vec EXPR,OFFSET,BITS"> could, when used in combination
with lvalues, result in leaking the scalar value they operate on, and cause its
-destruction to happen too late. This has now been fixed.
+destruction to happen too late. This has now been fixed.
=item *
=item *
C<sv_catsv_flags> no longer calls C<mg_get> on its second argument (the
-source string) if the flags passed to it do not include SV_GMAGIC. So it
+source string) if the flags passed to it do not include SV_GMAGIC. So it
now matches the documentation.
=item *
This is actually a change introduced in perl 5.12.0, but it was missed from
that release's perldelta.
+=head2 C<split> and C<@_>
+
+C<split> no longer modifies C<@_> when called in scalar or void context.
+In void context it now produces a "Useless use of split" warning.
+This was also a perl 5.12.0 changed that missed the perldelta.
+
=head1 Obituary
Randy Kobes, creator of the kobesearch alternative to search.cpan.org and