perl56delta - what's new for perl v5.6.0
This document describes differences between the 5.005 release and the 5.6.0 release.
- lib/attrs
- Compatibility tests for
sub : attrs vs the older use attrs.
- lib/env
- Tests for new environment scalar capability (e.g.,
use Env qw($BAR);).
- lib/env-array
- Tests for new environment array capability (e.g.,
use Env qw(@PATH);).
- lib/io_const
- IO constants (SEEK_*, _IO*).
- lib/io_dir
- Directory-related IO methods (new, read, close, rewind, tied delete).
- lib/io_multihomed
- INET sockets with multi-homed hosts.
- lib/io_poll
- IO poll().
- lib/io_unix
- UNIX sockets.
- op/attrs
- Regression tests for
my ($x,@y,%z) : attrs and <sub : attrs>.
- op/filetest
- File test operators.
- op/lex_assign
- Verify operations that access pad objects (lexicals and temporaries).
- op/exists_sub
- Verify
exists &sub operations.
Beware that any new warnings that have been added or old ones that have been enhanced are not
considered incompatible changes.
Since all new warnings must be explicitly requested via the -w switch or the warnings
pragma, it is ultimately the programmer's responsibility to ensure that warnings are enabled
judiciously.
- CHECK is a new keyword
- All subroutine definitions named CHECK are now special. See
/"Support for
CHECK blocks" for more information.
- Treatment of list slices of
undef has changed
- There is a potential incompatibility in the behavior of list slices that are comprised
entirely of undefined values. See /"Behavior
of list slices is more consistent".
- Format of $English::PERL_VERSION
is different
-
The English module now sets $PERL_VERSION to $^V (a string value) rather than $]
(a numeric value). This is a potential incompatibility. Send us a report via perlbug if
you are affected by this.
See /"Improved Perl version
numbering system" for the reasons for this change.
- Literals of the form
1.2.3
parse differently
-
Previously, numeric literals with more than one dot in them were interpreted as a
floating point number concatenated with one or more numbers. Such "numbers" are
now parsed as strings composed of the specified ordinals.
For example, print 97.98.99 used to output 97.9899 in earlier
versions, but now prints abc.
See /"Support
for strings represented as a vector of ordinals".
- Possibly changed pseudo-random
number generator
-
Perl programs that depend on reproducing a specific set of pseudo-random numbers may
now produce different output due to improvements made to the rand() builtin. You can use sh
Configure -Drandfunc=rand to obtain the old behavior.
See /"Better pseudo-random number
generator".
- Hashing function for hash keys has
changed
-
Even though Perl hashes are not order preserving, the apparently random order
encountered when iterating on the contents of a hash is actually determined by the hashing
algorithm used. Improvements in the algorithm may yield a random order that is different
from that of previous versions, especially when iterating on hashes.
See /"Better worst-case behavior
of hashes" for additional information.
undef fails on read only values
- Using the
undef operator on a readonly value (such as $1) has the same
effect as assigning undef to the readonly value--it throws an exception.
- Close-on-exec bit may
be set on pipe and socket handles
-
Pipe and socket handles are also now subject to the close-on-exec behavior determined
by the special variable $^F.
See /"More consistent
close-on-exec behavior".
- Writing
"$$1"
to mean "${$}1" is unsupported
-
Perl 5.004 deprecated the interpretation of $$1 and similar within
interpolated strings to mean $$ . "1", but still allowed it.
In Perl 5.6.0 and later, "$$1" always means "${$1}".
- delete(), each(), values() and
\(%h)
-
operate on aliases to values, not copies
delete(), each(), values() and hashes (e.g. \(%h)) in a list context
return the actual values in the hash, instead of copies (as they used to in earlier
versions). Typical idioms for using these constructs copy the returned values, but this
can make a significant difference when creating references to the returned values. Keys in
the hash are still returned as copies when iterating on a hash.
See also /"delete(),
each(), values() and hash iteration are faster".
- vec(EXPR,OFFSET,BITS)
enforces powers-of-two BITS
- vec() generates a run-time error if the BITS argument is not a valid power-of-two
integer.
- Text of some diagnostic output has
changed
- Most references to internal Perl operations in diagnostics have been changed to be more
descriptive. This may be an issue for programs that may incorrectly rely on the exact text
of diagnostics for proper functioning.
%@ has been removed
- The undocumented special variable
%@ that used to accumulate
"background" errors (such as those that happen in DESTROY()) has been removed,
because it could potentially result in memory leaks.
- Parenthesized not() behaves
like a list operator
-
The not operator now falls under the "if it looks like a function, it
behaves like a function" rule.
As a result, the parenthesized form can be used with grep and map.
The following construct used to be a syntax error before, but it works as expected now:
On the other hand, using not with a literal list slice may not work. The
following previously allowed construct:
needs to be written with additional parentheses now:
The behavior remains unaffected when not is not followed by parentheses.
- Semantics of bareword
prototype
(*) have changed
-
The semantics of the bareword prototype * have changed. Perl 5.005 always
coerced simple scalar arguments to a typeglob, which wasn't useful in situations where the
subroutine must distinguish between a simple scalar and a typeglob. The new behavior is to
not coerce bareword arguments to a typeglob. The value will always be visible as either a
simple scalar or as a reference to a typeglob.
See /"More functional bareword
prototype (*)".
- Semantics of
bit operators may have changed on 64-bit platforms
-
If your platform is either natively 64-bit or if Perl has been configured to used
64-bit integers, i.e., $Config{ivsize} is 8, there may be a potential incompatibility in
the behavior of bitwise numeric operators (& | ^ ~ << >>). These operators
used to strictly operate on the lower 32 bits of integers in previous versions, but now
operate over the entire native integral width. In particular, note that unary ~
will produce different results on platforms that have different $Config{ivsize}. For
portability, be sure to mask off the excess bits in the result of unary ~,
e.g., ~$x & 0xffffffff.
See /"Bit operators
support full native integer width".
- More builtins taint their results
-
As described in /"Improved security
features", there may be more sources of taint in a Perl program.
To avoid these new tainting behaviors, you can build Perl with the Configure option -Accflags=-DINCOMPLETE_TAINTS.
Beware that the ensuing perl binary may be insecure.
PERL_POLLUTE
-
Release 5.005 grandfathered old global symbol names by providing preprocessor macros
for extension source compatibility. As of release 5.6.0, these preprocessor definitions
are not available by default. You need to explicitly compile perl with -DPERL_POLLUTE
to get these definitions. For extensions still using the old symbols, this option can be
specified via MakeMaker:
perl Makefile.PL POLLUTE=1
|
|
PERL_IMPLICIT_CONTEXT
-
This new build option provides a set of macros for all API functions such that an
implicit interpreter/thread context argument is passed to every API function. As a result
of this, something like sv_setsv(foo,bar) amounts to a macro invocation that
actually translates to something like Perl_sv_setsv(my_perl,foo,bar). While
this is generally expected to not have any significant source compatibility issues, the
difference between a macro and a real function call will need to be considered.
This means that there is a source compatibility issue as a result of this if
your extensions attempt to use pointers to any of the Perl API functions.
Note that the above issue is not relevant to the default build of Perl, whose
interfaces continue to match those of prior versions (but subject to the other options
described here).
See perlguts/"The
Perl API" for detailed information on the ramifications of building Perl with
this option.
NOTE: PERL_IMPLICIT_CONTEXT is automatically enabled whenever Perl is built
with one of -Dusethreads, -Dusemultiplicity, or both. It is not
intended to be enabled by users at this time.
|
|
PERL_POLLUTE_MALLOC
-
Enabling Perl's malloc in release 5.005 and earlier caused the namespace of the
system's malloc family of functions to be usurped by the Perl versions, since by default
they used the same names. Besides causing problems on platforms that do not allow these
functions to be cleanly replaced, this also meant that the system versions could not be
called in programs that used Perl's malloc. Previous versions of Perl have allowed this
behaviour to be suppressed with the HIDEMYMALLOC and EMBEDMYMALLOC preprocessor
definitions.
As of release 5.6.0, Perl's malloc family of functions have default names distinct from
the system versions. You need to explicitly compile perl with -DPERL_POLLUTE_MALLOC
to get the older behaviour. HIDEMYMALLOC and EMBEDMYMALLOC have no effect, since the
behaviour they enabled is now the default.
Note that these functions do not constitute Perl's memory allocation API. See perlguts/"Memory
Allocation" for further information about that.
PATCHLEVEL is now PERL_VERSION
-
The cpp macros PERL_REVISION, PERL_VERSION, and PERL_SUBVERSION
are now available by default from perl.h, and reflect the base revision, patchlevel, and
subversion respectively. PERL_REVISION had no prior equivalent, while PERL_VERSION
and PERL_SUBVERSION were previously available as PATCHLEVEL and SUBVERSION.
The new names cause less pollution of the cpp namespace and reflect what the
numbers have come to stand for in common practice. For compatibility, the old names are
still supported when patchlevel.h is explicitly included (as required before), so
there is no source incompatibility from the change.
In general, the default build of this release is expected to be binary compatible for
extensions built with the 5.005 release or its maintenance versions. However, specific
platforms may have broken binary compatibility due to changes in the defaults used in hints
files. Therefore, please be sure to always check the platform-specific README files for any
notes to the contrary.
The usethreads or usemultiplicity builds are not binary compatible with the
corresponding builds in 5.005.
On platforms that require an explicit list of exports (AIX, OS/2 and Windows, among
others), purely internal symbols such as parser functions and the run time opcodes are not
exported by default. Perl 5.005 used to export all functions irrespective of whether they were
considered part of the public API or not.
For the full list of public API functions, see perlapi.
The subtests 19 and 20 of lib/thr5005.t test are known to fail due to fundamental problems
in the 5.005 threading implementation. These are not new failures--Perl 5.005_0x has the same
bugs, but didn't have these tests.
In earlier releases of Perl, EBCDIC environments like OS390 (also known as Open Edition MVS)
and VM-ESA were supported. Due to changes required by the UTF-8 (Unicode) support, the EBCDIC
platforms are not supported in Perl 5.6.0.
The lib/io_multihomed test may hang in HP-UX if Perl has been configured to be 64-bit.
Because other 64-bit platforms do not hang in this test, HP-UX is suspect. All other tests
pass in 64-bit HP-UX. The test attempts to create and connect to "multihomed"
sockets (sockets which have multiple IP addresses).
In NEXTSTEP 3.3p2 the implementation of the strftime(3) in the operating system libraries
is buggy: the %j format numbers the days of a month starting from zero, which, while being
logical to programmers, will cause the subtests 19 to 27 of the lib/posix test may fail.
If compiled with gcc 2.95 the lib/sdbm test will fail (dump core). The cure is to use the
vendor cc, it comes with the operating system and produces good code.
In UNICOS/mk the following errors may appear during the Configure run:
Guessing which symbols your C compiler and preprocessor define...
CC-20 cc: ERROR File = try.c, Line = 3
...
bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
...
4 errors detected in the compilation of "try.c".
|
|
The culprit is the broken awk of UNICOS/mk. The effect is fortunately rather mild: Perl
itself is not adversely affected by the error, only the h2ph utility coming with Perl, and
that is rather rarely needed these days.
When the left argument to the arrow operator -> is an array, or the scalar
operator operating on an array, the result of the operation must be considered erroneous. For
example:
These expressions will get run-time errors in some future release of Perl.
As discussed above, many features are still experimental. Interfaces and implementation of
these features are subject to change, and in extreme cases, even subject to removal in some
future release of Perl. These features include the following:
- Threads
-
- Unicode
-
- 64-bit support
-
- Lvalue subroutines
-
- Weak references
-
- The pseudo-hash data type
-
- The Compiler suite
-
- Internal implementation of file
globbing
-
- The DB module
-
- The regular expression code
constructs:
(?{ code }) and (??{ code })
- Character
class syntax [: :] is reserved for future extensions
- (W) Within regular expression character classes ([]) the syntax beginning with
"[:" and ending with ":]" is reserved for future extensions. If you
need to represent those character sequences inside a regular expression character class,
just quote the square brackets with the backslash: "\[:" and ":\]".
- Ill-formed logical name
|%s| in prime_env_iter
- (W) A warning peculiar to VMS. A logical name was encountered when preparing to iterate
over %ENV which violates the syntactic rules governing logical names. Because it cannot be
translated normally, it is skipped, and will not appear in %ENV. This may be a benign
occurrence, as some software packages might directly modify logical name tables and
introduce nonstandard names, or it may indicate that a logical name table has been
corrupted.
- In string, @%s now must
be written as \@%s
-
The description of this error used to say:
(Someday it will simply assume that an unbackslashed @
interpolates an array.)
|
|
That day has come, and this fatal error has been removed. It has been replaced by a
non-fatal warning instead. See /Arrays now always
interpolate into double-quoted strings for details.
- Probable precedence problem on %s
-
(W) The compiler found a bareword where it expected a conditional, which often
indicates that an || or && was parsed as part of the last argument of the previous
construct, for example:
- regexp too big
- (F) The current implementation of regular expressions uses shorts as address offsets
within a string. Unfortunately this means that if the regular expression compiles to
longer than 32767, it'll blow up. Usually when you want a regular expression this big,
there is a better way to do it with multiple statements. See perlre.
- Use
of "$$<digit>" to mean "${$}<digit>" is deprecated
-
(D) Perl versions before 5.004 misinterpreted any type marker followed by "$"
and a digit. For example, "$$0" was incorrectly taken to mean "${$}0"
instead of "${$0}". This bug is (mostly) fixed in Perl 5.004.
However, the developers of Perl 5.004 could not fix this bug completely, because at
least two widely-used modules depend on the old meaning of "$$0" in a string. So
Perl 5.004 still interprets "$$<digit>" in the old (broken) way inside
strings; but it generates this message as a warning. And in Perl 5.005, this special
treatment will cease.
If you find what you think is a bug, you might check the articles recently posted to the
comp.lang.perl.misc newsgroup. There may also be information at http://www.perl.com/perl/ ,
the Perl Home Page.
If you believe you have an unreported bug, please run the perlbug program included
with your release. Be sure to trim your bug down to a tiny but sufficient test case. Your bug
report, along with the output of perl -V, will be sent off to perlbug@perl.org to
be analysed by the Perl porting team.
The Changes file for exhaustive details on what changed.
The INSTALL file for how to build Perl.
The README file for general stuff.
The Artistic and Copying files for copyright information.
Written by Gurusamy Sarathy <gsar@activestate.com>, with many contributions
from The Perl Porters.
Send omissions or corrections to <perlbug@perl.org>.
|
|