<li><a href="#new_unicode_semantics__no_more_use_utf8__almost_">New Unicode semantics (no more <code>use utf8</code>, almost)</a></li>
<li><a href="#incompatible__but_reliable__signals_implementation">Incompatible, but reliable, signals implementation</a></li>
<li><a href="#perl_debugger_commands_are_different">Perl debugger commands are different</a></li>
<li><a href="#attributes_for_my_variables_now_handled_at_runtime">Attributes for <code>my</code> variables now handled at run-time</a></li>
<li><a href="#references_to_references_stringify_as_ref_______not_scalar_____">References to references stringify as REF(...), not <code>SCALAR(...)</code></a></li>
<li><a href="#glob___now_returns_filenames_in_alphabetical_order"><code>glob()</code> now returns filenames in alphabetical order</a></li>
<li><a href="#time__local__timelocal___and_fractional_seconds">Time::Local::timelocal() and fractional seconds</a></li>
<li><a href="#bless_ref__ref__no_longer_supported">bless(REF, REF) no longer supported</a></li>
<li><a href="#selfties_are_unsupported">Self-ties are unsupported</a></li>
<li><a href="#tied_hash_methods_exists_and_delete_are_mandatory">Tied hash methods EXISTS and DELETE are mandatory</a></li>
<li><a href="#perl_hashes_remain_unordered__only_differently_so">Perl hashes remain unordered, only differently so</a></li>
<li><a href="#use_may_fail_if_module_does_not_define_a__version"><code>use</code> may fail if module does not define a <code>$VERSION</code></a></li>
<li><a href="#chat2_pl_has_been_removed">chat2.pl has been removed</a></li>
<li><a href="#chdir_____and_chdir_undef__are_deprecated"><code>chdir('')</code> and <code>chdir(undef)</code> are deprecated</a></li>
<li><a href="#dump___should_now_be_spelled_core__dump__"><code>dump()</code> should now be spelled CORE::dump()</a></li>
<li><a href="#unimplemented_posix_regex_features_are_now_fatal">Unimplemented POSIX regex features are now fatal</a></li>
<li><a href="#_raw_and__crlf_disciplines_no_longer_have_inverse_behaviors"><code>:raw</code> and <code>:crlf</code> disciplines no longer have inverse behaviors</a></li>
<li><a href="#eq__ne__lt__le__ge__gt_operators_no_longer_part_of_the_language">EQ, NE, LT, LE, GE, GT operators no longer part of the language</a></li>
<li><a href="#tr___cu_has_been_removed">tr///CU has been removed</a></li>
<li><a href="#new_warnings_and_deprecations">New warnings and deprecations</a></li>
<p><strong>Perl 5.8 is not binary compatible with earlier releases of Perl.</strong></p>
<p><strong>You have to recompile your XS modules.</strong></p>
<p>Pure Perl modules should continue to work, subject to the other
incompatibilities listed here.</p>
<p>
</p>
<h2><a name="new_unicode_semantics__no_more_use_utf8__almost_">New Unicode semantics (no more <code>use utf8</code>, almost)</a></h2>
<p>In general, the interfaces and implementation of Unicode support has
changed significantly from the 5.6 release.</p>
<p>Previously in Perl 5.6 to use Unicode one would say ``use utf8'' and
then the operations (like string concatenation) were Unicode-aware
in that lexical scope.</p>
<p>This was found to be an inconvenient interface, and in Perl 5.8 the
Unicode model has completely changed: now the ``Unicodeness'' is bound
to the data itself, and for most of the time ``use utf8'' is not needed
at all. The only remaining use of ``use utf8'' is when the Perl script
itself has been written in the UTF-8 encoding of Unicode. (UTF-8 has
not been made the default since there are many Perl scripts out there
that are using various national eight-bit character sets, which would
be illegal in UTF-8.)</p>
<p>See <em>perluniintro</em> for the explanation of the current model,
and <em>utf8</em> for the current use of the utf8 pragma.</p>
<p>
</p>
<h2><a name="incompatible__but_reliable__signals_implementation">Incompatible, but reliable, signals implementation</a></h2>
<p>The new safe signals implementation postpones handling of
signals until it's safe (in between the execution of low level opcodes).</p>
<p>This change may have surprising side effects because signals no longer
interrupt Perl instantly. Perl will now first finish whatever it was
doing, like finishing an internal operation (such as <code>sort())</code> or an
external operation (like an I/O operation), and only then look at any
arrived signals (but before starting the next operation).
This means that the signal handler may be called at a different point
than before, conceivably when it is no longer useful. Note that breaking
out from potentially blocking operations should still work, though.</p>
<p>
</p>
<h2><a name="perl_debugger_commands_are_different">Perl debugger commands are different</a></h2>
<p>The command line Perl debugger (<code>perl5db.pl</code>) has been modified to present
a more consistent command interface. To use the old style commands,
enter <code>o CommandSet=pre580</code> at the debugger prompt.</p>
<p>
</p>
<h2><a name="attributes_for_my_variables_now_handled_at_runtime">Attributes for <code>my</code> variables now handled at run-time</a></h2>
<p>The <code>my EXPR : ATTRS</code> syntax now applies variable attributes at
run-time. (Subroutine and <code>our</code> variables still get attributes applied
at compile-time.) See <em>attributes</em> for additional details. In particular,
however, this allows variable attributes to be useful for <code>tie</code> interfaces,
which was a deficiency of earlier releases. Note that the new semantics
doesn't work with the Attribute::Handlers module (as of version 0.76).</p>
<p>
</p>
<h2><a name="references_to_references_stringify_as_ref_______not_scalar_____">References to references stringify as REF(...), not <code>SCALAR(...)</code></a></h2>
<p>A reference to a reference now stringifies as ``REF(0x81485ec)'' instead
of ``SCALAR(0x81485ec)'' in order to be more consistent with the return
value of ref().</p>
<p>
</p>
<h2><a name="glob___now_returns_filenames_in_alphabetical_order"><code>glob()</code> now returns filenames in alphabetical order</a></h2>
<p>The list of filenames from <code>glob()</code> (or <...>) is now by default sorted
alphabetically to be csh-compliant (which is what happened before
in most UNIX platforms). (bsd_glob() continues to sort platform
natively, ASCII or EBCDIC, unless GLOB_ALPHASORT is specified.)</p>
<p>This change was already included in Perl 5.6.1.</p>
<p>
</p>
<h2><a name="time__local__timelocal___and_fractional_seconds">Time::Local::timelocal() and fractional seconds</a></h2>
<p>Time::Local::timelocal() does not handle fractional seconds anymore.
The rationale is that neither does localtime(), and <code>timelocal()</code> and
<code>localtime()</code> are supposed to be inverses of each other.</p>
<p>
</p>
<h2><a name="bless_ref__ref__no_longer_supported">bless(REF, REF) no longer supported</a></h2>
<p>The semantics of bless(REF, REF) were unclear and until someone proves
it to make some sense, it is forbidden.</p>
<p>
</p>
<h2><a name="selfties_are_unsupported">Self-ties are unsupported</a></h2>
<p>Self-ties of arrays and hashes are no longer supported. Attempts to
do this will cause fatal errors.</p>
<p>
</p>
<h2><a name="tied_hash_methods_exists_and_delete_are_mandatory">Tied hash methods EXISTS and DELETE are mandatory</a></h2>
<p>Tied hash interfaces are now required to have the EXISTS and DELETE
methods (either own or inherited).</p>
<p>
</p>
<h2><a name="perl_hashes_remain_unordered__only_differently_so">Perl hashes remain unordered, only differently so</a></h2>
<p>Although ``you shouldn't do that'', it was possible to write code that
depends on Perl's hashed key order (Data::Dumper does this). The new
algorithm ``One-at-a-Time'' produces a different hashed key order.
More details are in <em>perl58delta</em>, ``Performance Enhancements''.</p>
<p>
</p>
<h2><a name="use_may_fail_if_module_does_not_define_a__version"><code>use</code> may fail if module does not define a <code>$VERSION</code></a></h2>
<p>If you specify a required minimum version when loading a
module with <code>use</code>, and that module does not define a $VERSION,
a fatal error is produced.</p>
<p>
</p>
<h2><a name="chat2_pl_has_been_removed">chat2.pl has been removed</a></h2>
<p>The obsolete chat2 library that should never have been allowed
to escape the laboratory has been decommissioned.</p>
<p>
</p>
<h2><a name="chdir_____and_chdir_undef__are_deprecated"><code>chdir('')</code> and <code>chdir(undef)</code> are deprecated</a></h2>
<p>Using <code>chdir('')</code> or <code>chdir(undef)</code> instead of explicit <code>chdir()</code> is
doubtful. A failure (think <code>chdir(some_function())</code> can lead into
unintended <code>chdir()</code> to the home directory, therefore this behaviour
is deprecated.</p>
<p>
</p>
<h2><a name="dump___should_now_be_spelled_core__dump__"><code>dump()</code> should now be spelled CORE::dump()</a></h2>
<p>The builtin <code>dump()</code> function has probably outlived most of its
usefulness. The core-dumping functionality remains
available as an explicit call to <code>CORE::dump()</code>, but in future
releases the behaviour of an unqualified <code>dump()</code> call may change.</p>
<p>
</p>
<h2><a name="unimplemented_posix_regex_features_are_now_fatal">Unimplemented POSIX regex features are now fatal</a></h2>
<p>The unimplemented POSIX regex features [[.cc.]] and [[=c=]] are still
recognised but now cause fatal errors. The previous behaviour of
ignoring them by default and warning if requested was unacceptable
since it, in a way, falsely promised that the features could be used.</p>
<p>
</p>
<h2><a name="_raw_and__crlf_disciplines_no_longer_have_inverse_behaviors"><code>:raw</code> and <code>:crlf</code> disciplines no longer have inverse behaviors</a></h2>
<p>Previous versions of perl and some readings of some sections of Camel
III implied that the <code>:raw</code> ``discipline'' was the inverse of <code>:crlf</code>.
Turning off ``clrfness'' is no longer enough to make a stream truly
binary. So the PerlIO <code>:raw</code> layer (or ``discipline'', to use the Camel
book's older terminology) is now formally defined as being equivalent
to <code>binmode(FH)</code> - which is in turn defined as doing whatever is
necessary to pass each byte as-is without any translation. In
particular <code>binmode(FH)</code> - and hence <code>:raw</code> - will now turn off both
CRLF and UTF-8 translation and remove other layers (e.g. :encoding())
Self-tying of arrays and hashes is broken in rather deep and
hard-to-fix ways. As a stop-gap measure to avoid people from getting
frustrated at the mysterious results (core dumps, most often), it is
forbidden for now (you will get a fatal error even from an attempt).
</dd>
<dd>
<p>A change to self-tying of globs has caused them to be recursively
referenced (see: <em>perlobj</em>, ``Two-Phased Garbage Collection''). You
will now need an explicit untie to destroy a self-tied glob. This
behaviour may be fixed at a later date.</p>
</dd>
<dd>
<p>Self-tying of scalars and IO objects works.</p>
</dd>
<p></p>
<dt><strong><a name="item_tied_2fmagical_array_2fhash_elements_do_not_autovi">Tied/Magical Array/Hash Elements Do Not Autovivify</a></strong><br />
</dt>
<dd>
For normal arrays <code>$foo = \$bar[1]</code> will assign <code>undef</code> to
<code>$bar[1]</code> (assuming that it didn't exist before), but for
tied/magical arrays and hashes such autovivification does not happen
because there is currently no way to catch the reference creation.
The same problem affects slicing over non-existent indices/keys of
a tied/magical array/hash.
</dd>
<p></p>
<dt><strong><a name="item_unicode_in_package_2fclass_and_subroutine_names_do">Unicode in package/class and subroutine names does not work</a></strong><br />
</dt>
<dd>
One can have Unicode in identifier names, but not in package/class or
subroutine names. While some limited functionality towards this does
exist as of Perl 5.8.0, that is more accidental than designed; use of
Unicode for the said purposes is unsupported.
</dd>
<dd>
<p>One reason for this incompleteness is its (currently) inherent
non-portability: since both package names and subroutine names may
need to be mapped to file and directory names, the Unicode capability
of the filesystem becomes important, and there unfortunately aren't
portable answers.</p>
</dd>
<p></p></dl>
<p>
</p>
<h2><a name="linux_and_solaris">Linux and Solaris</a></h2>
<ul>
<li></li>
Some versions of tar on Solaris have bugs that prevent proper extraction
of files in a package that has long path names. Most other versions
of tar on Solaris use a different method than GNU tar to encode pathnames
longer than 100 characters. GNU tar is therefore required to extract the
package into the filesystem correctly. A precompiled version of GNU tar