d_localtime_r_needs_tzset=''
localtime_r_proto=''
d_locconv=''
-d_lc_monetary_2008=''
d_lockf=''
d_longdbl=''
longdblsize=''
*) case "$lns:$issymlink" in
*"ln"*" -s:"*"test -"?)
echo "Creating the symbolic links..." >&4
+ echo "(First creating the subdirectories...)" >&4
cd ..
- awk -v src="$src" '{
- dir=$1;
- if (!sub(/\/[^\/]*$/, "", dir)) { dir = "." }
- mf[dir] = mf[dir]" "src"/"$1;
- } END {
- for (d in mf) {
- if (d != ".") { system("mkdir -p "d) }
- system("ln -sf "mf[d]" "d);
- }
- }' $src/MANIFEST
+ awk '{print $1}' $src/MANIFEST | grep / | sed 's:/[^/]*$::' | sort -u | while true; do
+ read directory
+ test -z "$directory" && break
+ mkdir -p $directory
+ done
# Sanity check 1.
if test ! -d t/base; then
echo "Failed to create the subdirectories. Aborting." >&4
exit 1
fi
+ echo "(Then creating the symlinks...)" >&4
+ awk '{print $1}' $src/MANIFEST | while true; do
+ read filename
+ test -z "$filename" && break
+ if test -f $filename; then
+ if $issymlink $filename; then
+ rm -f $filename
+ fi
+ fi
+ if test -f $filename; then
+ echo "$filename already exists, not symlinking."
+ else
+ ln -s $src/$filename $filename
+ fi
+ done
# Sanity check 2.
if test ! -f t/base/lex.t; then
echo "Failed to create the symlinks (t/base/lex.t missing). Aborting." >&4
exit 1
fi
- if test ! -f x2p/walk.c; then
- echo "Failed to create the symlinks (x2p/walk.c missing). Aborting." >&4
- exit 1
- fi
cd UU
;;
*) echo "(I cannot figure out how to do symbolic links, ignoring mksymlinks)." >&4
eval $checkccflag
;;
esac
- case "$gccversion" in
- 1*) ;;
- 2*) ;;
- ?*) echo " "
- echo "Checking if your compiler accepts -fno-delete-null-pointer-checks" 2>&1
- echo 'int main(void) { return 0; }' > gcctest.c
- if $cc -O2 -fno-delete-null-pointer-checks -o gcctest gcctest.c; then
- echo "Yes, it does." 2>&1
- case "$ccflags" in
- *delete-null-pointer-checks*)
- echo "Leaving current flags $ccflags alone." 2>&1
- ;;
- *) dflt="$dflt -fno-delete-null-pointer-checks" ;;
- esac
- else
- echo "Nope, it doesn't, but that's ok." 2>&1
- fi
- ;;
- esac
# For gcc, adding -pipe speeds up compilations for some, but apparently
# some assemblers can't read from stdin. (It also slows down compilations
# in other cases, but those are apparently rarer these days.) AD 5/2004.
freebsd|mirbsd|netbsd|openbsd|interix|dragonfly|bitrig)
xxx="-Wl,-R$shrpdir"
;;
- bsdos|linux|irix*|dec_osf|gnu*)
+ bsdos|linux|irix*|dec_osf|gnu*|haiku)
xxx="-Wl,-rpath,$shrpdir"
;;
next)
# next doesn't like the default...
;;
- haiku)
- # Haiku doesn't like the default, either.
- ;;
hpux*)
# hpux doesn't like the default, either.
tmp_shrpenv="env LDOPTS=\"+s +b${shrpdir}\""
set localeconv d_locconv
eval $inlibc
-: see if localtime_r calls tzset
-case "$d_locconv:$d_lc_monetary_2008" in
-define:)
- $cat >try.c <<EOCP
-#include <locale.h>
-int main() {
- struct lconv *lc = localeconv();
- char int_p_cs_precedes = lc->int_p_cs_precedes;
- return 0;
-}
-EOCP
- set try
- if eval $compile; then
- d_lc_monetary_2008="$define"
- else
- d_lc_monetary_2008="$undef"
- fi;
- $rm_try
- ;;
-esac
-
: see if lockf exists
set lockf d_lockf
eval $inlibc
;;
esac
-randfunc=drand48
-drand01="drand48()"
-seedfunc="srand48"
+randfunc=Perl_drand48
+drand01="Perl_drand48()"
+seedfunc="Perl_drand48_init"
randbits=48
randseedtype=U32
find_extensions='
for xxx in *; do
case "$xxx" in
- CVS) ;;
DynaLoader|dynaload) ;;
*)
this_ext=`echo $xxx | $sed -e s/-/\\\//g`;
nonxs_ext=''
for xxx in $nonxs_extensions ; do
case "$xxx" in
- CVS|RCS|SCCS|.svn)
- ;;
VMS*)
;;
*) nonxs_ext="$nonxs_ext $xxx"
d_localtime_r='$d_localtime_r'
d_localtime_r_needs_tzset='$d_localtime_r_needs_tzset'
d_locconv='$d_locconv'
-d_lc_monetary_2008='$d_lc_monetary_2008'
d_lockf='$d_lockf'
d_longdbl='$d_longdbl'
d_longlong='$d_longlong'
api_revision='5'
api_subversion='0'
api_version='20'
-api_versionstring='5.20.1'
+api_versionstring='5.20.2'
ar='ar'
-archlib='/usr/lib/perl5/5.20.1/armv4l-linux'
-archlibexp='/usr/lib/perl5/5.20.1/armv4l-linux'
+archlib='/usr/lib/perl5/5.20.2/armv4l-linux'
+archlibexp='/usr/lib/perl5/5.20.2/armv4l-linux'
archname64=''
archname='armv4l-linux'
archobjs=''
cat='cat'
cc='cc'
cccdlflags='-fpic'
-ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.20.1/armv4l-linux/CORE'
+ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.20.2/armv4l-linux/CORE'
ccflags='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
ccname='arm-linux-gcc'
d_isnan='define'
d_isnanl='define'
d_killpg='define'
-d_lc_monetary_2008='undef'
d_lchown='define'
d_ldbl_dig='define'
d_libm_lib_version='define'
inc_version_list_init='0'
incpath=''
inews=''
-installarchlib='./install_me_here/usr/lib/perl5/5.20.1/armv4l-linux'
+installarchlib='./install_me_here/usr/lib/perl5/5.20.2/armv4l-linux'
installbin='./install_me_here/usr/bin'
installhtml1dir=''
installhtml3dir=''
installman3dir='./install_me_here/usr/share/man/man3'
installprefix='./install_me_here/usr'
installprefixexp='./install_me_here/usr'
-installprivlib='./install_me_here/usr/lib/perl5/5.20.1'
+installprivlib='./install_me_here/usr/lib/perl5/5.20.2'
installscript='./install_me_here/usr/bin'
-installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.20.1/armv4l-linux'
+installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.20.2/armv4l-linux'
installsitebin='./install_me_here/usr/bin'
installsitehtml1dir=''
installsitehtml3dir=''
-installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.20.1'
+installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.20.2'
installsiteman1dir='./install_me_here/usr/share/man/man1'
installsiteman3dir='./install_me_here/usr/share/man/man3'
installsitescript='./install_me_here/usr/bin'
pr=''
prefix='/usr'
prefixexp='/usr'
-privlib='/usr/lib/perl5/5.20.1'
-privlibexp='/usr/lib/perl5/5.20.1'
+privlib='/usr/lib/perl5/5.20.2'
+privlibexp='/usr/lib/perl5/5.20.2'
procselfexe='"/proc/self/exe"'
prototype='define'
ptrsize='4'
sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0'
sig_size='68'
signal_t='void'
-sitearch='/usr/lib/perl5/site_perl/5.20.1/armv4l-linux'
-sitearchexp='/usr/lib/perl5/site_perl/5.20.1/armv4l-linux'
+sitearch='/usr/lib/perl5/site_perl/5.20.2/armv4l-linux'
+sitearchexp='/usr/lib/perl5/site_perl/5.20.2/armv4l-linux'
sitebin='/usr/bin'
sitebinexp='/usr/bin'
sitehtml1dir=''
sitehtml1direxp=''
sitehtml3dir=''
sitehtml3direxp=''
-sitelib='/usr/lib/perl5/site_perl/5.20.1'
+sitelib='/usr/lib/perl5/site_perl/5.20.2'
sitelib_stem='/usr/lib/perl5/site_perl'
-sitelibexp='/usr/lib/perl5/site_perl/5.20.1'
+sitelibexp='/usr/lib/perl5/site_perl/5.20.2'
siteman1dir='/usr/share/man/man1'
siteman1direxp='/usr/share/man/man1'
siteman3dir='/usr/share/man/man3'
strerror_r_proto='0'
strings='/usr/include/string.h'
submit=''
-subversion='1'
+subversion='2'
sysman='/usr/share/man/man1'
tail=''
tar=''
vendorprefixexp=''
vendorscript=''
vendorscriptexp=''
-version='5.20.1'
-version_patchlevel_string='version 20 subversion 1'
+version='5.20.2'
+version_patchlevel_string='version 20 subversion 2'
versiononly='undef'
vi=''
xlibpth='/usr/lib/386 /lib/386'
config_argc=0
PERL_REVISION=5
PERL_VERSION=20
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
PERL_API_REVISION=5
PERL_API_VERSION=20
PERL_API_SUBVERSION=0
the most important issues are listed below, but you should refer
to pod/perldelta.pod for more detailed information.
-B<WARNING:> This version is not binary compatible with prior releases of Perl.
+B<WARNING:> This version is not binary compatible with versions of Perl
+earlier than 5.20.0.
If you have built extensions (i.e. modules that include C code)
using an earlier version of Perl, you will need to rebuild and reinstall
those extensions.
=item Directories for the perl distribution
-By default, Configure will use the following directories for 5.20.1.
+By default, Configure will use the following directories for 5.20.2.
$version is the full perl version number, including subversion, e.g.
5.12.3, and $archname is a string like sun4-sunos,
determined by Configure. The full definitions of all Configure
=head1 Coexistence with earlier versions of perl 5
-Perl 5.20.1 is not binary compatible with earlier versions of Perl.
+Perl 5.20.2 is not binary compatible with versions of Perl earlier than 5.20.0.
In other words, you will have to recompile your XS modules.
In general, you can usually safely upgrade from one version of Perl (e.g.
libraries after 5.6.0, but not for executables. TODO?) One convenient
way to do this is by using a separate prefix for each version, such as
- sh Configure -Dprefix=/opt/perl5.20.1
+ sh Configure -Dprefix=/opt/perl5.20.2
-and adding /opt/perl5.20.1/bin to the shell PATH variable. Such users
+and adding /opt/perl5.20.2/bin to the shell PATH variable. Such users
may also wish to add a symbolic link /usr/local/bin/perl so that
scripts can still start with #!/usr/local/bin/perl.
subversions may not have all the compatibility wrinkles ironed out
yet.
-=head2 Upgrading from 5.19.0 or earlier
+=head2 Upgrading from 5.19.11 or earlier
-B<Perl 5.20.1 may not be binary compatible with Perl 5.19.11 or
+B<Perl 5.20.2 may not be binary compatible with Perl 5.19.11 or
earlier Perl releases.> Perl modules having binary parts
(meaning that a C compiler is used) will have to be recompiled to be
-used with 5.20.1. If you find you do need to rebuild an extension with
-5.20.1, you may safely do so without disturbing the older
+used with 5.20.2. If you find you do need to rebuild an extension with
+5.20.2, you may safely do so without disturbing the older
installations. (See L<"Coexistence with earlier versions of perl 5">
above.)
print("$f\n");
}
-in Linux with perl-5.20.1 is as follows (under $Config{prefix}):
+in Linux with perl-5.20.2 is as follows (under $Config{prefix}):
./bin/perl
- ./lib/perl5/5.20.1/strict.pm
- ./lib/perl5/5.20.1/warnings.pm
- ./lib/perl5/5.20.1/i686-linux/File/Glob.pm
- ./lib/perl5/5.20.1/feature.pm
- ./lib/perl5/5.20.1/XSLoader.pm
- ./lib/perl5/5.20.1/i686-linux/auto/File/Glob/Glob.so
+ ./lib/perl5/5.20.2/strict.pm
+ ./lib/perl5/5.20.2/warnings.pm
+ ./lib/perl5/5.20.2/i686-linux/File/Glob.pm
+ ./lib/perl5/5.20.2/feature.pm
+ ./lib/perl5/5.20.2/XSLoader.pm
+ ./lib/perl5/5.20.2/i686-linux/auto/File/Glob/Glob.so
Secondly, for perl-5.10.1, the Debian perl-base package contains 591 files,
(of which 510 are for lib/unicore) totaling about 3.5MB in its i386 version.
Changes Describe how to peruse changes between releases
charclass_invlists.h Compiled-in inversion lists
config_h.SH Produces config.h
-config.over Site-specific overrides for Configure defaults
configpm Produces lib/Config.pm
Configure Portability tool
configure.com Configure-equivalent for VMS
cpan/NEXT/t/next.t NEXT
cpan/NEXT/t/stringify.t NEXT
cpan/NEXT/t/unseen.t NEXT
-cpan/OpenBSD-MkTemp/lib/OpenBSD/MkTemp.pm OpenBSD::MkTemp
-cpan/OpenBSD-MkTemp/MkTemp.xs OpenBSD::MkTemp
-cpan/OpenBSD-MkTemp/README OpenBSD::MkTemp Readme
-cpan/OpenBSD-MkTemp/t/OpenBSD-MkTemp.t OpenBSD::MkTemp test file
cpan/Package-Constants/lib/Package/Constants.pm Package::Constants
cpan/Package-Constants/t/01_list.t Package::Constants tests
cpan/Params-Check/lib/Params/Check.pm Params::Check
dist/Module-CoreList/MANIFEST Module::CoreList
dist/Module-CoreList/README Module::CoreList
dist/Module-CoreList/t/corelist.t Module::CoreList tests
-dist/Module-CoreList/t/corevers.t Module::CoreList tests
dist/Module-CoreList/t/deprecated.t Module::CoreList tests
dist/Module-CoreList/t/find_modules.t Module::CoreList tests
dist/Module-CoreList/t/is_core.t Module::CoreList tests
ext/B/B/Xref.pm Compiler Xref backend
ext/B/B.xs Compiler backend external subroutines
ext/B/hints/darwin.pl Hints for named architecture
+ext/B/hints/openbsd.pl Hints for named architecture
ext/B/Makefile.PL Compiler backend makefile writer
ext/B/O.pm Compiler front-end module (-MO=...)
ext/B/t/b.t See if B works
feature.h Feature header
form.h Public declarations for formats
generate_uudmap.c Generate uudmap.h, the uuencode decoding map
-git_version.h Pre-generated git_version.h for OpenBSD
globals.c File to declare global symbols (for shared library)
globvar.sym Global variables that need hiding when embedded
gv.c Glob value code
lib/Class/Struct.t See if Class::Struct works
lib/Config/Extensions.pm Convenient hash lookup for built extensions
lib/Config/Extensions.t See if Config::Extensions works
-lib/Config_git.pl Pre-generated Config_git.pl for OpenBSD
lib/Config.t See if Config works
lib/CORE.pod document the CORE namespace
lib/DBM_Filter/compress.pm DBM Filter to compress keys/values
lib/Unicode/UCD.pm Unicode character database
lib/Unicode/UCD.t See if Unicode character database works
lib/unicore/ArabicShaping.txt Unicode character database
-lib/unicore/auxiliary/GCBTest.txt Unicode character database
-lib/unicore/auxiliary/GraphemeBreakProperty.txt Unicode character database
-lib/unicore/auxiliary/SentenceBreakProperty.txt Unicode character database
-lib/unicore/auxiliary/WordBreakProperty.txt Unicode character database
+lib/unicore/auxiliary/GCBTest.txt Unicode character database
+lib/unicore/auxiliary/GraphemeBreakProperty.txt Unicode character database
+lib/unicore/auxiliary/SentenceBreakProperty.txt Unicode character database
+lib/unicore/auxiliary/WordBreakProperty.txt Unicode character database
lib/unicore/BidiBrackets.txt Unicode character database
lib/unicore/BidiMirroring.txt Unicode character database
lib/unicore/Blocks.txt Unicode character database
lib/unicore/CaseFolding.txt Unicode character database
lib/unicore/CJKRadicals.txt Unicode character database
-lib/unicore/CombiningClass.pl Unicode character database
-lib/unicore/CompositionExclusions.txt Unicode character database
+lib/unicore/CompositionExclusions.txt Unicode character database
lib/unicore/DAge.txt Unicode character database
lib/unicore/DCoreProperties.txt Unicode character database
-lib/unicore/Decomposition.pl Unicode character database
-lib/unicore/DNormalizationProps.txt Unicode character database
+lib/unicore/DNormalizationProps.txt Unicode character database
lib/unicore/EastAsianWidth.txt Unicode character database
lib/unicore/EmojiSources.txt Unicode character database
-lib/unicore/extracted/DBidiClass.txt Unicode character database
-lib/unicore/extracted/DBinaryProperties.txt Unicode character database
-lib/unicore/extracted/DCombiningClass.txt Unicode character database
-lib/unicore/extracted/DDecompositionType.txt Unicode character database
-lib/unicore/extracted/DEastAsianWidth.txt Unicode character database
-lib/unicore/extracted/DGeneralCategory.txt Unicode character database
-lib/unicore/extracted/DJoinGroup.txt Unicode character database
-lib/unicore/extracted/DJoinType.txt Unicode character database
-lib/unicore/extracted/DLineBreak.txt Unicode character database
-lib/unicore/extracted/DNumType.txt Unicode character database
-lib/unicore/extracted/DNumValues.txt Unicode character database
-lib/unicore/HangulSyllableType.txt Unicode character database
-lib/unicore/Heavy.pl Unicode character database
+lib/unicore/extracted/DBidiClass.txt Unicode character database
+lib/unicore/extracted/DBinaryProperties.txt Unicode character database
+lib/unicore/extracted/DCombiningClass.txt Unicode character database
+lib/unicore/extracted/DDecompositionType.txt Unicode character database
+lib/unicore/extracted/DEastAsianWidth.txt Unicode character database
+lib/unicore/extracted/DGeneralCategory.txt Unicode character database
+lib/unicore/extracted/DJoinGroup.txt Unicode character database
+lib/unicore/extracted/DJoinType.txt Unicode character database
+lib/unicore/extracted/DLineBreak.txt Unicode character database
+lib/unicore/extracted/DNumType.txt Unicode character database
+lib/unicore/extracted/DNumValues.txt Unicode character database
+lib/unicore/HangulSyllableType.txt Unicode character database
lib/unicore/Index.txt Unicode character database
-lib/unicore/IndicMatraCategory.txt Unicode character database
-lib/unicore/IndicSyllabicCategory.txt Unicode character database
+lib/unicore/IndicMatraCategory.txt Unicode character database
+lib/unicore/IndicSyllabicCategory.txt Unicode character database
lib/unicore/Jamo.txt Unicode character database
-lib/unicore/lib/Age/NA.pl Unicode character database
-lib/unicore/lib/Age/V11.pl Unicode character database
-lib/unicore/lib/Age/V20.pl Unicode character database
-lib/unicore/lib/Age/V30.pl Unicode character database
-lib/unicore/lib/Age/V31.pl Unicode character database
-lib/unicore/lib/Age/V32.pl Unicode character database
-lib/unicore/lib/Age/V40.pl Unicode character database
-lib/unicore/lib/Age/V41.pl Unicode character database
-lib/unicore/lib/Age/V50.pl Unicode character database
-lib/unicore/lib/Age/V51.pl Unicode character database
-lib/unicore/lib/Age/V52.pl Unicode character database
-lib/unicore/lib/Age/V60.pl Unicode character database
-lib/unicore/lib/Age/V61.pl Unicode character database
-lib/unicore/lib/Alpha/Y.pl Unicode character database
-lib/unicore/lib/Bc/AL.pl Unicode character database
-lib/unicore/lib/Bc/AN.pl Unicode character database
-lib/unicore/lib/Bc/BN.pl Unicode character database
-lib/unicore/lib/Bc/B.pl Unicode character database
-lib/unicore/lib/Bc/CS.pl Unicode character database
-lib/unicore/lib/Bc/EN.pl Unicode character database
-lib/unicore/lib/Bc/ES.pl Unicode character database
-lib/unicore/lib/Bc/ET.pl Unicode character database
-lib/unicore/lib/Bc/L.pl Unicode character database
-lib/unicore/lib/Bc/NSM.pl Unicode character database
-lib/unicore/lib/Bc/ON.pl Unicode character database
-lib/unicore/lib/Bc/R.pl Unicode character database
-lib/unicore/lib/Bc/WS.pl Unicode character database
-lib/unicore/lib/BidiC/Y.pl Unicode character database
-lib/unicore/lib/BidiM/Y.pl Unicode character database
-lib/unicore/lib/Blk/NB.pl Unicode character database
-lib/unicore/lib/Bpt/C.pl Unicode character database
-lib/unicore/lib/Bpt/N.pl Unicode character database
-lib/unicore/lib/Bpt/O.pl Unicode character database
-lib/unicore/lib/Cased/Y.pl Unicode character database
-lib/unicore/lib/Ccc/A.pl Unicode character database
-lib/unicore/lib/Ccc/AR.pl Unicode character database
-lib/unicore/lib/Ccc/ATAR.pl Unicode character database
-lib/unicore/lib/Ccc/B.pl Unicode character database
-lib/unicore/lib/Ccc/BR.pl Unicode character database
-lib/unicore/lib/Ccc/DB.pl Unicode character database
-lib/unicore/lib/Ccc/NK.pl Unicode character database
-lib/unicore/lib/Ccc/NR.pl Unicode character database
-lib/unicore/lib/Ccc/OV.pl Unicode character database
-lib/unicore/lib/Ccc/VR.pl Unicode character database
-lib/unicore/lib/CE/Y.pl Unicode character database
-lib/unicore/lib/CI/Y.pl Unicode character database
-lib/unicore/lib/CompEx/Y.pl Unicode character database
-lib/unicore/lib/CWCF/Y.pl Unicode character database
-lib/unicore/lib/CWCM/Y.pl Unicode character database
-lib/unicore/lib/CWKCF/Y.pl Unicode character database
-lib/unicore/lib/CWL/Y.pl Unicode character database
-lib/unicore/lib/CWT/Y.pl Unicode character database
-lib/unicore/lib/CWU/Y.pl Unicode character database
-lib/unicore/lib/Dash/Y.pl Unicode character database
-lib/unicore/lib/Dep/Y.pl Unicode character database
-lib/unicore/lib/Dia/Y.pl Unicode character database
-lib/unicore/lib/DI/Y.pl Unicode character database
-lib/unicore/lib/Dt/Com.pl Unicode character database
-lib/unicore/lib/Dt/Enc.pl Unicode character database
-lib/unicore/lib/Dt/Fin.pl Unicode character database
-lib/unicore/lib/Dt/Font.pl Unicode character database
-lib/unicore/lib/Dt/Init.pl Unicode character database
-lib/unicore/lib/Dt/Iso.pl Unicode character database
-lib/unicore/lib/Dt/Med.pl Unicode character database
-lib/unicore/lib/Dt/Nar.pl Unicode character database
-lib/unicore/lib/Dt/Nb.pl Unicode character database
-lib/unicore/lib/Dt/NonCanon.pl Unicode character database
-lib/unicore/lib/Dt/Sqr.pl Unicode character database
-lib/unicore/lib/Dt/Sub.pl Unicode character database
-lib/unicore/lib/Dt/Sup.pl Unicode character database
-lib/unicore/lib/Dt/Vert.pl Unicode character database
-lib/unicore/lib/Ea/A.pl Unicode character database
-lib/unicore/lib/Ea/H.pl Unicode character database
-lib/unicore/lib/Ea/Na.pl Unicode character database
-lib/unicore/lib/Ea/N.pl Unicode character database
-lib/unicore/lib/Ea/W.pl Unicode character database
-lib/unicore/lib/Ext/Y.pl Unicode character database
-lib/unicore/lib/GCB/CN.pl Unicode character database
-lib/unicore/lib/GCB/EX.pl Unicode character database
-lib/unicore/lib/GCB/LV.pl Unicode character database
-lib/unicore/lib/GCB/LVT.pl Unicode character database
-lib/unicore/lib/GCB/SM.pl Unicode character database
-lib/unicore/lib/GCB/XX.pl Unicode character database
-lib/unicore/lib/Gc/Cf.pl Unicode character database
-lib/unicore/lib/Gc/Cn.pl Unicode character database
-lib/unicore/lib/Gc/C.pl Unicode character database
-lib/unicore/lib/Gc/LC.pl Unicode character database
-lib/unicore/lib/Gc/Ll.pl Unicode character database
-lib/unicore/lib/Gc/Lm.pl Unicode character database
-lib/unicore/lib/Gc/Lo.pl Unicode character database
-lib/unicore/lib/Gc/L.pl Unicode character database
-lib/unicore/lib/Gc/Lt.pl Unicode character database
-lib/unicore/lib/Gc/Lu.pl Unicode character database
-lib/unicore/lib/Gc/Mc.pl Unicode character database
-lib/unicore/lib/Gc/Me.pl Unicode character database
-lib/unicore/lib/Gc/Mn.pl Unicode character database
-lib/unicore/lib/Gc/M.pl Unicode character database
-lib/unicore/lib/Gc/Nd.pl Unicode character database
-lib/unicore/lib/Gc/Nl.pl Unicode character database
-lib/unicore/lib/Gc/No.pl Unicode character database
-lib/unicore/lib/Gc/N.pl Unicode character database
-lib/unicore/lib/Gc/Pd.pl Unicode character database
-lib/unicore/lib/Gc/Pe.pl Unicode character database
-lib/unicore/lib/Gc/Pf.pl Unicode character database
-lib/unicore/lib/Gc/Pi.pl Unicode character database
-lib/unicore/lib/Gc/Po.pl Unicode character database
-lib/unicore/lib/Gc/P.pl Unicode character database
-lib/unicore/lib/Gc/Ps.pl Unicode character database
-lib/unicore/lib/Gc/Sc.pl Unicode character database
-lib/unicore/lib/Gc/Sk.pl Unicode character database
-lib/unicore/lib/Gc/Sm.pl Unicode character database
-lib/unicore/lib/Gc/So.pl Unicode character database
-lib/unicore/lib/Gc/S.pl Unicode character database
-lib/unicore/lib/Gc/Z.pl Unicode character database
-lib/unicore/lib/Gc/Zs.pl Unicode character database
-lib/unicore/lib/GrBase/Y.pl Unicode character database
-lib/unicore/lib/Hex/Y.pl Unicode character database
-lib/unicore/lib/Hst/NA.pl Unicode character database
-lib/unicore/lib/Hyphen/Y.pl Unicode character database
-lib/unicore/lib/IDC/Y.pl Unicode character database
-lib/unicore/lib/Ideo/Y.pl Unicode character database
-lib/unicore/lib/IDS/Y.pl Unicode character database
-lib/unicore/lib/In/2_0.pl Unicode character database
-lib/unicore/lib/In/2_1.pl Unicode character database
-lib/unicore/lib/In/3_0.pl Unicode character database
-lib/unicore/lib/In/3_1.pl Unicode character database
-lib/unicore/lib/In/3_2.pl Unicode character database
-lib/unicore/lib/In/4_0.pl Unicode character database
-lib/unicore/lib/In/4_1.pl Unicode character database
-lib/unicore/lib/In/5_0.pl Unicode character database
-lib/unicore/lib/In/5_1.pl Unicode character database
-lib/unicore/lib/In/5_2.pl Unicode character database
-lib/unicore/lib/In/6_0.pl Unicode character database
-lib/unicore/lib/In/6_1.pl Unicode character database
-lib/unicore/lib/In/6_2.pl Unicode character database
-lib/unicore/lib/In/6_3.pl Unicode character database
-lib/unicore/lib/Jg/Ain.pl Unicode character database
-lib/unicore/lib/Jg/Alef.pl Unicode character database
-lib/unicore/lib/Jg/Beh.pl Unicode character database
-lib/unicore/lib/Jg/Dal.pl Unicode character database
-lib/unicore/lib/Jg/FarsiYeh.pl Unicode character database
-lib/unicore/lib/Jg/Feh.pl Unicode character database
-lib/unicore/lib/Jg/Gaf.pl Unicode character database
-lib/unicore/lib/Jg/Hah.pl Unicode character database
-lib/unicore/lib/Jg/Lam.pl Unicode character database
-lib/unicore/lib/Jg/NoJoinin.pl Unicode character database
-lib/unicore/lib/Jg/Qaf.pl Unicode character database
-lib/unicore/lib/Jg/Reh.pl Unicode character database
-lib/unicore/lib/Jg/Seen.pl Unicode character database
-lib/unicore/lib/Jg/Waw.pl Unicode character database
-lib/unicore/lib/Jg/Yeh.pl Unicode character database
-lib/unicore/lib/Jt/C.pl Unicode character database
-lib/unicore/lib/Jt/D.pl Unicode character database
-lib/unicore/lib/Jt/R.pl Unicode character database
-lib/unicore/lib/Jt/T.pl Unicode character database
-lib/unicore/lib/Jt/U.pl Unicode character database
-lib/unicore/lib/Lb/AI.pl Unicode character database
-lib/unicore/lib/Lb/AL.pl Unicode character database
-lib/unicore/lib/Lb/BA.pl Unicode character database
-lib/unicore/lib/Lb/BB.pl Unicode character database
-lib/unicore/lib/Lb/CJ.pl Unicode character database
-lib/unicore/lib/Lb/CL.pl Unicode character database
-lib/unicore/lib/Lb/CM.pl Unicode character database
-lib/unicore/lib/Lb/EX.pl Unicode character database
-lib/unicore/lib/Lb/GL.pl Unicode character database
-lib/unicore/lib/Lb/ID.pl Unicode character database
-lib/unicore/lib/Lb/IS.pl Unicode character database
-lib/unicore/lib/Lb/NS.pl Unicode character database
-lib/unicore/lib/Lb/OP.pl Unicode character database
-lib/unicore/lib/Lb/PO.pl Unicode character database
-lib/unicore/lib/Lb/PR.pl Unicode character database
-lib/unicore/lib/Lb/QU.pl Unicode character database
-lib/unicore/lib/Lb/SA.pl Unicode character database
-lib/unicore/lib/Lb/XX.pl Unicode character database
-lib/unicore/lib/LOE/Y.pl Unicode character database
-lib/unicore/lib/Lower/Y.pl Unicode character database
-lib/unicore/lib/Math/Y.pl Unicode character database
-lib/unicore/lib/NChar/Y.pl Unicode character database
-lib/unicore/lib/NFCQC/M.pl Unicode character database
-lib/unicore/lib/NFCQC/Y.pl Unicode character database
-lib/unicore/lib/NFDQC/N.pl Unicode character database
-lib/unicore/lib/NFDQC/Y.pl Unicode character database
-lib/unicore/lib/NFKCQC/N.pl Unicode character database
-lib/unicore/lib/NFKCQC/Y.pl Unicode character database
-lib/unicore/lib/NFKDQC/N.pl Unicode character database
-lib/unicore/lib/NFKDQC/Y.pl Unicode character database
-lib/unicore/lib/Nt/Di.pl Unicode character database
-lib/unicore/lib/Nt/None.pl Unicode character database
-lib/unicore/lib/Nt/Nu.pl Unicode character database
-lib/unicore/lib/Nv/0.pl Unicode character database
-lib/unicore/lib/Nv/10000.pl Unicode character database
-lib/unicore/lib/Nv/1000.pl Unicode character database
-lib/unicore/lib/Nv/100.pl Unicode character database
-lib/unicore/lib/Nv/10.pl Unicode character database
-lib/unicore/lib/Nv/11.pl Unicode character database
-lib/unicore/lib/Nv/12.pl Unicode character database
-lib/unicore/lib/Nv/1_2.pl Unicode character database
-lib/unicore/lib/Nv/13.pl Unicode character database
-lib/unicore/lib/Nv/1_3.pl Unicode character database
-lib/unicore/lib/Nv/14.pl Unicode character database
-lib/unicore/lib/Nv/1_4.pl Unicode character database
-lib/unicore/lib/Nv/15.pl Unicode character database
-lib/unicore/lib/Nv/16.pl Unicode character database
-lib/unicore/lib/Nv/17.pl Unicode character database
-lib/unicore/lib/Nv/18.pl Unicode character database
-lib/unicore/lib/Nv/1_8.pl Unicode character database
-lib/unicore/lib/Nv/19.pl Unicode character database
-lib/unicore/lib/Nv/1.pl Unicode character database
-lib/unicore/lib/Nv/20.pl Unicode character database
-lib/unicore/lib/Nv/2_3.pl Unicode character database
-lib/unicore/lib/Nv/2.pl Unicode character database
-lib/unicore/lib/Nv/30.pl Unicode character database
-lib/unicore/lib/Nv/3_4.pl Unicode character database
-lib/unicore/lib/Nv/3.pl Unicode character database
-lib/unicore/lib/Nv/40.pl Unicode character database
-lib/unicore/lib/Nv/4.pl Unicode character database
-lib/unicore/lib/Nv/50000.pl Unicode character database
-lib/unicore/lib/Nv/5000.pl Unicode character database
-lib/unicore/lib/Nv/500.pl Unicode character database
-lib/unicore/lib/Nv/50.pl Unicode character database
-lib/unicore/lib/Nv/5.pl Unicode character database
-lib/unicore/lib/Nv/60.pl Unicode character database
-lib/unicore/lib/Nv/6.pl Unicode character database
-lib/unicore/lib/Nv/70.pl Unicode character database
-lib/unicore/lib/Nv/7.pl Unicode character database
-lib/unicore/lib/Nv/80.pl Unicode character database
-lib/unicore/lib/Nv/8.pl Unicode character database
-lib/unicore/lib/Nv/90.pl Unicode character database
-lib/unicore/lib/Nv/9.pl Unicode character database
-lib/unicore/lib/PatSyn/Y.pl Unicode character database
-lib/unicore/lib/PatWS/Y.pl Unicode character database
-lib/unicore/lib/Perl/Alnum.pl Unicode character database
-lib/unicore/lib/Perl/Assigned.pl Unicode character database
-lib/unicore/lib/Perl/Blank.pl Unicode character database
-lib/unicore/lib/Perl/Graph.pl Unicode character database
-lib/unicore/lib/Perl/_PerlAny.pl Unicode character database
-lib/unicore/lib/Perl/_PerlCh2.pl Unicode character database
-lib/unicore/lib/Perl/_PerlCha.pl Unicode character database
-lib/unicore/lib/Perl/_PerlFol.pl Unicode character database
-lib/unicore/lib/Perl/_PerlIDC.pl Unicode character database
-lib/unicore/lib/Perl/_PerlIDS.pl Unicode character database
-lib/unicore/lib/Perl/_PerlPr2.pl Unicode character database
-lib/unicore/lib/Perl/_PerlPro.pl Unicode character database
-lib/unicore/lib/Perl/_PerlQuo.pl Unicode character database
-lib/unicore/lib/Perl/PerlWord.pl Unicode character database
-lib/unicore/lib/Perl/PosixPun.pl Unicode character database
-lib/unicore/lib/Perl/Print.pl Unicode character database
-lib/unicore/lib/Perl/Word.pl Unicode character database
-lib/unicore/lib/Perl/_XExtend.pl Unicode character database
-lib/unicore/lib/Perl/XPosixPu.pl Unicode character database
-lib/unicore/lib/Perl/_XRegula.pl Unicode character database
-lib/unicore/lib/Perl/_XSpecia.pl Unicode character database
-lib/unicore/lib/QMark/Y.pl Unicode character database
-lib/unicore/lib/SB/AT.pl Unicode character database
-lib/unicore/lib/SB/CL.pl Unicode character database
-lib/unicore/lib/SB/EX.pl Unicode character database
-lib/unicore/lib/SB/FO.pl Unicode character database
-lib/unicore/lib/SB/LE.pl Unicode character database
-lib/unicore/lib/SB/LO.pl Unicode character database
-lib/unicore/lib/SB/NU.pl Unicode character database
-lib/unicore/lib/SB/SC.pl Unicode character database
-lib/unicore/lib/SB/Sp.pl Unicode character database
-lib/unicore/lib/SB/ST.pl Unicode character database
-lib/unicore/lib/SB/UP.pl Unicode character database
-lib/unicore/lib/SB/XX.pl Unicode character database
-lib/unicore/lib/Sc/Arab.pl Unicode character database
-lib/unicore/lib/Sc/Armn.pl Unicode character database
-lib/unicore/lib/Sc/Beng.pl Unicode character database
-lib/unicore/lib/Sc/Cham.pl Unicode character database
-lib/unicore/lib/Sc/Cprt.pl Unicode character database
-lib/unicore/lib/Sc/Cyrl.pl Unicode character database
-lib/unicore/lib/Sc/Deva.pl Unicode character database
-lib/unicore/lib/Sc/Ethi.pl Unicode character database
-lib/unicore/lib/Sc/Geor.pl Unicode character database
-lib/unicore/lib/Sc/Grek.pl Unicode character database
-lib/unicore/lib/Sc/Gujr.pl Unicode character database
-lib/unicore/lib/Sc/Guru.pl Unicode character database
-lib/unicore/lib/Sc/Hang.pl Unicode character database
-lib/unicore/lib/Sc/Han.pl Unicode character database
-lib/unicore/lib/Sc/Hebr.pl Unicode character database
-lib/unicore/lib/Sc/Hira.pl Unicode character database
-lib/unicore/lib/Sc/Kana.pl Unicode character database
-lib/unicore/lib/Sc/Khar.pl Unicode character database
-lib/unicore/lib/Sc/Khmr.pl Unicode character database
-lib/unicore/lib/Sc/Knda.pl Unicode character database
-lib/unicore/lib/Sc/Lana.pl Unicode character database
-lib/unicore/lib/Sc/Lao.pl Unicode character database
-lib/unicore/lib/Sc/Latn.pl Unicode character database
-lib/unicore/lib/Sc/Limb.pl Unicode character database
-lib/unicore/lib/Sc/Linb.pl Unicode character database
-lib/unicore/lib/Sc/Mlym.pl Unicode character database
-lib/unicore/lib/Sc/Mong.pl Unicode character database
-lib/unicore/lib/Sc/Orya.pl Unicode character database
-lib/unicore/lib/Sc/Sinh.pl Unicode character database
-lib/unicore/lib/Sc/Talu.pl Unicode character database
-lib/unicore/lib/Sc/Taml.pl Unicode character database
-lib/unicore/lib/Sc/Telu.pl Unicode character database
-lib/unicore/lib/Sc/Tibt.pl Unicode character database
-lib/unicore/lib/Scx/Arab.pl Unicode character database
-lib/unicore/lib/Scx/Armn.pl Unicode character database
-lib/unicore/lib/Scx/Beng.pl Unicode character database
-lib/unicore/lib/Scx/Bopo.pl Unicode character database
-lib/unicore/lib/Scx/Cakm.pl Unicode character database
-lib/unicore/lib/Scx/Cprt.pl Unicode character database
-lib/unicore/lib/Scx/Cyrl.pl Unicode character database
-lib/unicore/lib/Scx/Deva.pl Unicode character database
-lib/unicore/lib/Scx/Geor.pl Unicode character database
-lib/unicore/lib/Scx/Grek.pl Unicode character database
-lib/unicore/lib/Scx/Gujr.pl Unicode character database
-lib/unicore/lib/Scx/Guru.pl Unicode character database
-lib/unicore/lib/Scx/Hang.pl Unicode character database
-lib/unicore/lib/Scx/Han.pl Unicode character database
-lib/unicore/lib/Scx/Hira.pl Unicode character database
-lib/unicore/lib/Scx/Kana.pl Unicode character database
-lib/unicore/lib/Scx/Latn.pl Unicode character database
-lib/unicore/lib/Scx/Linb.pl Unicode character database
-lib/unicore/lib/Scx/Mong.pl Unicode character database
-lib/unicore/lib/Scx/Orya.pl Unicode character database
-lib/unicore/lib/Scx/Syrc.pl Unicode character database
-lib/unicore/lib/Scx/Tagb.pl Unicode character database
-lib/unicore/lib/Scx/Takr.pl Unicode character database
-lib/unicore/lib/Scx/Thaa.pl Unicode character database
-lib/unicore/lib/Scx/Yi.pl Unicode character database
-lib/unicore/lib/Scx/Zinh.pl Unicode character database
-lib/unicore/lib/Scx/Zyyy.pl Unicode character database
-lib/unicore/lib/Sc/Zinh.pl Unicode character database
-lib/unicore/lib/Sc/Zyyy.pl Unicode character database
-lib/unicore/lib/Sc/Zzzz.pl Unicode character database
-lib/unicore/lib/SD/Y.pl Unicode character database
-lib/unicore/lib/Space/Y.pl Unicode character database
-lib/unicore/lib/STerm/Y.pl Unicode character database
-lib/unicore/lib/Term/Y.pl Unicode character database
-lib/unicore/lib/UIdeo/Y.pl Unicode character database
-lib/unicore/lib/Upper/Y.pl Unicode character database
-lib/unicore/lib/WB/EX.pl Unicode character database
-lib/unicore/lib/WB/FO.pl Unicode character database
-lib/unicore/lib/WB/HL.pl Unicode character database
-lib/unicore/lib/WB/KA.pl Unicode character database
-lib/unicore/lib/WB/LE.pl Unicode character database
-lib/unicore/lib/WB/MB.pl Unicode character database
-lib/unicore/lib/WB/ML.pl Unicode character database
-lib/unicore/lib/WB/MN.pl Unicode character database
-lib/unicore/lib/WB/NU.pl Unicode character database
-lib/unicore/lib/WB/XX.pl Unicode character database
-lib/unicore/lib/XIDC/Y.pl Unicode character database
-lib/unicore/lib/XIDS/Y.pl Unicode character database
lib/unicore/LineBreak.txt Unicode character database
lib/unicore/Makefile Unicode character database
lib/unicore/mktables Unicode character database generator
-lib/unicore/mktables.lst Unicode character database
lib/unicore/NameAliases.txt Unicode character database
lib/unicore/NamedSequences.txt Unicode character database
lib/unicore/NamedSqProv.txt Unicode character database
-lib/unicore/Name.pl Unicode character database
-lib/unicore/Name.pm Unicode character database
lib/unicore/NamesList.txt Unicode character database
-lib/unicore/NormalizationCorrections.txt Unicode character database
+lib/unicore/NormalizationCorrections.txt Unicode character database
lib/unicore/PropertyAliases.txt Unicode character database
lib/unicore/PropList.txt Unicode character database
-lib/unicore/PropValueAliases.txt Unicode character database
+lib/unicore/PropValueAliases.txt Unicode character database
lib/unicore/README.perl Unicode character database
lib/unicore/ReadMe.txt Unicode character database info
-lib/unicore/ScriptExtensions.txt Unicode character database
+lib/unicore/ScriptExtensions.txt Unicode character database
lib/unicore/Scripts.txt Unicode character database
lib/unicore/SpecialCasing.txt Unicode character database
-lib/unicore/StandardizedVariants.txt Unicode character database
-lib/unicore/TestProp.pl Unicode character database
-lib/unicore/To/Age.pl Unicode character database
-lib/unicore/To/Bc.pl Unicode character database
-lib/unicore/To/Bmg.pl Unicode character database
-lib/unicore/To/Bpb.pl Unicode character database
-lib/unicore/To/Bpt.pl Unicode character database
-lib/unicore/To/Cf.pl Unicode character database
-lib/unicore/To/Digit.pl Unicode character database
-lib/unicore/To/Ea.pl Unicode character database
-lib/unicore/To/Fold.pl Unicode character database
-lib/unicore/To/GCB.pl Unicode character database
-lib/unicore/To/Gc.pl Unicode character database
-lib/unicore/To/Hst.pl Unicode character database
-lib/unicore/To/Isc.pl Unicode character database
-lib/unicore/To/Jg.pl Unicode character database
-lib/unicore/To/Jt.pl Unicode character database
-lib/unicore/To/Lb.pl Unicode character database
-lib/unicore/To/Lc.pl Unicode character database
-lib/unicore/To/Lower.pl Unicode character database
-lib/unicore/To/Na1.pl Unicode character database
-lib/unicore/To/NameAlia.pl Unicode character database
-lib/unicore/To/NFCQC.pl Unicode character database
-lib/unicore/To/NFDQC.pl Unicode character database
-lib/unicore/To/NFKCCF.pl Unicode character database
-lib/unicore/To/NFKCQC.pl Unicode character database
-lib/unicore/To/NFKDQC.pl Unicode character database
-lib/unicore/To/Nt.pl Unicode character database
-lib/unicore/To/Nv.pl Unicode character database
-lib/unicore/To/PerlDeci.pl Unicode character database
-lib/unicore/To/SB.pl Unicode character database
-lib/unicore/To/Sc.pl Unicode character database
-lib/unicore/To/Scx.pl Unicode character database
-lib/unicore/To/Tc.pl Unicode character database
-lib/unicore/To/Title.pl Unicode character database
-lib/unicore/To/Uc.pl Unicode character database
-lib/unicore/To/Upper.pl Unicode character database
-lib/unicore/To/WB.pl Unicode character database
-lib/unicore/UCD.pl Unicode character database
+lib/unicore/StandardizedVariants.txt Unicode character database
lib/unicore/UnicodeData.txt Unicode character database
lib/unicore/version The version of the Unicode
lib/UNIVERSAL.pm Base class for ALL classes
pod/perl5180delta.pod Perl changes in version 5.18.0
pod/perl5181delta.pod Perl changes in version 5.18.1
pod/perl5182delta.pod Perl changes in version 5.18.2
+pod/perl5184delta.pod Perl changes in version 5.18.4
pod/perl5200delta.pod Perl changes in version 5.20.0
+pod/perl5201delta.pod Perl changes in version 5.20.1
pod/perl561delta.pod Perl changes in version 5.6.1
pod/perl56delta.pod Perl changes in version 5.6
pod/perl581delta.pod Perl changes in version 5.8.1
pod/perltoot.pod
pod/perltrap.pod Perl traps for the unwary
pod/perlunicode.pod Perl Unicode support
+pod/perlunicook.pod Perl Unicode cookbook
pod/perlunifaq.pod Perl Unicode FAQ
pod/perluniintro.pod Perl Unicode introduction
-pod/perluniprops.pod Index of Unicode properties in Perl
pod/perlunitut.pod Perl Unicode tutorial
pod/perlutil.pod utilities packaged with the Perl distribution
pod/perlvar.pod Perl predefined variables
t/re/reg_pmod.t See if regexp /p modifier works as expected
t/re/reg_posixcc.t See if posix character classes behave consistently
t/re/re_tests Regular expressions for regexp.t
+t/re/rt122747.t Test rt122747 assert faile (requires DEBUGGING)
t/re/rxcode.t See if /(?{ code })/ works
t/re/subst_amp.t See if $&-related substitution works
t/re/subst.t See if substitution works
ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
obj = $(ndt_obj) $(DTRACE_O)
-perltoc_pod_prereqs = extra.pods pod/perl5201delta.pod pod/perlapi.pod pod/perlintern.pod pod/perlmodlib.pod
+perltoc_pod_prereqs = extra.pods pod/perl5202delta.pod pod/perlapi.pod pod/perlintern.pod pod/perlmodlib.pod pod/perluniprops.pod
generated_pods = pod/perltoc.pod $(perltoc_pod_prereqs)
generated_headers = uudmap.h bitcount.h mg_data.h
.PHONY: all translators utilities
-# OpenBSD uses pre-generated lib/Config_git.pl and git_version.h files
# Both git_version.h and lib/Config_git.pl are built
# by make_patchnum.pl.
-#git_version.h: lib/Config_git.pl
-#
-#lib/Config_git.pl: $(MINIPERL_EXE) make_patchnum.pl
-# $(MINIPERL) make_patchnum.pl
+git_version.h: lib/Config_git.pl
+
+lib/Config_git.pl: $(MINIPERL_EXE) make_patchnum.pl
+ $(MINIPERL) make_patchnum.pl
# make sure that we recompile perl.c if the git version changes
perl$(OBJ_EXT): git_version.h
esac
case "$osname" in
-openbsd)
- $spitshell >>$Makefile <<!GROK!THIS!
-# When building Perl itself, link with the thread library,
-# so that extensions can use thread functions even though Perl
-# is not threaded
-CCDLFLAGS = $ccdlflags -lpthread
-!GROK!THIS!
- ;;
aix)
$spitshell >>$Makefile <<!GROK!THIS!
LIBS = $perllibs
LIBPERL_NONSHR = libperl_nonshr$(LIB_EXT)
MINIPERL_NONSHR = miniperl_nonshr$(EXE_EXT)
-#$(LIBPERL_NONSHR): $(obj)
-# $(RMS) $(LIBPERL_NONSHR)
-# $(AR) rcu $(LIBPERL_NONSHR) $(obj)
+$(LIBPERL_NONSHR): $(obj)
+ $(RMS) $(LIBPERL_NONSHR)
+ $(AR) rcu $(LIBPERL_NONSHR) $(obj)
-$(MINIPERL_NONSHR): miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) perlmini$(OBJ_EXT)
+$(MINIPERL_NONSHR): $(LIBPERL_NONSHR) miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) perlmini$(OBJ_EXT)
$(CC) $(LDFLAGS) -o $(MINIPERL_NONSHR) miniperlmain$(OBJ_EXT) \
opmini$(OBJ_EXT) perlmini$(OBJ_EXT) $(LIBPERL_NONSHR) $(LIBS)
;;
esac
$spitshell >>$Makefile <<'!NO!SUBS!'
-#$(LIBPERL): $& $(obj) $(DYNALOADER) $(LIBPERLEXPORT)
-#!NO!SUBS!
-# case "$useshrplib" in
-# true)
-# $spitshell >>$Makefile <<'!NO!SUBS!'
-# rm -f $@
-# $(LD) -o $@ $(SHRPLDFLAGS) $(obj) $(DYNALOADER) $(libs)
-#!NO!SUBS!
-# case "$osname" in
-# aix)
-# $spitshell >>$Makefile <<'!NO!SUBS!'
-# rm -f libperl$(OBJ_EXT)
-# mv $@ libperl$(OBJ_EXT)
-# $(AR) qv $(LIBPERL) libperl$(OBJ_EXT)
-#!NO!SUBS!
-# ;;
-# esac
-# ;;
-# *)
-# $spitshell >>$Makefile <<'!NO!SUBS!'
-# rm -f $(LIBPERL)
-# $(AR) rcu $(LIBPERL) $(obj) $(DYNALOADER)
-# @$(ranlib) $(LIBPERL)
-#!NO!SUBS!
-# ;;
-# esac
-# $spitshell >>$Makefile <<'!NO!SUBS!'
+$(LIBPERL): $& $(obj) $(DYNALOADER) $(LIBPERLEXPORT)
+!NO!SUBS!
+ case "$useshrplib" in
+ true)
+ $spitshell >>$Makefile <<'!NO!SUBS!'
+ rm -f $@
+ $(LD) -o $@ $(SHRPLDFLAGS) $(obj) $(DYNALOADER) $(libs)
+!NO!SUBS!
+ case "$osname" in
+ aix)
+ $spitshell >>$Makefile <<'!NO!SUBS!'
+ rm -f libperl$(OBJ_EXT)
+ mv $@ libperl$(OBJ_EXT)
+ $(AR) qv $(LIBPERL) libperl$(OBJ_EXT)
+!NO!SUBS!
+ ;;
+ esac
+ ;;
+ *)
+ $spitshell >>$Makefile <<'!NO!SUBS!'
+ rm -f $(LIBPERL)
+ $(AR) rcu $(LIBPERL) $(obj) $(DYNALOADER)
+ @$(ranlib) $(LIBPERL)
+!NO!SUBS!
+ ;;
+ esac
+ $spitshell >>$Makefile <<'!NO!SUBS!'
# How to build executables.
else
$spitshell >>$Makefile <<'!NO!SUBS!'
lib/buildcustomize.pl: $& $(mini_obj) write_buildcustomize.pl
+ -@rm -f miniperl.xok
+ $(CC) $(CLDFLAGS) -o $(MINIPERL_EXE) \
+ $(mini_obj) $(libs)
+ $(LDLIBPTH) ./miniperl$(HOST_EXE_EXT) -w -Ilib -Idist/Exporter/lib -MExporter -e '<?>' || sh -c 'echo >&2 Failed to build miniperl. Please run make minitest; exit 1'
$(MINIPERL) -f write_buildcustomize.pl
!NO!SUBS!
fi
unidatafiles $(unidatafiles) pod/perluniprops.pod: uni.data
uni.data: $(MINIPERL_EXE) $(CONFIGPM) lib/unicore/mktables $(nonxs_ext)
- touch uni.data
+ $(MINIPERL) lib/unicore/mktables -C lib/unicore -P pod -maketest -makelist -p
+# Commented out so always runs, mktables looks at far more files than we
+# can in this makefile to decide if needs to run or not
+# touch uni.data
# $(PERL_EXE) and ext because pod_lib.pl needs Digest::MD5
# But also this ensures that all extensions are built before we try to scan
pod/perlmodlib.pod: $(MINIPERL_EXE) pod/perlmodlib.PL MANIFEST
$(MINIPERL) pod/perlmodlib.PL -q
-pod/perl5201delta.pod: pod/perldelta.pod
- $(RMS) pod/perl5201delta.pod
- $(LNS) perldelta.pod pod/perl5201delta.pod
+pod/perl5202delta.pod: pod/perldelta.pod
+ $(RMS) pod/perl5202delta.pod
+ $(LNS) perldelta.pod pod/perl5202delta.pod
extra.pods: $(MINIPERL_EXE)
-@test ! -f extra.pods || rm -f `cat extra.pods`
-rm -f *perl.xok
-rm -f cygwin.c libperl*.def libperl*.dll cygperl*.dll *.exe.stackdump
-rm -f $(PERL_EXE) $(MINIPERL_EXE) $(LIBPERL) libperl.* microperl
- -rm -f $(DTRACE_H)
+ -rm -f config.arch config.over $(DTRACE_H)
# Do not 'make _tidy' directly.
_tidy:
-cd pod; $(LDLIBPTH) $(MAKE) clean
-cd utils; $(LDLIBPTH) $(MAKE) clean
-cd x2p; $(LDLIBPTH) $(MAKE) clean
+ -rm -f lib/Config_git.pl git_version.h
-@for x in $(DYNALOADER) $(dynamic_ext) $(static_ext) $(nonxs_ext) ; do \
$(MINIPERL) make_ext.pl --target=clean $$x MAKE=$(MAKE) ; \
done
-rmdir lib/TAP/Formatter lib/TAP lib/Sys/Syslog lib/Sys lib/Search
-rmdir lib/Scalar lib/Pod/Text lib/Pod/Simple lib/Pod/Perldoc
-rmdir lib/PerlIO/via lib/PerlIO lib/Perl lib/Parse/CPAN lib/Parse
- -rmdir lib/Params lib/Package lib/OpenBSD lib/Net/FTP lib/Module/Load
+ -rmdir lib/Params lib/Package lib/Net/FTP lib/Module/Load
-rmdir lib/Module/CoreList lib/Module/Build/Platform lib/Module/Build
-rmdir lib/Module lib/Memoize lib/Math/BigInt lib/Math/BigFloat
-rmdir lib/Math lib/MIME lib/Locale/Maketext lib/Locale/Codes
d_isnan='undef'
d_isnanl='undef'
d_killpg='undef'
-d_lc_monetary_2008='undef'
d_lchown='undef'
d_ldbl_dig='define'
d_libm_lib_version='undef'
t/yaml_code.yml
),
],
+ # Waiting to be merged upstream: see pull request #83
+ 'CUSTOMIZED' => [
+ qw( lib/CPAN/Author.pm
+ lib/CPAN/CacheMgr.pm
+ lib/CPAN/FTP.pm
+ lib/CPAN/HTTP/Client.pm
+ lib/CPAN/HandleConfig.pm
+ lib/CPAN/Index.pm
+ lib/CPAN/LWP/UserAgent.pm
+ lib/CPAN/Mirrors.pm
+ ),
+ ],
},
# Note: When updating CPAN-Meta the META.* files will need to be regenerated
'Pod::Parser' => {
'DISTRIBUTION' => 'MAREKR/Pod-Parser-1.62.tar.gz',
'FILES' => q[cpan/Pod-Parser],
+ # Waiting to be merged upstream: see CPAN RT#101847
+ 'CUSTOMIZED' => [ qw( lib/Pod/PlainText.pm) ],
},
'Pod::Perldoc' => {
lib/vmsish.{pm,t}
],
},
- 'openbsd' => {
- 'FILES' => q[lib/Config_git.pl],
- },
);
# legacy CPAN flag
api_revision='5'
api_subversion='0'
api_version='20'
-api_versionstring='5.20.1'
+api_versionstring='5.20.2'
ar='ar'
-archlib='/pro/lib/perl5/5.20.1/i686-linux-64int'
-archlibexp='/pro/lib/perl5/5.20.1/i686-linux-64int'
+archlib='/pro/lib/perl5/5.20.2/i686-linux-64int'
+archlibexp='/pro/lib/perl5/5.20.2/i686-linux-64int'
archname64='64int'
archname='i686-linux-64int'
archobjs=''
d_isnan='define'
d_isnanl='define'
d_killpg='define'
-d_lc_monetary_2008='undef'
d_lchown='define'
d_ldbl_dig='define'
d_libm_lib_version='define'
incpth='/usr/lib/gcc/i586-suse-linux/4.8/include /usr/local/include /usr/lib/gcc/i586-suse-linux/4.8/include-fixed /usr/lib/gcc/i586-suse-linux/4.8/../../../../i586-suse-linux/include /usr/include'
inews=''
initialinstalllocation='/pro/bin'
-installarchlib='/pro/lib/perl5/5.20.1/i686-linux-64int'
+installarchlib='/pro/lib/perl5/5.20.2/i686-linux-64int'
installbin='/pro/bin'
installhtml1dir=''
installhtml3dir=''
installman3dir='/pro/local/man/man3'
installprefix='/pro'
installprefixexp='/pro'
-installprivlib='/pro/lib/perl5/5.20.1'
+installprivlib='/pro/lib/perl5/5.20.2'
installscript='/pro/bin'
-installsitearch='/pro/lib/perl5/site_perl/5.20.1/i686-linux-64int'
+installsitearch='/pro/lib/perl5/site_perl/5.20.2/i686-linux-64int'
installsitebin='/pro/bin'
installsitehtml1dir=''
installsitehtml3dir=''
-installsitelib='/pro/lib/perl5/site_perl/5.20.1'
+installsitelib='/pro/lib/perl5/site_perl/5.20.2'
installsiteman1dir='/pro/local/man/man1'
installsiteman3dir='/pro/local/man/man3'
installsitescript='/pro/bin'
perl_static_inline='static __inline__'
perladmin='hmbrand@cpan.org'
perllibs='-lnsl -ldl -lm -lcrypt -lutil -lc'
-perlpath='/pro/bin/perl5.20.1'
+perlpath='/pro/bin/perl5.20.2'
pg='pg'
phostname='hostname'
pidtype='pid_t'
pr=''
prefix='/pro'
prefixexp='/pro'
-privlib='/pro/lib/perl5/5.20.1'
-privlibexp='/pro/lib/perl5/5.20.1'
+privlib='/pro/lib/perl5/5.20.2'
+privlibexp='/pro/lib/perl5/5.20.2'
procselfexe='"/proc/self/exe"'
prototype='define'
ptrsize='4'
sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 6, 17, 29, 31, 0'
sig_size='69'
signal_t='void'
-sitearch='/pro/lib/perl5/site_perl/5.20.1/i686-linux-64int'
-sitearchexp='/pro/lib/perl5/site_perl/5.20.1/i686-linux-64int'
+sitearch='/pro/lib/perl5/site_perl/5.20.2/i686-linux-64int'
+sitearchexp='/pro/lib/perl5/site_perl/5.20.2/i686-linux-64int'
sitebin='/pro/bin'
sitebinexp='/pro/bin'
sitehtml1dir=''
sitehtml1direxp=''
sitehtml3dir=''
sitehtml3direxp=''
-sitelib='/pro/lib/perl5/site_perl/5.20.1'
+sitelib='/pro/lib/perl5/site_perl/5.20.2'
sitelib_stem='/pro/lib/perl5/site_perl'
-sitelibexp='/pro/lib/perl5/site_perl/5.20.1'
+sitelibexp='/pro/lib/perl5/site_perl/5.20.2'
siteman1dir='/pro/local/man/man1'
siteman1direxp='/pro/local/man/man1'
siteman3dir='/pro/local/man/man3'
ssizetype='ssize_t'
st_ino_sign='1'
st_ino_size='8'
-startperl='#!/pro/bin/perl5.20.1'
+startperl='#!/pro/bin/perl5.20.2'
startsh='#!/bin/sh'
static_ext=' '
stdchar='char'
strerror_r_proto='0'
strings='/usr/include/string.h'
submit=''
-subversion='1'
+subversion='2'
sysman='/usr/share/man/man1'
sysroot=''
tail=''
vendorprefixexp=''
vendorscript=''
vendorscriptexp=''
-version='5.20.1'
-version_patchlevel_string='version 20 subversion 1'
+version='5.20.2'
+version_patchlevel_string='version 20 subversion 2'
versiononly='define'
vi=''
xlibpth='/usr/lib/386 /lib/386'
zip='zip'
PERL_REVISION=5
PERL_VERSION=20
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
PERL_API_REVISION=5
PERL_API_VERSION=20
PERL_API_SUBVERSION=0
* This symbol contains the ~name expanded version of ARCHLIB, to be used
* in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define ARCHLIB "/pro/lib/perl5/5.20.1/i686-linux-64int-ld" /**/
-#define ARCHLIB_EXP "/pro/lib/perl5/5.20.1/i686-linux-64int-ld" /**/
+#define ARCHLIB "/pro/lib/perl5/5.20.2/i686-linux-64int-ld" /**/
+#define ARCHLIB_EXP "/pro/lib/perl5/5.20.2/i686-linux-64int-ld" /**/
/* ARCHNAME:
* This symbol holds a string representing the architecture name.
* This symbol contains the ~name expanded version of PRIVLIB, to be used
* in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define PRIVLIB "/pro/lib/perl5/5.20.1" /**/
-#define PRIVLIB_EXP "/pro/lib/perl5/5.20.1" /**/
+#define PRIVLIB "/pro/lib/perl5/5.20.2" /**/
+#define PRIVLIB_EXP "/pro/lib/perl5/5.20.2" /**/
/* PTRSIZE:
* This symbol contains the size of a pointer, so that the C preprocessor
* This symbol contains the ~name expanded version of SITEARCH, to be used
* in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define SITEARCH "/pro/lib/perl5/site_perl/5.20.1/i686-linux-64int-ld" /**/
-#define SITEARCH_EXP "/pro/lib/perl5/site_perl/5.20.1/i686-linux-64int-ld" /**/
+#define SITEARCH "/pro/lib/perl5/site_perl/5.20.2/i686-linux-64int-ld" /**/
+#define SITEARCH_EXP "/pro/lib/perl5/site_perl/5.20.2/i686-linux-64int-ld" /**/
/* SITELIB:
* This symbol contains the name of the private library for this package.
* removed. The elements in inc_version_list (inc_version_list.U) can
* be tacked onto this variable to generate a list of directories to search.
*/
-#define SITELIB "/pro/lib/perl5/site_perl/5.20.1" /**/
-#define SITELIB_EXP "/pro/lib/perl5/site_perl/5.20.1" /**/
+#define SITELIB "/pro/lib/perl5/site_perl/5.20.2" /**/
+#define SITELIB_EXP "/pro/lib/perl5/site_perl/5.20.2" /**/
#define SITELIB_STEM "/pro/lib/perl5/site_perl" /**/
/* SSize_t:
* script to make sure (one hopes) that it runs with perl and not
* some shell.
*/
-#define STARTPERL "#!/pro/bin/perl5.20.1" /**/
+#define STARTPERL "#!/pro/bin/perl5.20.2" /**/
/* HAS_STDIO_STREAM_ARRAY:
* This symbol, if defined, tells that there is an array
5.004_07 to 5.004_08 patch as an example.
# unpack perl5.004_07/
- gzip -d -c perl5.004_07.tar.gz | tar -xf -
+ gzip -d -c perl5.004_07.tar.gz | tar -xof -
# unpack perl5.004_08/
- gzip -d -c perl5.004_08.tar.gz | tar -xf -
+ gzip -d -c perl5.004_08.tar.gz | tar -xof -
makepatch perl5.004_07 perl5.004_08 > perl5.004_08.pat
Makepatch will automatically generate appropriate B<rm> commands to remove
Perl is Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012,
-2013, 2014 by Larry Wall and others. All rights reserved.
+2013, 2014, 2015 by Larry Wall and others. All rights reserved.
=item Additional Perl modules
- unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.20.1/
+ unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.20.2/
Same remark as above applies. Additionally, if this directory is not
one of directories on @INC (and @INC is influenced by C<PERLLIB_PREFIX>), you
choice. Once you have done so, use a command like the following to
unpack the archive:
- vmstar -xvf perl-5^.20^.1.tar
+ vmstar -xvf perl-5^.20^.2.tar
Then set default to the top-level source directory like so:
- set default [.perl-5^.20^.1]
+ set default [.perl-5^.20^.2]
and proceed with configuration as described in the next section.
=item Microsoft Visual C++
-The nmake that comes with Visual C++ will suffice for building.
-You will need to run the VCVARS32.BAT file, usually found somewhere
-like C:\Program Files\Microsoft Visual Studio\VC98\Bin.
-This will set your build environment.
+The nmake that comes with Visual C++ will suffice for building. Visual C
+requires that certain things be set up in the console before Visual C will
+sucessfully run. To make a console box be able to run the C compiler, you will
+need to beforehand, run the C<vcvars32.bat> file to compile for x86-32 and for
+x86-64 C<vcvarsall.bat x64> or C<vcvarsamd64.bat>. On a typical install of a
+Microsoft C compiler product, these batch files will already be in your C<PATH>
+environment variable so you may just type them without an absolute path into
+your console. If you need to find the absolute path to the batch file, it is
+usually found somewhere like C:\Program Files\Microsoft Visual Studio\VC98\Bin.
+With some newer Micrsoft C products (released after ~2004), the installer will
+put a shortcut in the start menu to launch a new console window with the
+console already set up for your target architecture (x86-32 or x86-64 or IA64).
+With the newer compilers, you may also use the older batch files if you choose
+so.
You can also use dmake to build using Visual C++; provided, however,
you set OSRELEASE to "microsft" (or whatever the directory name
under the lib\auto directory. If the build fails for any reason, make
sure you have done the previous steps correctly.
+If you are advanced enough with building C code, here is a suggestion to speed
+up building perl, and the later C<make test>. Try to keep your PATH enviromental
+variable with the least number of folders possible (remember to keep your C
+compiler's folders there). C<C:\WINDOWS\system32> or C<C:\WINNT\system32>
+depending on your OS version should be first folder in PATH, since "cmd.exe"
+is the most commonly launched program during the build and later testing.
+
=back
=head2 Testing Perl on Windows
Note that not all of the extensions available from CPAN may work
in the Windows environment; you should check the information at
-L<http://testers.cpan.org/> before investing too much effort into
+L<http://www.cpantesters.org/> before investing too much effort into
porting modules that don't readily build.
Most extensions (whether they require a C compiler or not) can
If a module implements XSUBs, you will need one of the supported
C compilers. You must make sure you have set up the environment for
-the compiler for command-line compilation.
+the compiler for command-line compilation before running C<perl Makefile.PL>
+or any invocation of make.
If a module does not build for some reason, look carefully for
why it failed, and report problems to the module author. If
but that may be just luck. Other AntiVirus software may have similar issues.
+A git GUI shell extension for Windows such as TortoiseGit will cause the build
+and later C<make test> to run much slower since every file is checked for its
+git status as soon as it is created and/or modified. TortoiseGit doesn't cause
+any test failures or build problems unlike the antivirus software described
+above, but it does cause similar slowness. It is suggested to use Task Manager
+to look for background processes which use high CPU amounts during the building
+process.
+
Some of the built-in functions do not act exactly as documented in
L<perlfunc>, and a few are not implemented at all. To avoid
surprises, particularly if you have had prior exposure to Perl
Support for 64-bit Windows added in 5.8 (ActiveState Corp).
-Last updated: 22 October 2013
+Last updated: 07 October 2014
=cut
*/
#$d_locconv HAS_LOCALECONV /**/
-/* HAS_LC_MONETARY_2008:
- * This symbol, if defined, indicates that the localeconv routine is
- * available and has the additional members added in POSIX 1003.1-2008.
- */
-#$d_lc_monetary_2008 HAS_LC_MONETARY_2008 /**/
-
/* HAS_LOCKF:
* This symbol, if defined, indicates that the lockf routine is
* available to do file locking.
(.{1,64})\ # Split at the last convenient space
/$1\n /gx;
-# libpaths that should be truncated after the first path element
-my %Libpathtrunc = map {($_,$_)}
- qw(archlib archlibexp privlib privlibexp sitearch sitearchexp
- sitelib sitelibexp);
-
# allowed opts as well as specifies default and initial values
my %Allowed_Opts = (
'glossary' => 1, # --no-glossary - no glossary file inclusion,
$in_v = $val !~ /$quote\n/;
next if $in_v;
- # XXX - should use PERLLIB_SEP, not hard-code ':'
- $val =~ s/^([^:]+).*${quote}\w*$/$1${quote}/ if $Libpathtrunc{$name};
-
s,/,::,g if $Extensions{$name};
$val =~ s/$quote\n?\z//;
$ i_locale="define"
$ i_langinfo="define"
$ d_locconv="define"
-$ d_lc_monetary_2008="define"
$ d_nl_langinfo="define"
$ d_setlocale="define"
$ vms_cc_type="decc"
$ i_locale="undef"
$ i_langinfo="undef"
$ d_locconv="undef"
-$ d_lc_monetary_2008="undef"
$ d_nl_langinfo="undef"
$ d_setlocale="undef"
$ ENDIF
$ WC "d_llseek='undef'"
$ WC "d_localtime64='undef'"
$ WC "d_locconv='" + d_locconv + "'"
-$ WC "d_lc_monetary_2008='" + d_lc_monetary_2008 + "'"
$ WC "d_lockf='undef'"
$ WC "d_longdbl='" + d_longdbl + "'"
$ WC "d_longlong='" + d_longlong + "'"
my $path = shift;
return undef
- if $path =~ /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/ ||
- $path =~ /(~|\.bak|_bak)$/ ||
+ if $path =~ /(~|\.bak|_bak)$/ ||
$path =~ /\..*\.sw(o|p)$/ ||
$path =~ /\B\.svn\b/;
my $path = shift;
return undef
- if $path =~ /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/ ||
- $path =~ /(~|\.bak|_bak)$/ ||
+ if $path =~ /(~|\.bak|_bak)$/ ||
$path =~ /\..*\.sw(o|p)$/ ||
$path =~ /\B\.svn\b/;
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
-#include <sys/types.h>
-#include <md5.h>
#ifdef __cplusplus
}
#endif
# define SvPVbyte(sv, lp) (sv_utf8_downgrade((sv), 0), SvPV((sv), (lp)))
#endif
+/* Perl does not guarantee that U32 is exactly 32 bits. Some system
+ * has no integral type with exactly 32 bits. For instance, A Cray has
+ * short, int and long all at 64 bits so we need to apply this macro
+ * to reduce U32 values to 32 bits at appropriate places. If U32
+ * really does have 32 bits then this is a no-op.
+ */
+#if BYTEORDER > 0x4321 || defined(TRUNCATE_U32)
+ #define TO32(x) ((x) & 0xFFFFffff)
+ #define TRUNC32(x) ((x) &= 0xFFFFffff)
+#else
+ #define TO32(x) (x)
+ #define TRUNC32(x) /*nothing*/
+#endif
+
+/* The MD5 algorithm is defined in terms of little endian 32-bit
+ * values. The following macros (and functions) allow us to convert
+ * between native integers and such values.
+ */
+#undef BYTESWAP
+#ifndef U32_ALIGNMENT_REQUIRED
+ #if BYTEORDER == 0x1234 /* 32-bit little endian */
+ #define BYTESWAP(x) (x) /* no-op */
+
+ #elif BYTEORDER == 0x4321 /* 32-bit big endian */
+ #define BYTESWAP(x) ((((x)&0xFF)<<24) \
+ |(((x)>>24)&0xFF) \
+ |(((x)&0x0000FF00)<<8) \
+ |(((x)&0x00FF0000)>>8) )
+ #endif
+#endif
+
+#ifndef BYTESWAP
+static void u2s(U32 u, U8* s)
+{
+ *s++ = (U8)(u & 0xFF);
+ *s++ = (U8)((u >> 8) & 0xFF);
+ *s++ = (U8)((u >> 16) & 0xFF);
+ *s = (U8)((u >> 24) & 0xFF);
+}
+
+#define s2u(s,u) ((u) = (U32)(*s) | \
+ ((U32)(*(s+1)) << 8) | \
+ ((U32)(*(s+2)) << 16) | \
+ ((U32)(*(s+3)) << 24))
+#endif
+
+/* This structure keeps the current state of algorithm.
+ */
+typedef struct {
+ U32 A, B, C, D; /* current digest */
+ U32 bytes_low; /* counts bytes in message */
+ U32 bytes_high; /* turn it into a 64-bit counter */
+ U8 buffer[128]; /* collect complete 64 byte blocks */
+} MD5_CTX;
+
#if defined(USE_ITHREADS) && defined(MGf_DUP)
STATIC int dup_md5_ctx(pTHX_ MAGIC *mg, CLONE_PARAMS *params)
{
#endif
};
+
+/* Padding is added at the end of the message in order to fill a
+ * complete 64 byte block (- 8 bytes for the message length). The
+ * padding is also the reason the buffer in MD5_CTX have to be
+ * 128 bytes.
+ */
+static const unsigned char PADDING[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* Constants for MD5Transform routine.
+ */
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) ((((x) & ((y) ^ (z))) ^ (z)))
+#define G(x, y, z) F(z, x, y)
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n) | ((x) >> (32-(n)))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ * Rotation is separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, s, ac) \
+ (a) += F ((b), (c), (d)) + (NEXTx) + (U32)(ac); \
+ TRUNC32((a)); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ TRUNC32((a));
+
+#define GG(a, b, c, d, x, s, ac) \
+ (a) += G ((b), (c), (d)) + X[x] + (U32)(ac); \
+ TRUNC32((a)); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ TRUNC32((a));
+
+#define HH(a, b, c, d, x, s, ac) \
+ (a) += H ((b), (c), (d)) + X[x] + (U32)(ac); \
+ TRUNC32((a)); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ TRUNC32((a));
+
+#define II(a, b, c, d, x, s, ac) \
+ (a) += I ((b), (c), (d)) + X[x] + (U32)(ac); \
+ TRUNC32((a)); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ TRUNC32((a));
+
+
+static void
+MD5Init(MD5_CTX *ctx)
+{
+ /* Start state */
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ /* message length */
+ ctx->bytes_low = ctx->bytes_high = 0;
+}
+
+
+static void
+MD5Transform(MD5_CTX* ctx, const U8* buf, STRLEN blocks)
+{
+#ifdef MD5_DEBUG
+ static int tcount = 0;
+#endif
+
+ U32 A = ctx->A;
+ U32 B = ctx->B;
+ U32 C = ctx->C;
+ U32 D = ctx->D;
+
+#ifndef U32_ALIGNMENT_REQUIRED
+ const U32 *x = (U32*)buf; /* really just type casting */
+#endif
+
+ do {
+ U32 a = A;
+ U32 b = B;
+ U32 c = C;
+ U32 d = D;
+
+#if BYTEORDER == 0x1234 && !defined(U32_ALIGNMENT_REQUIRED)
+ const U32 *X = x;
+ #define NEXTx (*x++)
+#else
+ U32 X[16]; /* converted values, used in round 2-4 */
+ U32 *uptr = X;
+ U32 tmp;
+ #ifdef BYTESWAP
+ #define NEXTx (tmp=*x++, *uptr++ = BYTESWAP(tmp))
+ #else
+ #define NEXTx (s2u(buf,tmp), buf += 4, *uptr++ = tmp)
+ #endif
+#endif
+
+#ifdef MD5_DEBUG
+ if (buf == ctx->buffer)
+ fprintf(stderr,"%5d: Transform ctx->buffer", ++tcount);
+ else
+ fprintf(stderr,"%5d: Transform %p (%d)", ++tcount, buf, blocks);
+
+ {
+ int i;
+ fprintf(stderr,"[");
+ for (i = 0; i < 16; i++) {
+ fprintf(stderr,"%x,", x[i]);
+ }
+ fprintf(stderr,"]\n");
+ }
+#endif
+
+ /* Round 1 */
+ FF (a, b, c, d, S11, 0xd76aa478); /* 1 */
+ FF (d, a, b, c, S12, 0xe8c7b756); /* 2 */
+ FF (c, d, a, b, S13, 0x242070db); /* 3 */
+ FF (b, c, d, a, S14, 0xc1bdceee); /* 4 */
+ FF (a, b, c, d, S11, 0xf57c0faf); /* 5 */
+ FF (d, a, b, c, S12, 0x4787c62a); /* 6 */
+ FF (c, d, a, b, S13, 0xa8304613); /* 7 */
+ FF (b, c, d, a, S14, 0xfd469501); /* 8 */
+ FF (a, b, c, d, S11, 0x698098d8); /* 9 */
+ FF (d, a, b, c, S12, 0x8b44f7af); /* 10 */
+ FF (c, d, a, b, S13, 0xffff5bb1); /* 11 */
+ FF (b, c, d, a, S14, 0x895cd7be); /* 12 */
+ FF (a, b, c, d, S11, 0x6b901122); /* 13 */
+ FF (d, a, b, c, S12, 0xfd987193); /* 14 */
+ FF (c, d, a, b, S13, 0xa679438e); /* 15 */
+ FF (b, c, d, a, S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ GG (a, b, c, d, 1, S21, 0xf61e2562); /* 17 */
+ GG (d, a, b, c, 6, S22, 0xc040b340); /* 18 */
+ GG (c, d, a, b, 11, S23, 0x265e5a51); /* 19 */
+ GG (b, c, d, a, 0, S24, 0xe9b6c7aa); /* 20 */
+ GG (a, b, c, d, 5, S21, 0xd62f105d); /* 21 */
+ GG (d, a, b, c, 10, S22, 0x2441453); /* 22 */
+ GG (c, d, a, b, 15, S23, 0xd8a1e681); /* 23 */
+ GG (b, c, d, a, 4, S24, 0xe7d3fbc8); /* 24 */
+ GG (a, b, c, d, 9, S21, 0x21e1cde6); /* 25 */
+ GG (d, a, b, c, 14, S22, 0xc33707d6); /* 26 */
+ GG (c, d, a, b, 3, S23, 0xf4d50d87); /* 27 */
+ GG (b, c, d, a, 8, S24, 0x455a14ed); /* 28 */
+ GG (a, b, c, d, 13, S21, 0xa9e3e905); /* 29 */
+ GG (d, a, b, c, 2, S22, 0xfcefa3f8); /* 30 */
+ GG (c, d, a, b, 7, S23, 0x676f02d9); /* 31 */
+ GG (b, c, d, a, 12, S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ HH (a, b, c, d, 5, S31, 0xfffa3942); /* 33 */
+ HH (d, a, b, c, 8, S32, 0x8771f681); /* 34 */
+ HH (c, d, a, b, 11, S33, 0x6d9d6122); /* 35 */
+ HH (b, c, d, a, 14, S34, 0xfde5380c); /* 36 */
+ HH (a, b, c, d, 1, S31, 0xa4beea44); /* 37 */
+ HH (d, a, b, c, 4, S32, 0x4bdecfa9); /* 38 */
+ HH (c, d, a, b, 7, S33, 0xf6bb4b60); /* 39 */
+ HH (b, c, d, a, 10, S34, 0xbebfbc70); /* 40 */
+ HH (a, b, c, d, 13, S31, 0x289b7ec6); /* 41 */
+ HH (d, a, b, c, 0, S32, 0xeaa127fa); /* 42 */
+ HH (c, d, a, b, 3, S33, 0xd4ef3085); /* 43 */
+ HH (b, c, d, a, 6, S34, 0x4881d05); /* 44 */
+ HH (a, b, c, d, 9, S31, 0xd9d4d039); /* 45 */
+ HH (d, a, b, c, 12, S32, 0xe6db99e5); /* 46 */
+ HH (c, d, a, b, 15, S33, 0x1fa27cf8); /* 47 */
+ HH (b, c, d, a, 2, S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ II (a, b, c, d, 0, S41, 0xf4292244); /* 49 */
+ II (d, a, b, c, 7, S42, 0x432aff97); /* 50 */
+ II (c, d, a, b, 14, S43, 0xab9423a7); /* 51 */
+ II (b, c, d, a, 5, S44, 0xfc93a039); /* 52 */
+ II (a, b, c, d, 12, S41, 0x655b59c3); /* 53 */
+ II (d, a, b, c, 3, S42, 0x8f0ccc92); /* 54 */
+ II (c, d, a, b, 10, S43, 0xffeff47d); /* 55 */
+ II (b, c, d, a, 1, S44, 0x85845dd1); /* 56 */
+ II (a, b, c, d, 8, S41, 0x6fa87e4f); /* 57 */
+ II (d, a, b, c, 15, S42, 0xfe2ce6e0); /* 58 */
+ II (c, d, a, b, 6, S43, 0xa3014314); /* 59 */
+ II (b, c, d, a, 13, S44, 0x4e0811a1); /* 60 */
+ II (a, b, c, d, 4, S41, 0xf7537e82); /* 61 */
+ II (d, a, b, c, 11, S42, 0xbd3af235); /* 62 */
+ II (c, d, a, b, 2, S43, 0x2ad7d2bb); /* 63 */
+ II (b, c, d, a, 9, S44, 0xeb86d391); /* 64 */
+
+ A += a; TRUNC32(A);
+ B += b; TRUNC32(B);
+ C += c; TRUNC32(C);
+ D += d; TRUNC32(D);
+
+ } while (--blocks);
+ ctx->A = A;
+ ctx->B = B;
+ ctx->C = C;
+ ctx->D = D;
+}
+
+
+#ifdef MD5_DEBUG
+static char*
+ctx_dump(MD5_CTX* ctx)
+{
+ static char buf[1024];
+ sprintf(buf, "{A=%x,B=%x,C=%x,D=%x,%d,%d(%d)}",
+ ctx->A, ctx->B, ctx->C, ctx->D,
+ ctx->bytes_low, ctx->bytes_high, (ctx->bytes_low&0x3F));
+ return buf;
+}
+#endif
+
+
+static void
+MD5Update(MD5_CTX* ctx, const U8* buf, STRLEN len)
+{
+ STRLEN blocks;
+ STRLEN fill = ctx->bytes_low & 0x3F;
+
+#ifdef MD5_DEBUG
+ static int ucount = 0;
+ fprintf(stderr,"%5i: Update(%s, %p, %d)\n", ++ucount, ctx_dump(ctx),
+ buf, len);
+#endif
+
+ ctx->bytes_low += len;
+ if (ctx->bytes_low < len) /* wrap around */
+ ctx->bytes_high++;
+
+ if (fill) {
+ STRLEN missing = 64 - fill;
+ if (len < missing) {
+ Copy(buf, ctx->buffer + fill, len, U8);
+ return;
+ }
+ Copy(buf, ctx->buffer + fill, missing, U8);
+ MD5Transform(ctx, ctx->buffer, 1);
+ buf += missing;
+ len -= missing;
+ }
+
+ blocks = len >> 6;
+ if (blocks)
+ MD5Transform(ctx, buf, blocks);
+ if ( (len &= 0x3F)) {
+ Copy(buf + (blocks << 6), ctx->buffer, len, U8);
+ }
+}
+
+
+static void
+MD5Final(U8* digest, MD5_CTX *ctx)
+{
+ STRLEN fill = ctx->bytes_low & 0x3F;
+ STRLEN padlen = (fill < 56 ? 56 : 120) - fill;
+ U32 bits_low, bits_high;
+#ifdef MD5_DEBUG
+ fprintf(stderr," Final: %s\n", ctx_dump(ctx));
+#endif
+ Copy(PADDING, ctx->buffer + fill, padlen, U8);
+ fill += padlen;
+
+ bits_low = ctx->bytes_low << 3;
+ bits_high = (ctx->bytes_high << 3) | (ctx->bytes_low >> 29);
+#ifdef BYTESWAP
+ *(U32*)(ctx->buffer + fill) = BYTESWAP(bits_low); fill += 4;
+ *(U32*)(ctx->buffer + fill) = BYTESWAP(bits_high); fill += 4;
+#else
+ u2s(bits_low, ctx->buffer + fill); fill += 4;
+ u2s(bits_high, ctx->buffer + fill); fill += 4;
+#endif
+
+ MD5Transform(ctx, ctx->buffer, fill >> 6);
+#ifdef MD5_DEBUG
+ fprintf(stderr," Result: %s\n", ctx_dump(ctx));
+#endif
+
+#ifdef BYTESWAP
+ *(U32*)digest = BYTESWAP(ctx->A); digest += 4;
+ *(U32*)digest = BYTESWAP(ctx->B); digest += 4;
+ *(U32*)digest = BYTESWAP(ctx->C); digest += 4;
+ *(U32*)digest = BYTESWAP(ctx->D);
+#else
+ u2s(ctx->A, digest);
+ u2s(ctx->B, digest+4);
+ u2s(ctx->C, digest+8);
+ u2s(ctx->D, digest+12);
+#endif
+}
+
+#ifndef INT2PTR
+#define INT2PTR(any,d) (any)(d)
+#endif
+
static MD5_CTX* get_md5_ctx(pTHX_ SV* sv)
{
MAGIC *mg;
InputStream fh
PREINIT:
MD5_CTX* context = get_md5_ctx(aTHX_ self);
- STRLEN fill = (context->count >> 3) & (MD5_BLOCK_LENGTH - 1);
+ STRLEN fill = context->bytes_low & 0x3F;
#ifdef USE_HEAP_INSTEAD_OF_STACK
unsigned char* buffer;
#else
# This is the output of: 'md5sum README MD5.xs rfc1321.txt'
$EXPECT = <<EOT;
2f93400875dbb56f36691d5f69f3eba5 README
-1d2a7c4f7a6180a7f3369d703ffe7cd0 MD5.xs
+f908acbcf6bd32042f282b0deed61264 MD5.xs
754b9db19f79dbc4992f7166eb0f37ce rfc1321.txt
EOT
}
INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
INST_DYNAMIC_FIX = '.$ld_fix.'
-$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
+$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
');
if ($armaybe ne ':'){
$ldfrom = 'tmp$(LIB_EXT)';
push @m, <<'MAKE';
$(CHMOD) $(PERM_RWX) $@
- $(NOECHO) $(RM_RF) $(INST_BOOT)
+ $(NOECHO) $(RM_RF) $(BOOTSTRAP)
- $(CP_NONEMPTY) $(BOOTSTRAP) $(INST_BOOT) $(PERM_RW)
MAKE
my $path = shift;
return undef
- if $path =~ /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/ ||
- $path =~ /(~|\.bak|_bak)$/ ||
+ if $path =~ /(~|\.bak|_bak)$/ ||
$path =~ /\..*\.sw(o|p)$/ ||
$path =~ /\B\.svn\b/;
=head1 NAME
-NEXT - Provide a pseudo-class NEXT (et al) that allows method redispatch
+NEXT.pm - Provide a pseudo-class NEXT (et al) that allows method redispatch
=head1 SYNOPSIS
# by Pod::Usage.
@ISA = qw(Pod::Select);
-$VERSION = '2.06';
+$VERSION = '2.07';
BEGIN {
if ($] < 5.006) {
}
}
-sub begin_pod {\r
- my $self = shift;\r
- $$self{EXCLUDE} = 0;\r
- $$self{VERBATIM} = 0;\r
-}\r
############################################################################
# Module return value and documentation
If the string is "PARA", C<extract_tagged> returns only the first paragraph
after the tag (up to the first line that is either empty or contains
only whitespace characters).
-If the string is "", the default behaviour (i.e. failure) is reinstated.
+If the string is "", the the default behaviour (i.e. failure) is reinstated.
For example, suppose the start tag "/para" introduces a paragraph, which then
continues until the next "/endpara" tag or until another "/para" tag is
use IO::Handle;
use File::Spec;
use FindBin qw($Bin);
+use constant TRUNCATE_ME => File::Spec->catfile($Bin,'truncate_me');
-my ($truncate_status, $tmpfh, $tmpfile);
+my ($truncate_status, $tmpfh);
# Some systems have a screwy tempfile. We don't run our tests there.
eval {
- ($tmpfh, $tmpfile) = tempfile();
+ $tmpfh = tempfile();
};
if ($@ or !defined $tmpfh) {
# wrong with our tests, or autodie...
{
use autodie qw(open);
- open(TRUNCATE_FH, '+<', $tmpfile);
+ open(TRUNCATE_FH, '+<', TRUNCATE_ME);
}
# Now try truncating the filehandle. This should succeed.
$cut = $i + 1;
$cut++ if ($dirs[$i + 1] && $dirs[$i + 1] eq 'lib');
last;
- } elsif ($dirs[$i] eq 'lib' && $dirs[$i + 1] && $dirs[0] eq 'ext') {
- $cut = $i + 1;
- }
+ }
}
if ($cut > 0) {
splice (@dirs, 0, $cut);
PerlIO_printf(Perl_debug_log, "\n");
else {
- /* Find the current context's stack range by searching
+ /* Find the the current context's stack range by searching
* forward for any higher contexts using this stack; failing
* that, it will be equal to the size of the stack for old
* stacks, or PL_stack_sp for the current stack
=head1 VERSION
-Version 2.151 (March 7 2014)
-
-Plus fix for CVS-2014-4330
+Version 2.151_01 (January 8 2015)
=head1 SEE ALSO
SV *pad, SV *xpad, SV *apad, SV *sep, SV *pair,
SV *freezer, SV *toaster,
I32 purity, I32 deepcopy, I32 quotekeys, SV *bless,
- I32 maxdepth, SV *sortkeys, int use_sparse_seen_hash, I32 useqq,
- IV maxrecurse);
+ I32 maxdepth, SV *sortkeys, int use_sparse_seen_hash, I32 useqq, IV maxrecurse);
#ifndef HvNAME_get
#define HvNAME_get HvNAME
DD_dump(aTHX_ ival, SvPVX_const(namesv), SvCUR(namesv), retval, seenhv,
postav, levelp, indent, pad, xpad, apad, sep, pair,
freezer, toaster, purity, deepcopy, quotekeys, bless,
- maxdepth, sortkeys, use_sparse_seen_hash, useqq, maxrecurse);
+ maxdepth, sortkeys, use_sparse_seen_hash, useqq,
+ maxrecurse);
sv_catpvn(retval, ")}", 2);
} /* plain */
else {
DD_dump(aTHX_ ival, SvPVX_const(namesv), SvCUR(namesv), retval, seenhv,
postav, levelp, indent, pad, xpad, apad, sep, pair,
freezer, toaster, purity, deepcopy, quotekeys, bless,
- maxdepth, sortkeys, use_sparse_seen_hash, useqq, maxrecurse);
+ maxdepth, sortkeys, use_sparse_seen_hash, useqq,
+ maxrecurse);
}
SvREFCNT_dec(namesv);
}
DD_dump(aTHX_ ival, SvPVX_const(namesv), SvCUR(namesv), retval, seenhv,
postav, levelp, indent, pad, xpad, apad, sep, pair,
freezer, toaster, purity, deepcopy, quotekeys, bless,
- maxdepth, sortkeys, use_sparse_seen_hash, useqq, maxrecurse);
+ maxdepth, sortkeys, use_sparse_seen_hash, useqq,
+ maxrecurse);
SvREFCNT_dec(namesv);
}
else if (realtype == SVt_PVAV) {
DD_dump(aTHX_ elem, iname, ilen, retval, seenhv, postav,
levelp, indent, pad, xpad, apad, sep, pair,
freezer, toaster, purity, deepcopy, quotekeys, bless,
- maxdepth, sortkeys, use_sparse_seen_hash, useqq, maxrecurse);
+ maxdepth, sortkeys, use_sparse_seen_hash,
+ useqq, maxrecurse);
if (ix < ixmax)
sv_catpvn(retval, ",", 1);
}
DD_dump(aTHX_ hval, SvPVX_const(sname), SvCUR(sname), retval, seenhv,
postav, levelp, indent, pad, xpad, newapad, sep, pair,
freezer, toaster, purity, deepcopy, quotekeys, bless,
- maxdepth, sortkeys, use_sparse_seen_hash, useqq, maxrecurse);
+ maxdepth, sortkeys, use_sparse_seen_hash, useqq,
+ maxrecurse);
SvREFCNT_dec(sname);
Safefree(nkey_buffer);
if (indent >= 2)
seenhv, postav, &nlevel, indent, pad, xpad,
newapad, sep, pair, freezer, toaster, purity,
deepcopy, quotekeys, bless, maxdepth,
- sortkeys, use_sparse_seen_hash, useqq, maxrecurse);
+ sortkeys, use_sparse_seen_hash, useqq,
+ maxrecurse);
SvREFCNT_dec(e);
}
}
DD_dump(aTHX_ val, SvPVX_const(name), SvCUR(name), valstr, seenhv,
postav, &level, indent, pad, xpad, newapad, sep, pair,
freezer, toaster, purity, deepcopy, quotekeys,
- bless, maxdepth, sortkeys, use_sparse_seen_hash, useqq,
- maxrecurse);
+ bless, maxdepth, sortkeys, use_sparse_seen_hash,
+ useqq, maxrecurse);
SPAGAIN;
if (indent >= 2 && !terse)
use warnings;
use Exporter;
use File::Spec;
+use lib qw( lib );
use ExtUtils::ParseXS::Constants ();
our $VERSION = '3.24';
next;
}
-# # Don't do anything with undefs.
-#
-# unless (defined($a[$i])) {
-# next;
-# }
- $a[$i] //= 0;
+ # Don't do anything with undefs.
+
+ unless (defined($a[$i])) {
+ next;
+ }
# Perl scalars are fed to the appropriate constructor.
+++ /dev/null
-#!perl -w
-use strict;
-use Test::More;
-
-plan skip_all => 'This is perl core-only test' unless $ENV{PERL_CORE};
-plan skip_all => 'Special case v5.21.1 because rjbs' if sprintf("v%vd", $^V) eq 'v5.21.1';
-
-my @modules = qw[
- Module::CoreList
- Module::CoreList::Utils
- Module::CoreList::TieHashDelta
-];
-
-plan tests => scalar @modules;
-
-foreach my $mod ( @modules ) {
- eval "require $mod";
- my $vers = eval $mod->VERSION;
- ok( !( $vers < $] || $vers > $] ), "$mod version should match perl version in core" )
- or diag("$mod $vers doesn't match $]");
-}
print "# Looping for $busycount iterations should take about 0.025s\n";
}
- my $TIMEOUT = 600;
+ my $TIMEOUT = 60;
my $mutex = 1;
share($mutex);
return "
$object : \$(FIRST_MAKEFILE) \$(OBJECT)
- #\$(RM_RF) $object
- #\$(CP) \$(OBJECT) $object
+ \$(RM_RF) $object
+ \$(CP) \$(OBJECT) $object
static :: $object
";
char pathbuf[PATH_MAX + 2];
if (*filename != '/' && strchr(filename, '/')) {
if (getcwd(pathbuf, PATH_MAX - strlen(filename))) {
- my_strlcat(pathbuf, "/", sizeof(pathbuf));
- my_strlcat(pathbuf, filename, sizeof(pathbuf));
+ strcat(pathbuf, "/");
+ strcat(pathbuf, filename);
filename = pathbuf;
}
}
use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'NDBM_File',
- #LIBS => ["-L/usr/local/lib -lndbm", "-ldbm -lucb"],
+ LIBS => ["-L/usr/local/lib -lndbm", "-ldbm -lucb"],
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'NDBM_File.pm',
INC => ($^O eq "MacOS" ? "-i ::::db:include" : "")
};
const struct lconv_offset lconv_integers[] = {
- {"int_frac_digits", offsetof(struct lconv, int_frac_digits)},
- {"frac_digits", offsetof(struct lconv, frac_digits)},
- {"p_cs_precedes", offsetof(struct lconv, p_cs_precedes)},
- {"p_sep_by_space", offsetof(struct lconv, p_sep_by_space)},
- {"n_cs_precedes", offsetof(struct lconv, n_cs_precedes)},
- {"n_sep_by_space", offsetof(struct lconv, n_sep_by_space)},
- {"p_sign_posn", offsetof(struct lconv, p_sign_posn)},
- {"n_sign_posn", offsetof(struct lconv, n_sign_posn)},
-#ifdef HAS_LC_MONETARY_2008
- {"int_p_cs_precedes", offsetof(struct lconv, int_p_cs_precedes)},
- {"int_p_sep_by_space", offsetof(struct lconv, int_p_sep_by_space)},
- {"int_n_cs_precedes", offsetof(struct lconv, int_n_cs_precedes)},
- {"int_n_sep_by_space", offsetof(struct lconv, int_n_sep_by_space)},
- {"int_p_sign_posn", offsetof(struct lconv, int_p_sign_posn)},
- {"int_n_sign_posn", offsetof(struct lconv, int_n_sign_posn)},
-#endif
+ {"int_frac_digits", offsetof(struct lconv, int_frac_digits)},
+ {"frac_digits", offsetof(struct lconv, frac_digits)},
+ {"p_cs_precedes", offsetof(struct lconv, p_cs_precedes)},
+ {"p_sep_by_space", offsetof(struct lconv, p_sep_by_space)},
+ {"n_cs_precedes", offsetof(struct lconv, n_cs_precedes)},
+ {"n_sep_by_space", offsetof(struct lconv, n_sep_by_space)},
+ {"p_sign_posn", offsetof(struct lconv, p_sign_posn)},
+ {"n_sign_posn", offsetof(struct lconv, n_sign_posn)},
{NULL, 0}
};
n_sep_by_space
p_sign_posn
n_sign_posn
- int_p_cs_precedes
- int_p_sep_by_space
- int_n_cs_precedes
- int_n_sep_by_space
- int_p_sign_posn
- int_n_sign_posn
))
{
printf qq(%s: "%s",\n),
}
}
-use Test::More tests => 115;
+use Test::More tests => 109;
use POSIX qw(fcntl_h signal_h limits_h _exit getcwd open read strftime write
errno localeconv dup dup2 lseek access);
}
}
- my @lconv = qw(
- int_frac_digits frac_digits
- p_cs_precedes p_sep_by_space
- n_cs_precedes n_sep_by_space
- p_sign_posn n_sign_posn
- );
-
- SKIP: {
- skip('No HAS_LC_MONETARY_2008', 6) unless $Config{d_lc_monetary_2008};
-
- push @lconv, qw(
- int_p_cs_precedes int_p_sep_by_space
- int_n_cs_precedes int_n_sep_by_space
- int_p_sign_posn int_n_sign_posn
- );
- }
-
- foreach (@lconv) {
+ foreach (qw(int_frac_digits frac_digits p_cs_precedes p_sep_by_space
+ n_cs_precedes n_sep_by_space p_sign_posn n_sign_posn)) {
SKIP: {
skip("localeconv has no result for $_", 1)
unless exists $conv->{$_};
SKIP: {
if (
!$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
+ || $Config::Config{ccflags} =~ /\bD?NO_LOCALE\b/
) {
skip "no locale support", 7
}
* use that, but for lack of anything better we will use the sub's
* original package to look up $AUTOLOAD.
*/
- varstash = GvSTASH(CvGV(cv));
+ varstash = CvNAMED(cv) ? CvSTASH(cv) : GvSTASH(CvGV(cv));
vargv = *(GV**)hv_fetch(varstash, S_autoload, S_autolen, TRUE);
ENTER;
numifying instead of C's "+0". */
gv = Perl_gv_fetchmeth_pvn(aTHX_ stash, cooky, l, -1, 0);
cv = 0;
- if (gv && (cv = GvCV(gv))) {
+ if (gv && (cv = GvCV(gv)) && CvGV(cv)) {
if(GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")){
const char * const hvname = HvNAME_get(GvSTASH(CvGV(cv)));
if (hvname && HEK_LEN(HvNAME_HEK(GvSTASH(CvGV(cv)))) == 8
# -readonly_strings moves string constants into read-only section
# which hopefully means that modifying them leads into segmentation
# faults.
- #
for i in -trapuv -readonly_strings
do
case "$ccflags" in
;;
esac
+# In Tru64 several slightly incompatible socket APIs are supported,
+# which one applies is chosen with a set of defines:
+# -D_SOCKADDR_LEN enables 4.4BSD and IPv6 interfaces
+# -D_POSIX_PII_SOCKET enables socklen_t instead of size_t
+for i in -D_SOCKADDR_LEN -D_POSIX_PII_SOCKET
+do
+ case "$ccflags" in
+ *$i*) ;;
+ *) ccflags="$ccflags $i" ;;
+ esac
+done
+# For OSF/1 3.2, however, defining _SOCKADDR_LEN would be
+# a bad idea since it breaks send() and recv().
+case "$ccflags" in
+*DEC_OSF1_3_X*SOCKADDR_LEN*)
+ ccflags=`echo " $ccflags " | sed -e 's/ -D_SOCKADDR_LEN / /'`
+ ;;
+esac
+
#
# Unset temporary variables no more needed.
#
# has prompted the user for the C compiler to use.
case "$cc" in
-*gcc*) ;;
+*gcc*)
+ # With cc we can use -c99, but with gcc we just can't use C99 headers.
+ # (There is a hidden define __c99 that cc uses, but trying to use that
+ # with gcc leads into magnificent explosions.)
+ i_stdint='undef'
+ ;;
*) ccversion=`cc -version 2>&1` ;;
esac
# Warnings to turn off because the source code hasn't
# been cleaned up enough yet to satisfy the IRIX cc.
+ # 1047: macro redefinitions (in IRIX' own system headers!)
# 1184: "=" is used where where "==" may have been intended.
# 1552: The variable "foobar" is set but never used.
woff=1184,1552
'-O') optimize='-O3 -OPT:Olimit=0:space=ON' ;;
*) ;;
esac
+ # Perl source has just grown too chummy with c99
+ # (headerwise, not code-wise: we use <stdint.h> and such)
+ ccflags="$ccflags -c99"
;;
*6.2*) # Ragnarok 6.2
ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff $woff"
;;
esac
+# There is a devious bug in the MIPSpro 7.4 compiler:
+# memcmp() is an inlined intrinsic, and "sometimes" it gets compiled wrong.
+#
+# In Perl the most obvious hit is regcomp.c:S_regpposixcc(),
+# causing bus errors when compiling the POSIX character classes like
+# /[[:digit:]], which means that miniperl cannot build perl.
+# (That is almost only the one victim: one single test in re/pat fails, also.)
+#
+# Therefore let's turn the inline intrinsics off and let the normal
+# libc versions be used instead. This may cause a performance hit
+# but a little slower is better than zero speed.
+#
+# MIPSpro C 7.4.1m is supposed to have fixed this bug.
+#
+case "$ccversion" in
+"MIPSpro Compilers: Version 7.4")
+ ccflags="$ccflags -U__INLINE_INTRINSICS"
+ ;;
+esac
+
EOCCBU
# End of cc.cbu callback unit. - Allen
# Helmut Jarausch reports that Perl's malloc is rather unusable
# with IRIX, and SGI confirms the problem.
usemymalloc=${usemymalloc:-false}
+
+# Configure finds <fcntl.h> but then thinks it can use <sys/file.h>
+# instead; in IRIX this is not true because the prototype of fcntl()
+# requires explicit include of <fcntl.h>
+i_fcntl=define
;;
esac
case "$osvers" in
-0.9*|1.*|2.*|3.*|4.*|5.*|6.*)
+0.8*)
+ ;;
+*)
d_getprotoent_r="$undef"
d_getprotobyname_r="$undef"
d_getprotobynumber_r="$undef"
d_getservbyport_r="$undef"
d_setservent_r="$undef"
d_endservent_r="$undef"
+ d_gethostbyname_r="$undef"
+ d_gethostbyaddr2_r="$undef"
+ d_gethostbyaddr_r="$undef"
+ d_sethostent_r="$undef"
+ d_gethostent_r="$undef"
+ d_endhostent_r="$undef"
d_getprotoent_r_proto="0"
d_getprotobyname_r_proto="0"
d_getprotobynumber_r_proto="0"
d_getservbyport_r_proto="0"
d_setservent_r_proto="0"
d_endservent_r_proto="0"
+ d_gethostbyname_r_proto="0"
+ d_gethostbyaddr2_r_proto="0"
+ d_gethostbyaddr_r_proto="0"
+ d_sethostent_r_proto="0"
+ d_endhostent_r_proto="0"
+ d_gethostent_r_proto="0"
;;
esac
# ./Configure -des -Dopenbsd_distribution=defined
#
-# OpenBSD has a better malloc than perl...
-test "$usemymalloc" || usemymalloc='n'
+# In OpenBSD > 3.7, use perl's malloc [perl #75742]
+case "$osvers" in
+3.[89]*|[4-9]*)
+ test "$usemymalloc" || usemymalloc=y
+ ;;
+esac
# malloc wrap works
case "$usemallocwrap" in
;;
esac
-# Special per-arch specific ccflags
-case "${ARCH}-${osvers}" in
- vax-*)
- ccflags="-DUSE_PERL_ATOF=0 $ccflags"
- ;;
-esac
-
# This script UU/usethreads.cbu will get 'called-back' by Configure
# after it has prompted the user for whether to use threads.
cat > UU/usethreads.cbu <<'EOCBU'
siteprefix='/usr/local'
siteprefixexp='/usr/local'
# Ports installs non-std libs in /usr/local/lib so look there too
- locincpth=''
- loclibpth=''
+ locincpth='/usr/local/include'
+ loclibpth='/usr/local/lib'
# Link perl with shared libperl
- if [ "$usedl" = "$define" -a -r $src/shlib_version ]; then
+ if [ "$usedl" = "$define" -a -r shlib_version ]; then
useshrplib=true
- libperl=`. $src/shlib_version; echo libperl.so.${major}.${minor}`
+ libperl=`. ./shlib_version; echo libperl.so.${major}.${minor}`
fi
-
- # Don't support DBM not in base
- i_gdbm='undef'
;;
esac
}
# Exclude nonxs extensions that are not architecture dependent
-my @nonxs = grep(!/^(Errno|IO\/Compress)$/, split(' ', $Config{'nonxs_ext'}));
+my @nonxs = grep(!/^Errno$/, split(' ', $Config{'nonxs_ext'}));
my @ext_dirs = qw(cpan dist ext);
foreach my $ext_dir (@ext_dirs) {
my $installarchlib = "$opts{destdir}$Config{installarchlib}";
my $installsitelib = "$opts{destdir}$Config{installsitelib}";
my $installsitearch = "$opts{destdir}$Config{installsitearch}";
-my $installman1dir = "none";
+my $installman1dir = "$opts{destdir}$Config{installman1dir}";
my $man1ext = $Config{man1ext};
my $libperl = $Config{libperl};
# Shared library and dynamic loading suffixes.
}
}
-#-f 't/rantests' || $Is_W32
-# || warn "WARNING: You've never run 'make test' or",
-# " some tests failed! (Installing anyway.)\n";
+-f 't/rantests' || $Is_W32
+ || warn "WARNING: You've never run 'make test' or",
+ " some tests failed! (Installing anyway.)\n";
} #if (!$Is_NetWare)
# This will be used to store the packlist
if ($Is_Cygwin) {
$perldll = $libperl;
} else {
- $perldll = 'perl5'.$Config{patchlevel}.'.'.$dlext;
+ $perldll = 'perl5'.$Config{patchlevel}.'.'.$so;
}
if ($dlsrc ne "dl_none.xs") {
$packlist->{"$Config{installbin}/$perldll"} = { type => 'file' };
} # if (($Is_W32 and ! $Is_NetWare) or $Is_Cygwin)
-# Get the install command and flags from the environment
-my @installcmd = $ENV{"INSTALL"} || "install";
-push(@installcmd, $ENV{"INSTALL_COPY"} || "-c");
-
# First we install the version-numbered executables.
if ($Is_VMS) {
}
elsif ($^O ne 'dos') {
if (!$Is_NetWare) {
- install("perl$exe_ext", "$installbin/$perl_verbase$ver$exe_ext", "0755");
+ safe_unlink("$installbin/$perl_verbase$ver$exe_ext");
+ copy("perl$exe_ext", "$installbin/$perl_verbase$ver$exe_ext");
+ strip("$installbin/$perl_verbase$ver$exe_ext");
+ chmod(0755, "$installbin/$perl_verbase$ver$exe_ext");
}
else {
# If installing onto a NetWare server
)
} else {
# [als] hard-coded 'libperl' name... not good!
- #@corefiles = <*.h libperl*.* perl*$Config{lib_ext}>;
- @corefiles = <*.h *.inc perl*$Config{lib_ext}>;
- push(@corefiles,<libperl*.*>) unless defined($ENV{"NOLIBINSTALL"});
+ @corefiles = <*.h libperl*.* perl*$Config{lib_ext}>;
# AIX needs perl.exp installed as well.
push(@corefiles,'perl.exp') if $^O eq 'aix';
$packlist->{$xto} = { type => 'file' };
}
-sub install {
- my($from,$to,$mode) = @_;
-
- my $xto = $to;
- my $cmd = join(' ', @installcmd);
- $cmd .= " -m $mode" if $mode;
- $cmd .= " -s" if $opts{strip};
- $cmd .= " $from $to";
- $xto =~ s/^\Q$opts{destdir}\E// if $opts{destdir};
- print $opts{verbose} ? " install $from $xto\n" : " $xto\n" unless $opts{silent};
- system($cmd);
- warn "Couldn't $cmd\n" if $?;
- $packlist->{$xto} = { type => 'file' };
-}
-
sub installlib {
my $dir = $File::Find::dir;
$dir =~ s!\Alib/?!!;
return unless $do_installprivlib;
}
- if ($name eq 'Config_heavy.pl') {
- open my $ifh, '<', $_ or die $!;
- $_ = "$_.orig";
- open my $ofh, '>', $_ or die $!;
- while (my $l = <$ifh>) {
- $l =~ s,^(ccflags|cppflags)[^=]*='[^']+,$& -I/usr/local/include,;
- $l =~ s,^(ldflags|lddlflags)[^=]*='[^']+,$& -L/usr/local/lib,;
- print $ofh $l;
- }
- close $ifh;
- close $ofh;
- }
-
if ($Is_NetWare && !$opts{netware} && /\.(?:nlp|nlm|bs)$/) {
# Don't copy .nlp,.nlm files, doesn't make sense on Windows and also
# if copied will give problems when building new extensions.
AnyDBM_File - provide framework for multiple DBMs
+NDBM_File, DB_File, GDBM_File, SDBM_File, ODBM_File - various DBM implementations
+
=head1 SYNOPSIS
use AnyDBM_File;
}
# So we expect to find it in @INC
- ok (exists $orig_inc{$_}, "Expect $lib '$_' to be in \@INC")
- or $failed++ for split ':', $dir;
+ ok (exists $orig_inc{$dir}, "Expect $lib '$dir' to be in \@INC")
+ or $failed++;
}
}
_diag ('@INC is:', @orig_inc) if $failed;
=head1 NAME
-Getopt::Std, getopt, getopts - Process single-character switches with switch clustering
+getopt, getopts - Process single-character switches with switch clustering
=head1 SYNOPSIS
@INC = '../lib';
unshift @INC, '.';
require Config; import Config;
- if (!$Config{d_setlocale} || $Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/) {
+ if (!$Config{d_setlocale} || $Config{ccflags} =~ /\bD?NO_LOCALE\b/) {
print "1..0\n";
exit;
}
Perl_my_cxt_index
);
}
+if ($define{'NO_MATHOMS'}) {
+ ++$skip{$_} foreach qw(
+ ASCII_TO_NEED
+ NATIVE_TO_NEED
+ Perl_custom_op_desc
+ Perl_custom_op_name
+ Perl_do_aexec
+ Perl_do_binmode
+ Perl_do_open
+ Perl_do_open9
+ Perl_fprintf_nocontext
+ Perl_gv_AVadd
+ Perl_gv_HVadd
+ Perl_gv_IOadd
+ Perl_gv_SVadd
+ Perl_gv_efullname
+ Perl_gv_efullname3
+ Perl_gv_fetchmethod
+ Perl_gv_fullname
+ Perl_gv_fullname3
+ Perl_hv_delete
+ Perl_hv_delete_ent
+ Perl_hv_exists
+ Perl_hv_exists_ent
+ Perl_hv_fetch
+ Perl_hv_fetch_ent
+ Perl_hv_iternext
+ Perl_hv_magic
+ Perl_hv_store
+ Perl_hv_store_ent
+ Perl_hv_store_flags
+ Perl_init_i18nl14n
+ Perl_isALNUM_lazy
+ Perl_isIDFIRST_lazy
+ Perl_is_uni_alnum
+ Perl_is_uni_alnum_lc
+ Perl_is_uni_alnumc
+ Perl_is_uni_alnumc_lc
+ Perl_is_uni_alpha
+ Perl_is_uni_alpha_lc
+ Perl_is_uni_ascii
+ Perl_is_uni_ascii_lc
+ Perl_is_uni_blank
+ Perl_is_uni_blank_lc
+ Perl_is_uni_cntrl
+ Perl_is_uni_cntrl_lc
+ Perl_is_uni_digit
+ Perl_is_uni_digit_lc
+ Perl_is_uni_graph
+ Perl_is_uni_graph_lc
+ Perl_is_uni_idfirst
+ Perl_is_uni_idfirst_lc
+ Perl_is_uni_lower
+ Perl_is_uni_lower_lc
+ Perl_is_uni_print
+ Perl_is_uni_print_lc
+ Perl_is_uni_punct
+ Perl_is_uni_punct_lc
+ Perl_is_uni_space
+ Perl_is_uni_space_lc
+ Perl_is_uni_upper
+ Perl_is_uni_upper_lc
+ Perl_is_uni_xdigit
+ Perl_is_uni_xdigit_lc
+ Perl_is_utf8_alnum
+ Perl_is_utf8_alnumc
+ Perl_is_utf8_alpha
+ Perl_is_utf8_ascii
+ Perl_is_utf8_blank
+ Perl_is_utf8_char
+ Perl_is_utf8_cntrl
+ Perl_is_utf8_digit
+ Perl_is_utf8_graph
+ Perl_is_utf8_idcont
+ Perl_is_utf8_idfirst
+ Perl_is_utf8_lower
+ Perl_is_utf8_mark
+ Perl_is_utf8_perl_space
+ Perl_is_utf8_perl_word
+ Perl_is_utf8_posix_digit
+ Perl_is_utf8_print
+ Perl_is_utf8_punct
+ Perl_is_utf8_space
+ Perl_is_utf8_string_loc
+ Perl_is_utf8_upper
+ Perl_is_utf8_xdigit
+ Perl_is_utf8_xidcont
+ Perl_is_utf8_xidfirst
+ Perl_my_lstat
+ Perl_my_stat
+ Perl_newAV
+ Perl_newHV
+ Perl_newIO
+ Perl_newSUB
+ Perl_pack_cat
+ Perl_printf_nocontext
+ Perl_ref
+ Perl_save_freeop
+ Perl_save_freepv
+ Perl_save_freesv
+ Perl_save_iv
+ Perl_save_list
+ Perl_save_long
+ Perl_save_mortalizesv
+ Perl_save_nogv
+ Perl_save_op
+ Perl_save_re_context
+ Perl_sv_2iv
+ Perl_sv_2pv
+ Perl_sv_2pv_nolen
+ Perl_sv_2pvbyte_nolen
+ Perl_sv_2pvutf8_nolen
+ Perl_sv_2uv
+ Perl_sv_catpvn
+ Perl_sv_catpvn_mg
+ Perl_sv_catsv
+ Perl_sv_catsv_mg
+ Perl_sv_force_normal
+ Perl_sv_insert
+ Perl_sv_iv
+ Perl_sv_mortalcopy
+ Perl_sv_nolocking
+ Perl_sv_nounlocking
+ Perl_sv_nv
+ Perl_sv_pv
+ Perl_sv_pvbyte
+ Perl_sv_pvbyten
+ Perl_sv_pvn
+ Perl_sv_pvn_force
+ Perl_sv_pvn_nomg
+ Perl_sv_pvutf8
+ Perl_sv_pvutf8n
+ Perl_sv_setsv
+ Perl_sv_taint
+ Perl_sv_unref
+ Perl_sv_usepvn
+ Perl_sv_usepvn_mg
+ Perl_sv_utf8_upgrade
+ Perl_sv_uv
+ Perl_to_uni_lower_lc
+ Perl_to_uni_title_lc
+ Perl_to_uni_upper_lc
+ Perl_to_utf8_fold
+ Perl_to_utf8_lower
+ Perl_to_utf8_title
+ Perl_to_utf8_upper
+ Perl_unpack_str
+ Perl_utf8_to_uvchr
+ Perl_utf8_to_uvuni
+ Perl_valid_utf8_to_uvuni
+ );
+}
unless ($define{'PERL_NEED_APPCTX'}) {
++$skip{PL_appctx};
PERL_UNUSED_ARG(mg);
#endif
- TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
+ TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1) && IN_PERL_RUNTIME);
return 0;
}
/* for s/// and tr///, last element in list is the replacement; pop it */
- if (is_trans || o->op_type == OP_SUBST) {
+ /* If we have a syntax error causing tokens to be popped and the parser
+ to see PMFUNC '(' expr ')' with no commas in it; e.g., s/${<>{})//,
+ then expr will not be of type OP_LIST, there being no repl. */
+ if ((is_trans || o->op_type == OP_SUBST) && expr->op_type == OP_LIST) {
OP* kid;
repl = cLISTOPx(expr)->op_last;
kid = cLISTOPx(expr)->op_first;
* were wrong (e.g. /[(?{}]/ ). Throw away the PL_compcv
* that isn't required now. Note that we have to be pretty
* confident that nothing used that CV's pad while the
- * regex was parsed */
- assert(AvFILLp(PL_comppad) == 0); /* just @_ */
+ * regex was parsed, except maybe op targets for \Q etc.
+ * If there were any op targets, though, they should have
+ * been stolen by constant folding.
+ */
+#ifdef DEBUGGING
+ PADOFFSET i = 0;
+ assert(PadnamelistMAXNAMED(PL_comppad_name) == 0);
+ while (++i <= AvFILLp(PL_comppad)) {
+ assert(!PL_curpad[i]);
+ }
+#endif
/* But we know that one op is using this CV's slab. */
cv_forget_slab(PL_compcv);
LEAVE_SCOPE(floor);
*/
SvREFCNT_inc_simple_void(PL_compcv);
+ CvLVALUE_on(PL_compcv);
/* these lines are just an unrolled newANONATTRSUB */
expr = newSVOP(OP_ANONCODE, 0,
MUTABLE_SV(newATTRSUB(floor, 0, NULL, NULL, expr)));
STATIC void
S_null_listop_in_list_context(pTHX_ OP *o)
{
- OP *kid;
-
PERL_ARGS_ASSERT_NULL_LISTOP_IN_LIST_CONTEXT;
/* This is an OP_LIST in list context. That means we
* can ditch the OP_LIST and the OP_PUSHMARK within. */
- kid = cLISTOPo->op_first;
- /* Find the end of the chain of OPs executed within the OP_LIST. */
- while (kid->op_next != o)
- kid = kid->op_next;
-
- kid->op_next = o->op_next; /* patch list out of exec chain */
op_null(cUNOPo->op_first); /* NULL the pushmark */
op_null(o); /* NULL the list */
}
* altering the basic op_first/op_sibling layout. */
kid = kLISTOP->op_first;
assert(
- (kid->op_type == OP_NULL && kid->op_targ == OP_NEXTSTATE)
+ (kid->op_type == OP_NULL
+ && ( kid->op_targ == OP_NEXTSTATE
+ || kid->op_targ == OP_DBSTATE ))
|| kid->op_type == OP_STUB
|| kid->op_type == OP_ENTER);
nullop->op_next = kLISTOP->op_next;
XOPe_xop_name = XOPf_xop_name,
XOPe_xop_desc = XOPf_xop_desc,
XOPe_xop_class = XOPf_xop_class,
- XOPe_xop_peep = XOPf_xop_peep,
+ XOPe_xop_peep = XOPf_xop_peep
} xop_flags_enum;
#define XOPd_xop_name PL_op_name[OP_CUSTOM]
#define PERL_REVISION 5 /* age */
#define PERL_VERSION 20 /* epoch */
-#define PERL_SUBVERSION 1 /* generation */
+#define PERL_SUBVERSION 2 /* generation */
/* The following numbers describe the earliest compatible version of
Perl ("compatibility" here being defined as sufficient binary/API
static const char * const local_patches[] = {
NULL
#ifdef PERL_GIT_UNCOMMITTED_CHANGES
- ,"CVE-2014-4330"
,"uncommitted-changes"
#endif
PERL_GIT_UNPUSHED_COMMITS /* do not remove this line */
/*
=for apidoc p||eval_pv
-Tells Perl to C<eval> the given string and return an SV* result.
+Tells Perl to C<eval> the given string in scalar context and return an SV* result.
=cut
*/
#endif
PerlIO_printf(PIO_stdout,
- "\n\nCopyright 1987-2014, Larry Wall\n");
+ "\n\nCopyright 1987-2015, Larry Wall\n");
#ifdef MSDOS
PerlIO_printf(PIO_stdout,
"\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
# endif
#endif
+/* EVC 4 SDK headers includes a bad definition of MB_CUR_MAX in stdlib.h
+ which is included from stdarg.h. Bad definition not present in SD 2008
+ SDK headers. wince.h is not yet included, so we cant fix this from there
+ since by then MB_CUR_MAX will be defined from stdlib.h.
+ cewchar.h includes a correct definition of MB_CUR_MAX and it is copied here
+ since cewchar.h can't be included this early */
+#if defined(UNDER_CE) && (_MSC_VER < 1300)
+# define MB_CUR_MAX 1
+#endif
#ifdef I_STDARG
# include <stdarg.h>
#else
# define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */
#endif
-/* In Tru64 use the 4.4BSD struct msghdr, not the 4.3 one.
- * This is important for using IPv6.
- * For OSF/1 3.2, however, defining _SOCKADDR_LEN would be
- * a bad idea since it breaks send() and recv(). */
-#if defined(__osf__) && defined(__alpha) && !defined(_SOCKADDR_LEN) && !defined(DEC_OSF1_3_X)
-# define _SOCKADDR_LEN
-#endif
-
#if defined(HAS_SOCKET) && !defined(WIN32) /* WIN32 handles sockets via win32.h */
# include <sys/socket.h>
# if defined(USE_SOCKS) && defined(I_SOCKS)
# include <ieeefp.h>
#endif
+#ifdef USING_MSVC6
+/* VC6 has broken NaN semantics: NaN == NaN returns true instead of false,
+ * and for example NaN < IV_MIN. */
+# define NAN_COMPARE_BROKEN
+#endif
+#if defined(__DECC) && defined(__osf__)
+/* Also Tru64 cc has broken NaN comparisons. */
+# define NAN_COMPARE_BROKEN
+#endif
+
#ifdef USE_LONG_DOUBLE
# ifdef I_SUNMATH
# include <sunmath.h>
* This symbol contains the ~name expanded version of PRIVLIB, to be used
* in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define PRIVLIB "/sys/lib/perl/5.20.1" /**/
-#define PRIVLIB_EXP "/sys/lib/perl/5.20.1" /**/
+#define PRIVLIB "/sys/lib/perl/5.20.2" /**/
+#define PRIVLIB_EXP "/sys/lib/perl/5.20.2" /**/
/* PTRSIZE:
* This symbol contains the size of a pointer, so that the C preprocessor
* removed. The elements in inc_version_list (inc_version_list.U) can
* be tacked onto this variable to generate a list of directories to search.
*/
-#define SITELIB "/sys/lib/perl/5.20.1/site_perl" /**/
-#define SITELIB_EXP "/sys/lib/perl/5.20.1/site_perl" /**/
-#define SITELIB_STEM "/sys/lib/perl/5.20.1/site_perl" /**/
+#define SITELIB "/sys/lib/perl/5.20.2/site_perl" /**/
+#define SITELIB_EXP "/sys/lib/perl/5.20.2/site_perl" /**/
+#define SITELIB_STEM "/sys/lib/perl/5.20.2/site_perl" /**/
/* Size_t_size:
* This symbol holds the size of a Size_t in bytes.
api_revision='5'
api_subversion='0'
api_version='20'
-api_versionstring='5.20.1'
+api_versionstring='5.20.2'
ar='ar'
-archlib='/sys/lib/perl5/5.20.1/386'
-archlibexp='/sys/lib/perl5/5.20.1/386'
+archlib='/sys/lib/perl5/5.20.2/386'
+archlibexp='/sys/lib/perl5/5.20.2/386'
archname64=''
archname='386'
archobjs=''
d_isnan='undef'
d_isnanl='undef'
d_killpg='undef'
-d_lc_monetary_2008='undef'
d_lchown='undef'
d_ldbl_dig='define'
d_libm_lib_version='0'
inc_version_list_init='0'
incpath=''
inews=''
-installarchlib='/sys/lib/perl/5.20.1/386'
+installarchlib='/sys/lib/perl/5.20.2/386'
installbin='/usr/bin'
installman1dir='/sys/man/1pub'
installman3dir='/sys/man/2pub'
installprefix='/usr'
installprefixexp='/usr'
-installprivlib='/sys/lib/perl/5.20.1'
+installprivlib='/sys/lib/perl/5.20.2'
installscript='/usr/bin'
-installsitearch='/sys/lib/perl/5.20.1/site_perl/386'
+installsitearch='/sys/lib/perl/5.20.2/site_perl/386'
installsitebin='/usr/bin'
-installsitelib='/sys/lib/perl/5.20.1/site_perl'
+installsitelib='/sys/lib/perl/5.20.2/site_perl'
installstyle='lib/perl5'
installusrbinperl='undef'
installvendorarch=''
pr=''
prefix='/usr'
prefixexp='/usr'
-privlib='/sys/lib/perl/5.20.1'
-privlibexp='/sys/lib/perl/5.20.1'
+privlib='/sys/lib/perl/5.20.2'
+privlibexp='/sys/lib/perl/5.20.2'
procselfexe=''
prototype='define'
ptrsize='4'
sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0'
sig_size='50'
signal_t='void'
-sitearch='/sys/lib/perl/5.20.1/site_perl/386'
+sitearch='/sys/lib/perl/5.20.2/site_perl/386'
sitearchexp='/sys/lib/perl/site_perl/386'
sitebin='/usr/bin'
sitebinexp='/usr/bin'
-sitelib='/sys/lib/perl/5.20.1/site_perl'
-sitelib_stem='/sys/lib/perl/5.20.1/site_perl'
-sitelibexp='/sys/lib/perl/5.20.1/site_perl'
+sitelib='/sys/lib/perl/5.20.2/site_perl'
+sitelib_stem='/sys/lib/perl/5.20.2/site_perl'
+sitelibexp='/sys/lib/perl/5.20.2/site_perl'
siteprefix='/usr'
siteprefixexp='/usr'
sizesize='4'
strerror_r_proto='0'
strings='/sys/include/ape/string.h'
submit=''
-subversion='1'
+subversion='2'
sysman='/sys/man/1pub'
tail=''
tar=''
vendorlibexp=''
vendorprefix=''
vendorprefixexp=''
-version='5.20.1'
-version_patchlevel_string='version 20 subversion 1'
+version='5.20.2'
+version_patchlevel_string='version 20 subversion 2'
versiononly='undef'
vi=''
xlibpth=''
config_argc=0
PERL_REVISION=5
PERL_VERSION=20
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
PERL_API_REVISION=5
PERL_API_VERSION=20
PERL_API_SUBVERSION=0
podnames = perl perlbook perldata perldebtut perldiag perldsc perlform perlfunc perlipc perllexwarn perllol perlmod perlmodlib perlmodinstall perlnewmod perlop perlootut perlopentut perlpacktut perlpod perlport perlrequick perlretut perlref perlreftut perlrequick perlrun perlsec perlstyle perlsub perlsyn perltie perltrap perlutil perlunifaq perluniintro perlvar
faqpodnames = perlfaq perlfaq1 perlfaq2 perlfaq3 perlfaq4 perlfaq5 perlfaq6 perlfaq7 perlfaq8 perlfaq9
-advpodnames = perlapi perlapio perlcall perlclib perlcompile perldebguts perldbmfilter perldebug perldelta perldiag perlebcdic perlembed perlfilter perlfork perlguts perlhack perlintern perliol perllocale perlnumber perlobj perlpodspec perlre perlthrtut perltodo perlunicode perlxs perlxs perlxstut
+advpodnames = perlapi perlapio perlcall perlclib perlcompile perldebguts perldbmfilter perldebug perldelta perldiag perlebcdic perlembed perlfilter perlfork perlguts perlhack perlintern perliol perllocale perlnumber perlobj perlpodspec perlre perlthrtut perltodo perlunicode perlunicook perlxs perlxs perlxstut
archpodnames = perlaix perlamiga perlbeos perlbs2000 perlce perlcygwin perldgux perldos perlfreebsd perlhpux perlhurd perlirix perlmacos perlmpeix perlnetware perlos2 perlos390 perlos400 perlplan9 perlqnx perlsolaris perltru64 perlvms perlvos perlwin32
histpods = perl5004delta perl5005delta perl561delta perl56delta perl570delta perl571delta perl572delta perl573delta perl58delta perlhist
# This section is parsed by Porting/pod_lib.pl for use by pod/buildtoc etc
-flag =g perlmodlib perlapi perlintern
+flag =g perluniprops perlmodlib perlapi perlintern
flag =go perltoc
flag =ro perlcn perljp perlko perltw
flag = perlvms
perllocale Perl locale support
perluniintro Perl Unicode introduction
perlunicode Perl Unicode support
+ perlunicook Perl Unicode cookbook
perlunifaq Perl Unicode FAQ
perluniprops Index of Unicode properties in Perl
perlunitut Perl Unicode tutorial
perlhist Perl history records
perldelta Perl changes since previous version
+ perl5201delta Perl changes in version 5.20.1
perl5200delta Perl changes in version 5.20.0
+ perl5184delta Perl changes in version 5.18.4
perl5182delta Perl changes in version 5.18.2
perl5181delta Perl changes in version 5.18.1
perl5180delta Perl changes in version 5.18.0
- perl5161delta Perl changes in version 5.16.1
- perl5162delta Perl changes in version 5.16.2
perl5163delta Perl changes in version 5.16.3
+ perl5162delta Perl changes in version 5.16.2
+ perl5161delta Perl changes in version 5.16.1
perl5160delta Perl changes in version 5.16.0
perl5144delta Perl changes in version 5.14.4
perl5143delta Perl changes in version 5.14.3
=head1 NAME
-perldelta - what is new for perl v5.20.1
+perldelta - what is new for perl v5.20.2
=head1 DESCRIPTION
-This document describes differences between the 5.20.0 release and the 5.20.1
+This document describes differences between the 5.20.1 release and the 5.20.2
release.
-If you are upgrading from an earlier release such as 5.18.0, first read
-L<perl5200delta>, which describes differences between 5.18.0 and 5.20.0.
+If you are upgrading from an earlier release such as 5.20.0, first read
+L<perl5201delta>, which describes differences between 5.20.0 and 5.20.1.
=head1 Incompatible Changes
-There are no changes intentionally incompatible with 5.20.0. If any exist,
+There are no changes intentionally incompatible with 5.20.1. If any exist,
they are bugs, and we request that you submit a report. See L</Reporting Bugs>
below.
-=head1 Performance Enhancements
-
-=over 4
+=head1 Modules and Pragmata
-=item *
+=head2 Updated Modules and Pragmata
-An optimization to avoid problems with COW and deliberately overallocated PVs
-has been disabled because it interfered with another, more important,
-optimization, causing a slowdown on some platforms.
-L<[perl #121975]|https://rt.perl.org/Ticket/Display.html?id=121975>
+=over 4
=item *
-Returning a string from a lexical variable could be slow in some cases. This
-has now been fixed.
-L<[perl #121977]|https://rt.perl.org/Ticket/Display.html?id=121977>
+L<attributes> has been upgraded from version 0.22 to 0.23.
-=back
-
-=head1 Modules and Pragmata
-
-=head2 Updated Modules and Pragmata
-
-=over 4
+The usage of C<memEQs> in the XS has been corrected.
+L<[perl #122701]|https://rt.perl.org/Ticket/Display.html?id=122701>
=item *
-L<Config::Perl::V> has been upgraded from version 0.20 to 0.22.
+L<Data::Dumper> has been upgraded from version 2.151 to 2.151_01.
-The list of Perl versions covered has been updated and some flaws in the
-parsing have been fixed.
+Fixes CVE-2014-4330 by adding a configuration variable/option to limit
+recursion when dumping deep data structures.
=item *
-L<Exporter> has been upgraded from version 5.70 to 5.71.
+L<Errno> has been upgraded from version 1.20_03 to 1.20_05.
-Illegal POD syntax in the documentation has been corrected.
+Warnings when building the XS on Windows with the Visual C++ compiler are now
+avoided.
=item *
-L<ExtUtils::CBuilder> has been upgraded from version 0.280216 to 0.280217.
+L<feature> has been upgraded from version 1.36 to 1.36_01.
-Android builds now link to both B<-lperl> and C<$Config::Config{perllibs}>.
+The C<postderef> feature has now been documented. This feature was actually
+added in Perl 5.20.0 but was accidentally omitted from the feature
+documentation until now.
=item *
-L<File::Copy> has been upgraded from version 2.29 to 2.30.
+L<IO::Socket> has been upgraded from version 1.37 to 1.38.
-The documentation now notes that C<copy> will not overwrite read-only files.
+Document the limitations of the connected() method.
+L<[perl #123096]|https://rt.perl.org/Ticket/Display.html?id=123096>
=item *
-L<Module::CoreList> has been upgraded from version 3.11 to 5.020001.
+L<Module::CoreList> has been upgraded from version 5.020001 to 5.20150214.
The list of Perl versions covered has been updated.
=item *
-The PathTools module collection has been upgraded from version 3.47 to 3.48.
+PathTools has been upgraded from version 3.48 to 3.48_01.
-Fallbacks are now in place when cross-compiling for Android and
-C<$Config::Config{sh}> is not yet defined.
-L<[perl #121963]|https://rt.perl.org/Ticket/Display.html?id=121963>
+A warning from the B<gcc> compiler is now avoided when building the XS.
=item *
-L<PerlIO::via> has been upgraded from version 0.14 to 0.15.
+L<PerlIO::scalar> has been upgraded from version 0.18 to 0.18_01.
+
+Reading from a position well past the end of the scalar now correctly returns
+end of file.
+L<[perl #123443]|https://rt.perl.org/Ticket/Display.html?id=123443>
+
+Seeking to a negative position still fails, but no longer leaves the file
+position set to a negation location.
-A minor portability improvement has been made to the XS implementation.
+C<eof()> on a C<PerlIO::scalar> handle now properly returns true when the file
+position is past the 2GB mark on 32-bit systems.
=item *
-L<Unicode::UCD> has been upgraded from version 0.57 to 0.58.
+L<Storable> has been upgraded from version 2.49 to 2.49_01.
-The documentation includes many clarifications and fixes.
+Minor grammatical change to the documentation only.
=item *
-L<utf8> has been upgraded from version 1.13 to 1.13_01.
+L<VMS::DCLsym> has been upgraded from version 1.05 to 1.05_01.
-The documentation has some minor formatting improvements.
+Minor formatting change to the documentation only.
=item *
-L<version> has been upgraded from version 0.9908 to 0.9909.
+L<VMS::Stdio> has been upgraded from version 2.4 to 2.41.
-External libraries and Perl may have different ideas of what the locale is.
-This is problematic when parsing version strings if the locale's numeric
-separator has been changed. Version parsing has been patched to ensure it
-handles the locales correctly.
-L<[perl #121930]|https://rt.perl.org/Ticket/Display.html?id=121930>
+Minor formatting change to the documentation only.
=back
=head1 Documentation
+=head2 New Documentation
+
+=head3 L<perlunicook>
+
+This document, by Tom Christiansen, provides examples of handling Unicode in
+Perl.
+
=head2 Changes to Existing Documentation
-=head3 L<perlapi>
+=head3 L<perlexperiment>
=over 4
=item *
-C<av_len> - Emphasize that this returns the highest index in the array, not the
-size of the array.
-L<[perl #120386]|https://rt.perl.org/Ticket/Display.html?id=120386>
+Added reference to subroutine signatures. This feature was actually added in
+Perl 5.20.0 but was accidentally omitted from the experimental feature
+documentation until now.
-=item *
-
-Note that C<SvSetSV> doesn't do set magic.
+=back
-=item *
+=head3 L<perlpolicy>
-C<sv_usepvn_flags> - Fix documentation to mention the use of C<NewX> instead of
-C<malloc>.
-L<[perl #121869]|https://rt.perl.org/Ticket/Display.html?id=121869>
+=over 4
=item *
-Clarify where C<NUL> may be embedded or is required to terminate a string.
+The process whereby features may graduate from experimental status has now been
+formally documented.
=back
-=head3 L<perlfunc>
+=head3 L<perlsyn>
=over 4
=item *
-Clarify the meaning of C<-B> and C<-T>.
+An ambiguity in the documentation of the ellipsis statement has been corrected.
+L<[perl #122661]|https://rt.perl.org/Ticket/Display.html?id=122661>
-=item *
+=back
-C<-l> now notes that it will return false if symlinks aren't supported by the
-file system.
-L<[perl #121523]|https://rt.perl.org/Ticket/Display.html?id=121523>
+=head1 Diagnostics
-=item *
+The following additions or changes have been made to diagnostic output,
+including warnings and fatal error messages. For the complete list of
+diagnostic messages, see L<perldiag>.
-Note that C<each>, C<keys> and C<values> may produce different orderings for
-tied hashes compared to other perl hashes.
-L<[perl #121404]|https://rt.perl.org/Ticket/Display.html?id=121404>
+=head2 Changes to Existing Diagnostics
+
+=over 4
=item *
-Note that C<exec LIST> and C<system LIST> may fall back to the shell on Win32.
-Only C<exec PROGRAM LIST> and C<system PROGRAM LIST> indirect object syntax
-will reliably avoid using the shell. This has also been noted in L<perlport>.
-L<[perl #122046]|https://rt.perl.org/Ticket/Display.html?id=122046>
+L<Bad symbol for scalar|perldiag/"Bad symbol for scalar"> is now documented.
+This error is not new, but was not previously documented here.
=item *
-Clarify the meaning of C<our>.
-L<[perl #122132]|https://rt.perl.org/Ticket/Display.html?id=122132>
+L<Missing right brace on \N{}|perldiag/"Missing right brace on \N{}"> is now
+documented. This error is not new, but was not previously documented here.
=back
-=head3 L<perlguts>
+=head1 Testing
=over 4
=item *
-Explain various ways of modifying an existing SV's buffer.
-L<[perl #116925]|https://rt.perl.org/Ticket/Display.html?id=116925>
+The test script F<re/rt122747.t> has been added to verify that
+L<perl #122747|https://rt.perl.org/Ticket/Display.html?id=122747> remains
+fixed.
=back
-=head3 L<perlpolicy>
-
-=over 4
-
-=item *
+=head1 Platform Support
-We now have a code of conduct for the I<< p5p >> mailing list, as documented in
-L<< perlpolicy/STANDARDS OF CONDUCT >>.
+=head2 Regained Platforms
-=back
+IRIX and Tru64 platforms are working again. (Some C<make test> failures
+remain.)
-=head3 L<perlre>
+=head1 Selected Bug Fixes
=over 4
=item *
-The C</x> modifier has been clarified to note that comments cannot be continued
-onto the next line by escaping them.
-
-=back
+AIX now sets the length in C<< getsockopt >> correctly.
+L<[perl #120835]|https://rt.perl.org/Ticket/Display.html?id=120835>,
+L<[cpan #91183]|https://rt.cpan.org/Ticket/Display.html?id=91183>,
+L<[cpan #85570]|https://rt.cpan.org/Ticket/Display.html?id=85570>
-=head3 L<perlsyn>
+=item *
-=over 4
+In Perl 5.20.0, C<$^N> accidentally had the internal UTF8 flag turned off if
+accessed from a code block within a regular expression, effectively
+UTF8-encoding the value. This has been fixed.
+L<[perl #123135]|https://rt.perl.org/Ticket/Display.html?id=123135>
=item *
-Mention the use of empty conditionals in C<for>/C<while> loops for infinite
-loops.
+Various cases where the name of a sub is used (autoload, overloading, error
+messages) used to crash for lexical subs, but have been fixed.
-=back
-
-=head3 L<perlxs>
+=item *
-=over 4
+An assertion failure when parsing C<sort> with debugging enabled has been
+fixed.
+L<[perl #122771]|https://rt.perl.org/Ticket/Display.html?id=122771>
=item *
-Added a discussion of locale issues in XS code.
+Loading UTF8 tables during a regular expression match could cause assertion
+failures under debugging builds if the previous match used the very same
+regular expression.
+L<[perl #122747]|https://rt.perl.org/Ticket/Display.html?id=122747>
-=back
+=item *
-=head1 Diagnostics
+Due to a mistake in the string-copying logic, copying the value of a state
+variable could instead steal the value and undefine the variable. This bug,
+introduced in Perl 5.20, would happen mostly for long strings (1250 chars or
+more), but could happen for any strings under builds with copy-on-write
+disabled.
+L<[perl #123029]|https://rt.perl.org/Ticket/Display.html?id=123029>
-The following additions or changes have been made to diagnostic output,
-including warnings and fatal error messages. For the complete list of
-diagnostic messages, see L<perldiag>.
-
-=head2 Changes to Existing Diagnostics
+=item *
-=over 4
+Fixed a bug that could cause perl to execute an infinite loop during
+compilation.
+L<[perl #122995]|https://rt.perl.org/Ticket/Display.html?id=122995>
=item *
-L<Variable length lookbehind not implemented in regex mE<sol>%sE<sol>|perldiag/"Variable length lookbehind not implemented in regex m/%s/">
+On Win32, restoring in a child pseudo-process a variable that was C<local()>ed
+in a parent pseudo-process before the C<fork> happened caused memory corruption
+and a crash in the child pseudo-process (and therefore OS process).
+L<[perl #40565]|https://rt.perl.org/Ticket/Display.html?id=40565>
-Information about Unicode behaviour has been added.
+=item *
-=back
+Tainted constants evaluated at compile time no longer cause unrelated
+statements to become tainted.
+L<[perl #122669]|https://rt.perl.org/Ticket/Display.html?id=122669>
-=head1 Configuration and Compilation
+=item *
-=over 4
+Calling C<write> on a format with a C<^**> field could produce a panic in
+sv_chop() if there were insufficient arguments or if the variable used to fill
+the field was empty.
+L<[perl #123245]|https://rt.perl.org/Ticket/Display.html?id=123245>
=item *
-Building Perl no longer writes to the source tree when configured with
-F<Configure>'s B<-Dmksymlinks> option.
-L<[perl #121585]|https://rt.perl.org/Ticket/Display.html?id=121585>
+In Perl 5.20.0, C<sort CORE::fake> where 'fake' is anything other than a
+keyword started chopping of the last 6 characters and treating the result as a
+sort sub name. The previous behaviour of treating "CORE::fake" as a sort sub
+name has been restored.
+L<[perl #123410]|https://rt.perl.org/Ticket/Display.html?id=123410>
-=back
+=item *
-=head1 Platform Support
+A bug in regular expression patterns that could lead to segfaults and other
+crashes has been fixed. This occurred only in patterns compiled with C<"/i">,
+while taking into account the current POSIX locale (this usually means they
+have to be compiled within the scope of C<S<"use locale">>), and there must be
+a string of at least 128 consecutive bytes to match.
+L<[perl #123539]|https://rt.perl.org/Ticket/Display.html?id=123539>
-=head2 Platform-Specific Notes
+=item *
-=over 4
+C<qr/@array(?{block})/> no longer dies with "Bizarre copy of ARRAY".
+L<[perl #123344]|https://rt.perl.org/Ticket/Display.html?id=123344>
-=item Android
+=item *
-Build support has been improved for cross-compiling in general and for Android
-in particular.
+C<gmtime> no longer crashes with not-a-number values.
+L<[perl #123495]|https://rt.perl.org/Ticket/Display.html?id=123495>
-=item OpenBSD
+=item *
-Corrected architectures and version numbers used in configuration hints when
-building Perl.
+Certain syntax errors in substitutions, such as C<< s/${<>{})// >>, would
+crash, and had done so since Perl 5.10. (In some cases the crash did not start
+happening until Perl 5.16.) The crash has, of course, been fixed.
+L<[perl #123542]|https://rt.perl.org/Ticket/Display.html?id=123542>
-=item Solaris
+=item *
-B<c99> options have been cleaned up, hints look for B<solstudio> as well as
-B<SUNWspro>, and support for native C<setenv> has been added.
+A memory leak in some regular expressions, introduced in Perl 5.20.1, has been
+fixed.
+L<[perl #123198]|https://rt.perl.org/Ticket/Display.html?id=123198>
-=item VMS
+=item *
-An old bug in feature checking, mainly affecting pre-7.3 systems, has been
+C<< formline("@...", "a"); >> would crash. The C<FF_CHECKNL> case in
+pp_formline() didn't set the pointer used to mark the chop position, which led
+to the C<FF_MORE> case crashing with a segmentation fault. This has been
fixed.
+L<[perl #123538]|https://rt.perl.org/Ticket/Display.html?id=123538>
+L<[perl #123622]|https://rt.perl.org/Ticket/Display.html?id=123622>
-=item Windows
+=item *
-C<%I64d> is now being used instead of C<%lld> for MinGW.
+A possible buffer overrun and crash when parsing a literal pattern during
+regular expression compilation has been fixed.
+L<[perl #123604]|https://rt.perl.org/Ticket/Display.html?id=123604>
=back
-=head1 Internal Changes
+=head1 Known Problems
=over 4
=item *
-Added L<perlapi/sync_locale>.
-Changing the program's locale should be avoided by XS code. Nevertheless,
-certain non-Perl libraries called from XS, such as C<Gtk> do so. When this
-happens, Perl needs to be told that the locale has changed. Use this function
-to do so, before returning to Perl.
+It is a known bug that lexical subroutines cannot be used as the C<SUBNAME>
+argument to C<sort>. This will be fixed in a future version of Perl.
=back
-=head1 Selected Bug Fixes
+=head1 Errata From Previous Releases
=over 4
=item *
-A bug has been fixed where zero-length assertions and code blocks inside of a
-regex could cause C<pos> to see an incorrect value.
-L<[perl #122460]|https://rt.perl.org/Ticket/Display.html?id=122460>
-
-=item *
-
-Using C<s///e> on tainted utf8 strings could issue bogus "Malformed UTF-8
-character (unexpected end of string)" warnings. This has now been fixed.
-L<[perl #122148]|https://rt.perl.org/Ticket/Display.html?id=122148>
-
-=item *
-
-C<system> and friends should now work properly on more Android builds.
-
-Due to an oversight, the value specified through B<-Dtargetsh> to F<Configure>
-would end up being ignored by some of the build process. This caused perls
-cross-compiled for Android to end up with defective versions of C<system>,
-C<exec> and backticks: the commands would end up looking for F</bin/sh> instead
-of F</system/bin/sh>, and so would fail for the vast majority of devices,
-leaving C<$!> as C<ENOENT>.
-
-=item *
-
-Many issues have been detected by L<Coverity|http://www.coverity.com/> and
-fixed.
+A regression has been fixed that was introduced in Perl 5.20.0 (fixed in Perl
+5.20.1 as well as here) in which a UTF-8 encoded regular expression pattern
+that contains a single ASCII lowercase letter does not match its uppercase
+counterpart.
+L<[perl #122655]|https://rt.perl.org/Ticket/Display.html?id=122655>
=back
=head1 Acknowledgements
-Perl 5.20.1 represents approximately 4 months of development since Perl 5.20.0
-and contains approximately 12,000 lines of changes across 170 files from 36
+Perl 5.20.2 represents approximately 5 months of development since Perl 5.20.1
+and contains approximately 6,300 lines of changes across 170 files from 34
authors.
Excluding auto-generated files, documentation and release tools, there were
-approximately 2,600 lines of changes to 110 .pm, .t, .c and .h files.
+approximately 1,900 lines of changes to 80 .pm, .t, .c and .h files.
Perl continues to flourish into its third decade thanks to a vibrant community
of users and developers. The following people are known to have contributed
-the improvements that became Perl 5.20.1:
-
-Aaron Crane, Abigail, Alberto Simões, Alexandr Ciornii, Alexandre (Midnite)
-Jousset, Andrew Fresh, Andy Dougherty, Brian Fraser, Chris 'BinGOs' Williams,
-Craig A. Berry, Daniel Dragan, David Golden, David Mitchell, H.Merijn Brand,
-James E Keenan, Jan Dubois, Jarkko Hietaniemi, John Peacock, kafka, Karen
-Etheridge, Karl Williamson, Lukas Mai, Matthew Horsfall, Michael Bunk, Peter
-Martini, Rafael Garcia-Suarez, Reini Urban, Ricardo Signes, Shirakata Kentaro,
-Smylers, Steve Hay, Thomas Sibley, Todd Rinaldo, Tony Cook, Vladimir Marek,
-Yves Orton.
+the improvements that became Perl 5.20.2:
+
+Aaron Crane, Abigail, Andreas Voegele, Andy Dougherty, Anthony Heading,
+Aristotle Pagaltzis, Chris 'BinGOs' Williams, Craig A. Berry, Daniel Dragan,
+Doug Bell, Ed J, Father Chrysostomos, Glenn D. Golden, H.Merijn Brand, Hugo van
+der Sanden, James E Keenan, Jarkko Hietaniemi, Jim Cromie, Karen Etheridge,
+Karl Williamson, kmx, Matthew Horsfall, Max Maischein, Peter Martini, Rafael
+Garcia-Suarez, Ricardo Signes, Shlomi Fish, Slaven Rezic, Steffen Müller,
+Steve Hay, Tadeusz Sośnierz, Tony Cook, Yves Orton, Ævar Arnfjörð
+Bjarmason.
The list above is almost certainly incomplete as it is automatically generated
from version control history. In particular, it does not include the names of
(P) An internal request asked to add a hash entry to something that
wasn't a symbol table entry.
+=item Bad symbol for scalar
+
+(P) An internal request asked to add a scalar entry to something that
+wasn't a symbol table entry.
+
=item Bareword found in conditional
(W bareword) The compiler found a bareword where it expected a
functioning as a class, but that package doesn't define that particular
method, nor does any of its base classes. See L<perlobj>.
+=item Can't locate object method "%s" via package "%s" (perhaps you forgot
+to load "%s"?)
+
+(F) You called a method on a class that did not exist, and the method
+could not be found in UNIVERSAL. This often means that a method
+requires a package that has not been loaded.
+
=item Can't locate package %s for @%s::ISA
(W syntax) The @ISA array contained the name of another package that
=item "\c%c" is more clearly written simply as "%s"
(W syntax) The C<\cI<X>> construct is intended to be a way to specify
-non-printable characters. You used it for a printable one, which is better
-written as simply itself, perhaps preceded by a backslash for non-word
-characters.
+non-printable characters. You used it for a printable one, which
+is better written as simply itself, perhaps preceded by a backslash
+for non-word characters. Doing it the way you did is not portable
+between ASCII and EBCDIC platforms.
=item Cloning substitution context is unimplemented
=item Ignoring zero length \N{} in character class in regex; marked by
S<<-- HERE> in m/%s/
-(W regexp) Named Unicode character escapes C<(\N{...})> may return a
+(W regexp) Named Unicode character escapes (C<\N{...}>) may return a
zero-length sequence. When such an escape is used in a character class
its behaviour is not well defined. Check that the correct escape has
been used, and the correct charname handler is in scope.
=item Invalid negative number (%s) in chr
(W utf8) You passed a negative number to C<chr>. Negative numbers are
-not valid characters numbers, so it return the Unicode replacement
+not valid character numbers, so it returns the Unicode replacement
character (U+FFFD).
=item invalid option -D%c, use -D'' to see choices
(F) Missing right brace in C<\x{...}>, C<\p{...}>, C<\P{...}>, or C<\N{...}>.
+=item Missing right brace on \N{}
+
=item Missing right brace on \N{} or unescaped left brace after \N
(F) C<\N> has two meanings.
=item \N{} in character class restricted to one character in regex; marked
by S<<-- HERE> in m/%s/
-(F) Named Unicode character escapes C<(\N{...})> may return a
+(F) Named Unicode character escapes (C<\N{...}>) may return a
multi-character sequence. Such an escape may not be used in
a character class, because character classes always match one
character of input. Check that the correct escape has been used,
command-line switch. (This output goes to STDOUT unless you've
redirected it with select().)
-=item (perhaps you forgot to load "%s"?)
-
-(F) This is an educated guess made in conjunction with the message
-"Can't locate object method \"%s\" via package \"%s\"". It often means
-that a method requires a package that has not been loaded.
-
=item Perl folding rules are not up-to-date for 0x%X; please use the perlbug
utility to report; in regex; marked by S<<-- HERE> in m/%s/
=item Zero length \N{} in regex; marked by S<<-- HERE> in m/%s/
-(F) Named Unicode character escapes C<(\N{...})> may return a zero-length
+(F) Named Unicode character escapes (C<\N{...}>) may return a zero-length
sequence. Such an escape was used in an extended character class, i.e.
C<(?[...])>, which is not permitted. Check that the correct escape has
been used, and the correct charnames handler is in scope. The S<<-- HERE>
Also, any file containing a zero byte in the examined portion is
considered a binary file. (If executed within the scope of a L<S<use
locale>|perllocale> which includes C<LC_CTYPE>, odd characters are
-anything that isn't a printable nor space in the current locale.) If
+anything that isn't a printable nor space in the current locale.) If
C<-T> or C<-B> is used on a filehandle, the current IO buffer is
examined
rather than the first block. Both C<-T> and C<-B> return true on an empty
context, returns the caller's package name if there I<is> a caller (that is, if
we're in a subroutine or C<eval> or C<require>) and the undefined value
otherwise. caller never returns XS subs and they are skipped. The next pure
-perl sub will appear instead of the XS sub in caller's return values. In list
+perl sub will appear instead of the XS
+sub in caller's return values. In list
context, caller returns
# 0 1 2
= caller($i);
Here, $subroutine is the function that the caller called (rather than the
-function containing the caller). Note that $subroutine may be C<(eval)> if
+function containing the caller). Note that $subroutine may be C<(eval)> if
the frame is not a subroutine call, but an C<eval>. In such a case
additional elements $evaltext and
C<$is_require> are set: C<$is_require> is true if the frame is created by a
deleting array elements never changes indices of existing values; use shift()
or splice() for that. However, if any deleted elements fall at the end of an
array, the array's size shrinks to the position of the highest element that
-still tests true for exists(), or to 0 if none do. In other words, an
+still tests true for exists(), or to 0 if none do. In other words, an
array won't have trailing nonexistent elements after a delete.
-B<WARNING:> Calling delete on array values is deprecated and likely to
-be removed in a future version of Perl.
+B<WARNING:> Calling C<delete> on array values is strongly discouraged. The
+notion of deleting or checking the existence of Perl array elements is not
+conceptually coherent, and can lead to surprising behavior.
Deleting from C<%ENV> modifies the environment. Deleting from a hash tied to
a DBM file deletes the entry from the DBM file. Deleting from a C<tied> hash
print "True\n" if $hash{$key};
exists may also be called on array elements, but its behavior is much less
-obvious and is strongly tied to the use of L</delete> on arrays. B<Be aware>
-that calling exists on array values is deprecated and likely to be removed in
-a future version of Perl.
+obvious and is strongly tied to the use of L</delete> on arrays.
+
+B<WARNING:> Calling C<exists> on array values is strongly discouraged. The
+notion of deleting or checking the existence of Perl array elements is not
+conceptually coherent, and can lead to surprising behavior.
print "Exists\n" if exists $array[$index];
print "Defined\n" if defined $array[$index];
rules for the remaining code points (this last can only happen if
the UTF8 flag is also set). See L<perllocale>.
-Starting in v5.20, Perl wil use full Unicode rules if the locale is
+Starting in v5.20, Perl uses full Unicode rules if the locale is
UTF-8. Otherwise, there is a deficiency in this scheme, which is that
case changes that cross the 255/256
boundary are not well-defined. For example, the lower case of LATIN CAPITAL
doesn't it won't realize something is wrong until it gets to the C<}> and
encounters the missing (or unexpected) comma. The syntax error will be
reported close to the C<}>, but you'll need to change something near the C<{>
-such as using a unary C<+> to give Perl some help:
+such as using a unary C<+> or semicolon to give Perl some help:
%hash = map { "\L$_" => 1 } @array # perl guesses EXPR. wrong
%hash = map { +"\L$_" => 1 } @array # perl guesses BLOCK. right
- %hash = map { ("\L$_" => 1) } @array # this also works
- %hash = map { lc($_) => 1 } @array # as does this.
+ %hash = map {; "\L$_" => 1 } @array # this also works
+ %hash = map { ("\L$_" => 1) } @array # as does this
+ %hash = map { lc($_) => 1 } @array # and this.
%hash = map +( lc($_) => 1 ), @array # this is EXPR and works!
%hash = map ( lc($_), 1 ), @array # evaluates to (1, @array)
This means that when C<use strict 'vars'> is in effect, C<our> lets you use
a package variable without qualifying it with the package name, but only within
-the lexical scope of the C<our> declaration.
+the lexical scope of the C<our> declaration. This applies immediately--even
+within the same statement.
package Foo;
use strict;
print $Foo::foo; # prints 23
+Because the variable becomes legal immediately under C<use strict 'vars'>, so
+long as there is no variable with that name is already in scope, you can then
+reference the package variable again even within the same statement.
+
+ package Foo;
+ use strict;
+
+ my $foo = $foo; # error, undeclared $foo on right-hand side
+ our $foo = $foo; # no errors
+
If more than one variable is listed, the list must be placed
in parentheses.
C<state> variables are enabled only when the C<use feature "state"> pragma
is in effect, unless the keyword is written as C<CORE::state>.
-See also L<feature>.
+See also L<feature>. Alternately, include a C<use v5.10> or later to the
+current scope.
=item study SCALAR
X<study>
C<use>ing library modules that won't work with older versions of Perl.
(We try not to do this more than we have to.)
-C<use VERSION> also enables all features available in the requested
+C<use VERSION> also lexically enables all features available in the requested
version as defined by the C<feature> pragma, disabling any features
not in the requested version's feature bundle. See L<feature>.
Similarly, if the specified Perl version is greater than or equal to
5.12.0, strictures are enabled lexically as
with C<use strict>. Any explicit use of
C<use strict> or C<no strict> overrides C<use VERSION>, even if it comes
-before it. In both cases, the F<feature.pm> and F<strict.pm> files are
-not actually loaded.
+before it. Later use of C<use VERSION>
+will override all behavior of a previous
+C<use VERSION>, possibly removing the C<strict> and C<feature> added by
+C<use VERSION>. C<use VERSION> does not
+load the F<feature.pm> or F<strict.pm>
+files.
The C<BEGIN> forces the C<require> and C<import> to happen at compile time. The
C<require> makes sure the module is loaded into memory if it hasn't been
Note that a return value of C<-1> could mean that child processes are
being automatically reaped, as described in L<perlipc>.
-If you use wait in your handler for $SIG{CHLD} it may accidentally for the
-child created by qx() or system(). See L<perlipc> for details.
+If you use C<wait> in your handler for $SIG{CHLD}, it may accidentally wait
+for the child created by qx() or system(). See L<perlipc> for details.
Portability issues: L<perlport/wait>.
=item else
-=item elseif
-
=item elsif
=item for
These flow-control keywords are documented in L<perlsyn/"Compound Statements">.
+=item elseif
+
+The "else if" keyword is spelled C<elsif> in Perl. There's no C<elif>
+or C<else if> either. It does parse C<elseif>, but only to warn you
+about not using it.
+
+See the documentation for flow-control keywords in L<perlsyn/"Compound
+Statements">.
+
=back
=over
targets for opcodes. A previous version of this document
stated that one can deduce that an SV lives on a scratchpad
by looking on its flags: lexicals have C<SVs_PADMY> set, and
-I<target>s have C<SVs_PADTMP> set. But this have never been fully true.
+I<target>s have C<SVs_PADTMP> set. But this has never been fully true.
C<SVs_PADMY> could be set on a variable that no longer resides in any pad.
While I<target>s do have C<SVs_PADTMP> set, it can also be set on variables
that have never resided in a pad, but nonetheless act like I<target>s.
Ricardo 5.18.1-RC3 2013-Aug-08
Ricardo 5.18.1 2013-Aug-12
Ricardo 5.18.2 2014-Jan-06
+ Ricardo 5.18.3-RC1 2014-Sep-17
+ Ricardo 5.18.3-RC2 2014-Sep-27
+ Ricardo 5.18.3 2014-Oct-01
+ Ricardo 5.18.4 2014-Oct-01
Ricardo 5.19.0 2013-May-20 The 5.19 development track
David G 5.19.1 2013-Jun-21
Steve 5.20.1-RC1 2014-Aug-25
Steve 5.20.1-RC2 2014-Sep-07
Steve 5.20.1 2014-Sep-14
+ Steve 5.20.2-RC1 2015-Jan-31
+ Steve 5.20.2 2015-Feb-14
Ricardo 5.21.0 2014-May-27 The 5.21 development track
Matthew H 5.21.1 2014-Jun-20
Abigail 5.21.2 2014-Jul-20
Peter 5.21.3 2014-Aug-20
+ Steve 5.21.4 2014-Sep-20
+ Abigail 5.21.5 2014-Oct-20
+ BinGOs 5.21.6 2014-Nov-20
+ Max M 5.21.7 2014-Dec-20
+ Matthew H 5.21.8 2015-Jan-20
=head2 SELECTED RELEASE SIZES
$shucks++;
die "Somebody sent me a SIG$signame";
}
- $SIG{INT} = __PACKAGE__ . "::catch_zap";
+ $SIG{INT} = __PACKAGE__ . "::catch_zap";
$SIG{INT} = \&catch_zap; # best strategy
Prior to Perl 5.8.0 it was necessary to do as little as you possibly
Sending a signal to a negative process ID means that you send the signal
to the entire Unix process group. This code sends a hang-up signal to all
-processes in the current process group, and also sets $SIG{HUP} to C<"IGNORE">
+processes in the current process group, and also sets $SIG{HUP} to C<"IGNORE">
so it doesn't kill itself:
# block scope for local
located in the subroutine C<code()>, which just prints some debugging
info to show that it works; it should be replaced with the real code.
- #!/usr/bin/perl -w
+ #!/usr/bin/perl
+
+ use strict;
+ use warnings;
use POSIX ();
use FindBin ();
use File::Basename ();
- use File::Spec::Functions;
+ use File::Spec::Functions qw(catfile);
$| = 1;
print "PID: $$\n";
print "ARGV: @ARGV\n";
my $count = 0;
- while (++$count) {
+ while (1) {
sleep 2;
- print "$count\n";
+ print ++$count, "\n";
}
}
opcode (e.g. a regular expression operation on a very large string) will
not be seen until the current opcode completes.
-If a signal of any given type fires multiple times during an opcode
+If a signal of any given type fires multiple times during an opcode
(such as from a fine-grained timer), the handler for that signal will
be called only once, after the opcode completes; all other
instances will be discarded. Furthermore, if your system's signal queue
SA_RESTART flag when installing %SIG handlers. This meant that
restartable system calls would continue rather than returning when
a signal arrived. In order to deliver deferred signals promptly,
-Perl 5.8.0 and later do I<not> use SA_RESTART. Consequently,
+Perl 5.8.0 and later do I<not> use SA_RESTART. Consequently,
restartable system calls can fail (with $! set to C<EINTR>) in places
where they previously would have succeeded.
The default C<:perlio> layer retries C<read>, C<write>
-and C<close> as described above; interrupted C<wait> and
+and C<close> as described above; interrupted C<wait> and
C<waitpid> calls will always be retried.
=item Signals as "faults"
to handle. Consider:
open(FH, "|bogus") || die "can't fork: $!";
- print FH "bang\n"; # neither necessary nor sufficient
+ print FH "bang\n"; # neither necessary nor sufficient
# to check print retval!
close(FH) || die "can't close: $!";
system doesn't have the setsid() function, open F</dev/tty> and use the
C<TIOCNOTTY> ioctl() on it instead. See tty(4) for details.
-Non-Unix users should check their C<< I<Your_OS>::Process >> module for
+Non-Unix users should check their C<< I<Your_OS>::Process >> module for
other possible solutions.
=head2 Safe Pipe Opens
}
} until defined $pid;
- if ($pid) { # I am the parent
+ if ($pid) { # I am the parent
print KID_TO_WRITE @some_data;
close(KID_TO_WRITE) || warn "kid exited $?";
} else { # I am the child
# drop permissions in setuid and/or setgid programs:
- ($EUID, $EGID) = ($UID, $GID);
- open (OUTFILE, "> $PRECIOUS")
+ ($EUID, $EGID) = ($UID, $GID);
+ open (OUTFILE, "> $PRECIOUS")
|| die "can't open $PRECIOUS: $!";
while (<STDIN>) {
print OUTFILE; # child's STDIN is parent's KID_TO_WRITE
}
It is very easy to dead-lock a process using this form of open(), or
-indeed with any use of pipe() with multiple subprocesses. The
+indeed with any use of pipe() with multiple subprocesses. The
example above is "safe" because it is simple and calls exec(). See
L</"Avoiding Pipe Deadlocks"> for general safety principles, but there
are extra gotchas with Safe Pipe Opens.
One would use either of these:
- open(PS_PIPE, "-|", "ps", "aux")
+ open(PS_PIPE, "-|", "ps", "aux")
|| die "can't open ps pipe: $!";
@ps_args = qw[ ps aux ];
Because there are more than three arguments to open(), forks the ps(1)
command I<without> spawning a shell, and reads its standard output via the
C<PS_PIPE> filehandle. The corresponding syntax to I<write> to command
-pipes is to use C<"|-"> in place of C<"-|">.
+pipes is to use C<"|-"> in place of C<"-|">.
This was admittedly a rather silly example, because you're using string
literals whose content is perfectly safe. There is therefore no cause to
=for TODO
Hold on, is this even true? First it says that socketpair() is avoided
-for portability, but then it says it probably won't work except on
+for portability, but then it says it probably won't work except on
Unixy systems anyway. Which one of those is true?
Here's an example of using open2():
PARENT_WTR->autoflush(1);
if ($pid = fork()) {
- close PARENT_RDR;
+ close PARENT_RDR;
close PARENT_WTR;
print CHILD_WTR "Parent Pid $$ is sending this\n";
chomp($line = <CHILD_RDR>);
waitpid($pid, 0);
} else {
die "cannot fork: $!" unless defined $pid;
- close CHILD_RDR;
+ close CHILD_RDR;
close CHILD_WTR;
chomp($line = <PARENT_RDR>);
print "Child Pid $$ just read this: '$line'\n";
print PARENT_WTR "Child Pid $$ is sending this\n";
- close PARENT_RDR;
+ close PARENT_RDR;
close PARENT_WTR;
exit(0);
}
One of the major problems with ancient, antemillennial socket code in Perl
was that it used hard-coded values for some of the constants, which
severely hurt portability. If you ever see code that does anything like
-explicitly setting C<$AF_INET = 2>, you know you're in for big trouble.
+explicitly setting C<$AF_INET = 2>, you know you're in for big trouble.
An immeasurably superior approach is to use the C<Socket> module, which more
reliably grants access to the various constants and functions you'll need.
conformant (be strict in what you provide), but they also recommend
accepting a lone "\012" on input (be lenient in what you require).
We haven't always been very good about that in the code in this manpage,
-but unless you're on a Mac from way back in its pre-Unix dark ages, you'll
+but unless you're on a Mac from way back in its pre-Unix dark ages, you'll
probably be ok.
=head2 Internet TCP Clients and Servers
my $proto = getprotobyname("tcp");
socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
- setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))
+ setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))
|| die "setsockopt: $!";
bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
listen(Server, SOMAXCONN) || die "listen: $!";
my $proto = getprotobyname("tcp");
socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
- setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))
+ setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))
|| die "setsockopt: $!";
bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
listen(Server, SOMAXCONN) || die "listen: $!";
unless (defined($pid = fork())) {
logmsg "cannot fork: $!";
return;
- }
+ }
elsif ($pid) {
logmsg "begat $pid";
return; # I'm the parent
L</Deferred Signals (Safe Signals)> above) in Perl 5.8.0 means that
accept() might also be interrupted when the process receives a signal.
This typically happens when one of the forked subprocesses exits and
-notifies the parent process with a CHLD signal.
+notifies the parent process with a CHLD signal.
If accept() is interrupted by a signal, $! will be set to EINTR.
If this happens, we can safely continue to the next iteration of
the loop and another call to accept(). It is important that your
-signal handling code not modify the value of $!, or else this test
+signal handling code not modify the value of $!, or else this test
will likely fail. In the REAPER subroutine we create a local version
of $! before calling waitpid(). When waitpid() sets $! to ECHILD as
-it inevitably does when it has no more children waiting, it
+it inevitably does when it has no more children waiting, it
updates the local copy and leaves the original unchanged.
You should use the B<-T> flag to enable taint checking (see L<perlsec>)
printf "%-24s ", $host;
my $hisiaddr = inet_aton($host) || die "unknown host";
my $hispaddr = sockaddr_in($port, $hisiaddr);
- socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
+ socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
|| die "socket: $!";
connect(SOCKET, $hispaddr) || die "connect: $!";
my $rtime = pack("C4", ());
unless (defined($pid = fork())) {
logmsg "cannot fork: $!";
return;
- }
+ }
elsif ($pid) {
logmsg "begat $pid";
return; # I'm the parent
- }
+ }
else {
# I'm the child -- go spawn
}
manpage describes the low-level interface to sockets. Besides the obvious
functions in L<perlfunc>, you should also check out the F<modules> file at
your nearest CPAN site, especially
-L<http://www.cpan.org/modules/00modlist.long.html#ID5_Networking_>.
+L<http://www.cpan.org/modules/00modlist.long.html#ID5_Networking_>.
See L<perlmodlib> or best yet, the F<Perl FAQ> for a description
-of what CPAN is and where to get it if the previous link doesn't work
+of what CPAN is and where to get it if the previous link doesn't work
for you.
Section 5 of CPAN's F<modules> file is devoted to "Networking, Device
# restore the old locale
setlocale(LC_CTYPE, $old_locale);
+This simultaneously affects all threads of the program, so it may be
+problematic to use locales in threaded applications except where there
+is a single locale applicable to all threads.
+
The first argument of C<setlocale()> gives the B<category>, the second the
B<locale>. The category tells in what aspect of data processing you
want to apply locale-specific rules. Category names are discussed in
You can test out changing these variables temporarily, and if the
new settings seem to help, put those settings into your shell startup
-files. Consult your local documentation for the exact details. For in
+files. Consult your local documentation for the exact details. For
Bourne-like shells (B<sh>, B<ksh>, B<bash>, B<zsh>):
LC_ALL=en_US.ISO8859-1
setenv LC_ALL en_US.ISO8859-1
-or if you have the "env" application you can do in any shell
+or if you have the "env" application you can do (in any shell)
env LC_ALL=en_US.ISO8859-1 perl ...
"color" follows "chocolate" in English, what about in traditional Spanish?
The following collations all make sense and you may meet any of them
-if you "use locale".
+if you C<"use locale">.
A B C D E a b c d e
A a B b C c D d E e
dictionary-like ordering that ignores space characters completely and
which folds case.
-Perl only supports single-byte locales for C<LC_COLLATE>. This means
+Perl currently only supports single-byte locales for C<LC_COLLATE>. This means
that a UTF-8 locale likely will just give you machine-native ordering.
Use L<Unicode::Collate> for the full implementation of the Unicode
Collation Algorithm.
The C<LC_CTYPE> locale also provides the map used in transliterating
characters between lower and uppercase. This affects the case-mapping
-functions--C<fc()>, C<lc()>, C<lcfirst()>, C<uc()>, and C<ucfirst()>; case-mapping
+functions--C<fc()>, C<lc()>, C<lcfirst()>, C<uc()>, and C<ucfirst()>;
+case-mapping
interpolation with C<\F>, C<\l>, C<\L>, C<\u>, or C<\U> in double-quoted
strings and C<s///> substitutions; and case-independent regular expression
pattern matching using the C<i> modifier.
Finally, C<LC_CTYPE> affects the (deprecated) POSIX character-class test
functions--C<POSIX::isalpha()>, C<POSIX::islower()>, and so on. For
-example, if you move from the "C" locale to a 7-bit Scandinavian one,
-you may find--possibly to your surprise--that "|" moves from the
+example, if you move from the "C" locale to a 7-bit ISO 646 one,
+you may find--possibly to your surprise--that C<"|"> moves from the
C<POSIX::ispunct()> class to C<POSIX::isalpha()>.
Unfortunately, this creates big problems for regular expressions. "|" still
means alternation even though it matches C<\w>.
Starting in v5.20, Perl supports UTF-8 locales for C<LC_CTYPE>, but
otherwise Perl only supports single-byte locales, such as the ISO 8859
series. This means that wide character locales, for example for Asian
-languages, are not supported. The UTF-8 locale support is actually a
+languages, are not well-supported. The UTF-8 locale support is actually a
superset of POSIX locales, because it is really full Unicode behavior
as if no locale were in effect at all (except for tainting; see
L</SECURITY>). POSIX locales, even UTF-8 ones,
used as a workaround for this (see L</Unicode and UTF-8>).
Note that there are quite a few things that are unaffected by the
-current locale. All the escape sequences for particular characters,
+current locale. Any literal character is the native character for the
+given platform. Hence 'A' means the character at code point 65 on ASCII
+platforms, and 193 on EBCDIC. That may or may not be an 'A' in the
+current locale, if that locale even has an 'A'.
+Similarly, all the escape sequences for particular characters,
C<\n> for example, always mean the platform's native one. This means,
for example, that C<\N> in regular expressions (every character
but new-line) works on the platform character set.
Regular expression checks for safe file names or mail addresses using
C<\w> may be spoofed by an C<LC_CTYPE> locale that claims that
-characters such as "E<gt>" and "|" are alphanumeric.
+characters such as C<"E<gt>"> and C<"|"> are alphanumeric.
=item *
properly under C<LC_CTYPE>. To see if a character is a particular type
under a locale, Perl uses the functions like C<isalnum()>. Your C
library may not work for UTF-8 locales with those functions, instead
-only working under the newer wide library functions like C<iswalnum()>.
-However, they are treated like single-byte locales, and will have the
-restrictions described below.
+only working under the newer wide library functions like C<iswalnum()>,
+which Perl does not use.
+These multi-byte locales are treated like single-byte locales, and will
+have the restrictions described below.
For single-byte locales,
Perl generally takes the tack to use locale rules on code points that can fit
issue occurs with C<\N{...}>. Prior to v5.20, It is therefore a bad
idea to use C<\p{}> or
C<\N{}> under plain C<use locale>--I<unless> you can guarantee that the
-locale will be a ISO8859-1. Use POSIX character classes instead.
+locale will be ISO8859-1. Use POSIX character classes instead.
Another problem with this approach is that operations that cross the
single byte/multiple byte boundary are not well-defined, and so are
Pre-v5.12, it was somewhat haphazard; in v5.12 it was applied fairly
consistently to regular expression matching except for bracketed
character classes; in v5.14 it was extended to all regex matches; and in
-v5.16 to the casing operations such as C<"\L"> and C<uc()>. For
-collation, in all releases, the system's C<strxfrm()> function is called,
-and whatever it does is what you get.
+v5.16 to the casing operations such as C<\L> and C<uc()>. For
+collation, in all releases so far, the system's C<strxfrm()> function is
+called, and whatever it does is what you get.
=head1 BUGS
=head1 DESCRIPTION
+=head2 Is this the document you were after?
+
+There are other documents which might contain the information that you're
+looking for:
+
+=over 2
+
+=item This doc
+
+Perl's packages, namespaces, and some info on classes.
+
+=item L<perlnewmod>
+
+Tutorial on making a new module.
+
+=item L<perlmodstyle>
+
+Best practices for making a new module.
+
+=back
+
=head2 Packages
X<package> X<namespace> X<variable, global> X<global variable> X<global>
Or, you can combine this step with the next to save disk space:
- gzip -dc yourmodule.tar.gz | tar -xf -
+ gzip -dc yourmodule.tar.gz | tar -xof -
B. UNPACK
-Unpack the result with C<tar -xf yourmodule.tar>
+Unpack the result with C<tar -xof yourmodule.tar>
C. BUILD
=head1 DESCRIPTION
In Perl, the operator determines what operation is performed,
-independent of the type of the operands. For example C<$a + $b>
-is always a numeric addition, and if C<$a> or C<$b> do not contain
+independent of the type of the operands. For example C<$x + $y>
+is always a numeric addition, and if C<$x> or C<$y> do not contain
numbers, an attempt is made to convert them to numbers first.
This is in contrast to many other dynamic languages, where the
-operation is determined by the type of the first argument. It also
+operation is determined by the type of the first argument. It also
means that Perl has two versions of some operators, one for numeric
-and one for string comparison. For example C<$a == $b> compares
-two numbers for equality, and C<$a eq $b> compares two strings.
+and one for string comparison. For example C<$x == $y> compares
+two numbers for equality, and C<$x eq $y> compares two strings.
There are a few exceptions though: C<x> can be either string
repetition or list repetition, depending on the type of the left
print ++$j; # prints 1
Note that just as in C, Perl doesn't define B<when> the variable is
-incremented or decremented. You just know it will be done sometime
-before or after the value is returned. This also means that modifying
+incremented or decremented. You just know it will be done sometime
+before or after the value is returned. This also means that modifying
a variable twice in the same statement will lead to undefined behavior.
Avoid statements like:
X<**> X<exponentiation> X<power>
Binary "**" is the exponentiation operator. It binds even more
-tightly than unary minus, so -2**4 is -(2**4), not (-2)**4. (This is
+tightly than unary minus, so -2**4 is -(2**4), not (-2)**4. (This is
implemented using C's pow(3) function, which actually works on doubles
internally.)
returned. One effect of these rules is that -bareword is equivalent
to the string "-bareword". If, however, the string begins with a
non-alphabetic character (excluding "+" or "-"), Perl will attempt to convert
-the string to a numeric and the arithmetic negation is performed. If the
+the string to a numeric and the arithmetic negation is performed. If the
string cannot be cleanly converted to a numeric, Perl will give the warning
B<Argument "the string" isn't numeric in negation (-) at ...>.
X<-> X<negation, arithmetic>
If the right argument is an expression rather than a search pattern,
substitution, or transliteration, it is interpreted as a search pattern at run
-time. Note that this means that its contents will be interpolated twice, so
+time. Note that this means that its
+contents will be interpolated twice, so
'\\' =~ q'\\';
Binary "%" is the modulo operator, which computes the division
remainder of its first argument with respect to its second argument.
Given integer
-operands C<$a> and C<$b>: If C<$b> is positive, then C<$a % $b> is
-C<$a> minus the largest multiple of C<$b> less than or equal to
-C<$a>. If C<$b> is negative, then C<$a % $b> is C<$a> minus the
-smallest multiple of C<$b> that is not less than C<$a> (that is, the
+operands C<$m> and C<$n>: If C<$n> is positive, then C<$m % $n> is
+C<$m> minus the largest multiple of C<$n> less than or equal to
+C<$m>. If C<$n> is negative, then C<$m % $n> is C<$m> minus the
+smallest multiple of C<$n> that is not less than C<$m> (that is, the
result will be less than or equal to zero). If the operands
-C<$a> and C<$b> are floating point values and the absolute value of
-C<$b> (that is C<abs($b)>) is less than C<(UV_MAX + 1)>, only
-the integer portion of C<$a> and C<$b> will be used in the operation
+C<$m> and C<$n> are floating point values and the absolute value of
+C<$n> (that is C<abs($n)>) is less than C<(UV_MAX + 1)>, only
+the integer portion of C<$m> and C<$n> will be used in the operation
(Note: here C<UV_MAX> means the maximum of the unsigned integer type).
-If the absolute value of the right operand (C<abs($b)>) is greater than
+If the absolute value of the right operand (C<abs($n)>) is greater than
or equal to C<(UV_MAX + 1)>, "%" computes the floating-point remainder
-C<$r> in the equation C<($r = $a - $i*$b)> where C<$i> is a certain
+C<$r> in the equation C<($r = $m - $i*$n)> where C<$i> is a certain
integer that makes C<$r> have the same sign as the right operand
-C<$b> (B<not> as the left operand C<$a> like C function C<fmod()>)
-and the absolute value less than that of C<$b>.
+C<$n> (B<not> as the left operand C<$m> like C function C<fmod()>)
+and the absolute value less than that of C<$n>.
Note that when C<use integer> is in scope, "%" gives you direct access
to the modulo operator as implemented by your C compiler. This
operator is not as well defined for negative operands, but it will
argument is numerically less than, equal to, or greater than the right
argument. If your platform supports NaNs (not-a-numbers) as numeric
values, using them with "<=>" returns undef. NaN is not "<", "==", ">",
-"<=" or ">=" anything (even NaN), so those 5 return false. NaN != NaN
-returns true, as does NaN != anything else. If your platform doesn't
+"<=" or ">=" anything (even NaN), so those 5 return false. NaN != NaN
+returns true, as does NaN != anything else. If your platform doesn't
support NaNs then NaN is just a string with numeric value 0.
X<< <=> >> X<spaceship>
- $ perl -le '$a = "NaN"; print "No NaN support here" if $a == $a'
- $ perl -le '$a = "NaN"; print "NaN support here" if $a != $a'
+ $ perl -le '$x = "NaN"; print "No NaN support here" if $x == $x'
+ $ perl -le '$x = "NaN"; print "NaN support here" if $x != $x'
-(Note that the L<bigint>, L<bigrat>, and L<bignum> pragmas all
+(Note that the L<bigint>, L<bigrat>, and L<bignum> pragmas all
support "NaN".)
Binary "eq" returns true if the left argument is stringwise equal to
(eventually) has a 4 in it.
Smartmatching one hash against another reports whether both contain the
-same keys, no more and no less. This could be used to see whether two
+same keys, no more and no less. This could be used to see whether two
records have the same field names, without caring what values those fields
might have. For example:
To avoid relying on an object's underlying representation, if the
smartmatch's right operand is an object that doesn't overload C<~~>,
it raises the exception "C<Smartmatching a non-overloaded object
-breaks encapsulation>". That's because one has no business digging
-around to see whether something is "in" an object. These are all
+breaks encapsulation>". That's because one has no business digging
+around to see whether something is "in" an object. These are all
illegal on objects without a C<~~> overload:
%hash ~~ $object
"fred" ~~ $object
However, you can change the way an object is smartmatched by overloading
-the C<~~> operator. This is allowed to extend the usual smartmatch semantics.
+the C<~~> operator. This is allowed to
+extend the usual smartmatch semantics.
For objects that do have an C<~~> overload, see L<overload>.
Using an object as the left operand is allowed, although not very useful.
to its C-style or. In fact, it's exactly the same as C<||>, except that it
tests the left hand side's definedness instead of its truth. Thus,
C<< EXPR1 // EXPR2 >> returns the value of C<< EXPR1 >> if it's defined,
-otherwise, the value of C<< EXPR2 >> is returned. (C<< EXPR1 >> is evaluated
-in scalar context, C<< EXPR2 >> in the context of C<< // >> itself). Usually,
+otherwise, the value of C<< EXPR2 >> is returned.
+(C<< EXPR1 >> is evaluated in scalar context, C<< EXPR2 >>
+in the context of C<< // >> itself). Usually,
this is the same result as C<< defined(EXPR1) ? EXPR1 : EXPR2 >> (except that
the ternary-operator form can be used as a lvalue, while C<< EXPR1 // EXPR2 >>
-cannot). This is very useful for
+cannot). This is very useful for
providing default values for variables. If you actually want to test if
-at least one of C<$a> and C<$b> is defined, use C<defined($a // $b)>.
+at least one of C<$x> and C<$y> is defined, use C<defined($x // $y)>.
The C<||>, C<//> and C<&&> operators return the last value evaluated
-(unlike C's C<||> and C<&&>, which return 0 or 1). Thus, a reasonably
+(unlike C's C<||> and C<&&>, which return 0 or 1). Thus, a reasonably
portable way to find out the home directory might be:
$home = $ENV{HOME}
list of values counting (up by ones) from the left value to the right
value. If the left value is greater than the right value then it
returns the empty list. The range operator is useful for writing
-C<foreach (1..10)> loops and for doing slice operations on arrays. In
+C<foreach (1..10)> loops and for doing slice operations on arrays. In
the current implementation, no temporary array is created when the
range operator is used as the expression in C<foreach> loops, but older
versions of Perl might burn a lot of memory when you write something
In scalar context, ".." returns a boolean value. The operator is
bistable, like a flip-flop, and emulates the line-range (comma)
-operator of B<sed>, B<awk>, and various editors. Each ".." operator
+operator of B<sed>, B<awk>, and various editors. Each ".." operator
maintains its own boolean state, even across calls to a subroutine
-that contains it. It is false as long as its left operand is false.
+that contains it. It is false as long as its left operand is false.
Once the left operand is true, the range operator stays true until the
right operand is true, I<AFTER> which the range operator becomes false
again. It doesn't become false till the next time the range operator
is evaluated. It can test the right operand and become false on the
same evaluation it became true (as in B<awk>), but it still returns
-true once. If you don't want it to test the right operand until the
+true once. If you don't want it to test the right operand until the
next evaluation, as in B<sed>, just use three dots ("...") instead of
two. In all other regards, "..." behaves just like ".." does.
}
}
-This program will print only the line containing "Bar". If
+This program will print only the line containing "Bar". If
the range operator is changed to C<...>, it will also print the
"Baz" line.
Scalar or list context propagates downward into the 2nd
or 3rd argument, whichever is selected.
- $a = $ok ? $b : $c; # get a scalar
- @a = $ok ? @b : @c; # get an array
- $a = $ok ? @b : @c; # oops, that's just a count!
+ $x = $ok ? $y : $z; # get a scalar
+ @x = $ok ? @y : @z; # get an array
+ $x = $ok ? @y : @z; # oops, that's just a count!
The operator may be assigned to if both the 2nd and 3rd arguments are
legal lvalues (meaning that you can assign to them):
- ($a_or_b ? $a : $b) = $c;
+ ($x_or_y ? $x : $y) = $z;
Because this operator produces an assignable result, using assignments
without parentheses will get you in trouble. For example, this:
- $a % 2 ? $a += 10 : $a += 2
+ $x % 2 ? $x += 10 : $x += 2
Really means this:
- (($a % 2) ? ($a += 10) : $a) += 2
+ (($x % 2) ? ($x += 10) : $x) += 2
Rather than this:
- ($a % 2) ? ($a += 10) : ($a += 2)
+ ($x % 2) ? ($x += 10) : ($x += 2)
That should probably be written more simply as:
- $a += ($a % 2) ? 10 : 2;
+ $x += ($x % 2) ? 10 : 2;
=head2 Assignment Operators
X<assignment> X<operator, assignment> X<=> X<**=> X<+=> X<*=> X<&=>
Assignment operators work as in C. That is,
- $a += 2;
+ $x += 2;
is equivalent to
- $a = $a + 2;
+ $x = $x + 2;
although without duplicating any side effects that dereferencing the lvalue
might trigger, such as from tie(). Other assignment operators work similarly.
Likewise,
- ($a += 2) *= 3;
+ ($x += 2) *= 3;
is equivalent to
- $a += 2;
- $a *= 3;
+ $x += 2;
+ $x *= 3;
Similarly, a list assignment in list context produces the list of
lvalues assigned to, and a list assignment in scalar context returns
word on its left to be interpreted as a string if it begins with a letter
or underscore and is composed only of letters, digits and underscores.
This includes operands that might otherwise be interpreted as operators,
-constants, single number v-strings or function calls. If in doubt about
+constants, single number v-strings or function calls. If in doubt about
this behavior, the left operand can be quoted explicitly.
Otherwise, the C<< => >> operator behaves exactly as the comma operator
be careful to avoid using it as replacement for the C<||> operator.
It usually works out better for flow control than in assignments:
- $a = $b or $c; # bug: this is wrong
- ($a = $b) or $c; # really means this
- $a = $b || $c; # better written this way
+ $x = $y or $z; # bug: this is wrong
+ ($x = $y) or $z; # really means this
+ $x = $y || $z; # better written this way
However, when it's a list-context assignment and you're trying to use
C<||> for control flow, you probably need "or" so that the assignment
=item unary *
-Dereference-address operator. (Perl's prefix dereferencing
+Dereference-address operator. (Perl's prefix dereferencing
operators are typed: $, @, %, and &.)
=item (TYPE)
Note, however, that this does not always work for quoting Perl code:
- $s = q{ if($a eq "}") ... }; # WRONG
+ $s = q{ if($x eq "}") ... }; # WRONG
-is a syntax error. The C<Text::Balanced> module (standard as of v5.8,
+is a syntax error. The C<Text::Balanced> module (standard as of v5.8,
and from CPAN before then) is able to do this properly.
There can be whitespace between the operator and the quoting
The result is the character specified by the hexadecimal number between
the braces. See L</[8]> below for details on which character.
-Only hexadecimal digits are valid between the braces. If an invalid
+Only hexadecimal digits are valid between the braces. If an invalid
character is encountered, a warning will be issued and the invalid
character and all subsequent characters (valid or invalid) within the
braces will be discarded.
C<"\015">. If you get in the habit of using C<"\n"> for networking,
you may be burned some day.
X<newline> X<line terminator> X<eol> X<end of line>
-X<\r>
+X<\n> X<\r> X<\r\n>
For constructs that do interpolate, variables beginning with "C<$>"
or "C<@>" are interpolated. Subscripted variables such as C<$a[3]> or
For the pattern of regex operators (C<qr//>, C<m//> and C<s///>),
the quoting from C<\Q> is applied after interpolation is processed,
-but before escapes are processed. This allows the pattern to match
-literally (except for C<$> and C<@>). For example, the following matches:
+but before escapes are processed. This allows the pattern to match
+literally (except for C<$> and C<@>). For example, the following matches:
'\s\t' =~ /\Q\s\t/
expression. I<STRING> is interpolated the same way as I<PATTERN>
in C<m/PATTERN/>. If "'" is used as the delimiter, no interpolation
is done. Returns a Perl value which may be used instead of the
-corresponding C</STRING/msixpodual> expression. The returned value is a
-normalized version of the original pattern. It magically differs from
+corresponding C</STRING/msixpodual> expression. The returned value is a
+normalized version of the original pattern. It magically differs from
a string containing the same characters: C<ref(qr/x/)> returns "Regexp";
however, dereferencing it is not well defined (you currently get the
normalized version of the original pattern, but this may change).
as delimiters. This is particularly useful for matching path names
that contain "/", to avoid LTS (leaning toothpick syndrome). If "?" is
the delimiter, then a match-only-once rule applies,
-described in C<m?PATTERN?> below. If "'" (single quote) is the delimiter,
+described in C<m?PATTERN?> below. If "'" (single quote) is the delimiter,
no interpolation is performed on the PATTERN.
When using a character valid in an identifier, whitespace is required
after the C<m>.
=item The empty pattern //
If the PATTERN evaluates to the empty string, the last
-I<successfully> matched regular expression is used instead. In this
+I<successfully> matched regular expression is used instead. In this
case, only the C<g> and C<c> flags on the empty pattern are honored;
-the other flags are taken from the original pattern. If no match has
+the other flags are taken from the original pattern. If no match has
previously succeeded, this will (silently) act instead as a genuine
empty pattern (which will always match).
Note that it's possible to confuse Perl into thinking C<//> (the empty
regex) is really C<//> (the defined-or operator). Perl is usually pretty
good about this, but some pathological cases might trigger this, such as
-C<$a///> (is that C<($a) / (//)> or C<$a // />?) and C<print $fh //>
+C<$x///> (is that C<($x) / (//)> or C<$x // />?) and C<print $fh //>
(C<print $fh(//> or C<print($fh //>?). In all of these examples, Perl
will assume you meant defined-or. If you meant the empty regex, just
use parentheses or spaces to disambiguate, or even prefix the empty
if the pattern matched.
The C</g> modifier specifies global pattern matching--that is,
-matching as many times as possible within the string. How it behaves
-depends on the context. In list context, it returns a list of the
+matching as many times as possible within the string. How it behaves
+depends on the context. In list context, it returns a list of the
substrings matched by any capturing parentheses in the regular
-expression. If there are no parentheses, it returns a list of all
+expression. If there are no parentheses, it returns a list of all
the matched strings, as if there were parentheses around the whole
pattern.
In scalar context, each execution of C<m//g> finds the next match,
returning true if it matches, and false if there is no further match.
The position after the last match can be read or set using the C<pos()>
-function; see L<perlfunc/pos>. A failed match normally resets the
+function; see L<perlfunc/pos>. A failed match normally resets the
search position to the beginning of the string, but you can avoid that
-by adding the C</c> modifier (for example, C<m//gc>). Modifying the target
+by adding the C</c> modifier (for example, C<m//gc>). Modifying the target
string also resets the search position.
=item \G assertion
You can intermix C<m//g> matches with C<m/\G.../g>, where C<\G> is a
zero-width assertion that matches the exact position where the
-previous C<m//g>, if any, left off. Without the C</g> modifier, the
+previous C<m//g>, if any, left off. Without the C</g> modifier, the
C<\G> assertion still anchors at C<pos()> as it was at the start of
the operation (see L<perlfunc/pos>), but the match is of course only
-attempted once. Using C<\G> without C</g> on a target string that has
+attempted once. Using C<\G> without C</g> on a target string that has
not previously had a C</g> match applied to it is the same as using
the C<\A> assertion to match the beginning of the string. Note also
that, currently, C<\G> is only properly supported when anchored at the
Final: 'q', pos=8
Notice that the final match matched C<q> instead of C<p>, which a match
-without the C<\G> anchor would have done. Also note that the final match
-did not update C<pos>. C<pos> is only updated on a C</g> match. If the
+without the C<\G> anchor would have done. Also note that the final match
+did not update C<pos>. C<pos> is only updated on a C</g> match. If the
final match did indeed match C<p>, it's a good bet that you're running a
very old (pre-5.6.0) version of Perl.
C<s(foo)(bar)> or C<< s<foo>/bar/ >>. A C</e> will cause the
replacement portion to be treated as a full-fledged Perl expression
and evaluated right then and there. It is, however, syntax checked at
-compile-time. A second C<e> modifier will cause the replacement portion
+compile-time. A second C<e> modifier will cause the replacement portion
to be C<eval>ed before being run as a Perl expression.
Examples:
s/^=(\w+)/pod($1)/ge; # use function call
$_ = 'abc123xyz';
- $a = s/abc/def/r; # $a is 'def123xyz' and
+ $x = s/abc/def/r; # $x is 'def123xyz' and
# $_ remains 'abc123xyz'.
# expand variables in $_, but dynamics only, using
specified by SEARCHLIST not found in REPLACEMENTLIST are deleted.
(Note that this is slightly more flexible than the behavior of some
B<tr> programs, which delete anything they find in the SEARCHLIST,
-period.) If the C</s> modifier is specified, sequences of characters
+period.) If the C</s> modifier is specified, sequences of characters
that were transliterated to the same character are squashed down
to a single instance of the character.
=item Single Quotes
Single quotes indicate the text is to be treated literally with no
-interpolation of its content. This is similar to single quoted
+interpolation of its content. This is similar to single quoted
strings except that backslashes have no special meaning, with C<\\>
being treated as two backslashes and not one as they would in every
other quoting construct.
=item Backticks
The content of the here doc is treated just as it would be if the
-string were embedded in backticks. Thus the content is interpolated
+string were embedded in backticks. Thus the content is interpolated
as though it were double quoted and then executed via the shell, with
the results of the execution returned.
outside of string evals.
Additionally, quoting rules for the end-of-string identifier are
-unrelated to Perl's quoting rules. C<q()>, C<qq()>, and the like are not
+unrelated to Perl's quoting rules. C<q()>, C<qq()>, and the like are not
supported in place of C<''> and C<"">, and the only interpolation is for
backslashing the quoting character:
The first pass is finding the end of the quoted construct, where
the information about the delimiters is used in parsing.
During this search, text between the starting and ending delimiters
-is copied to a safe location. The text copied gets delimiter-independent.
+is copied to a safe location. The text copied gets delimiter-independent.
If the construct is a here-doc, the ending delimiter is a line
-that has a terminating string as the content. Therefore C<<<EOF> is
+that has a terminating string as the content. Therefore C<<<EOF> is
terminated by C<EOF> immediately followed by C<"\n"> and starting
from the first column of the terminating line.
When searching for the terminating line of a here-doc, nothing
-is skipped. In other words, lines after the here-doc syntax
+is skipped. In other words, lines after the here-doc syntax
are compared with the terminating string line by line.
For the constructs except here-docs, single characters are used as starting
-and ending delimiters. If the starting delimiter is an opening punctuation
+and ending delimiters. If the starting delimiter is an opening punctuation
(that is C<(>, C<[>, C<{>, or C<< < >>), the ending delimiter is the
corresponding closing punctuation (that is C<)>, C<]>, C<}>, or C<< > >>).
If the starting delimiter is an unpaired character like C</> or a closing
punctuation, the ending delimiter is same as the starting delimiter.
Therefore a C</> terminates a C<qq//> construct, while a C<]> terminates
-C<qq[]> and C<qq]]> constructs.
+both C<qq[]> and C<qq]]> constructs.
When searching for single-character delimiters, escaped delimiters
and C<\\> are skipped. For example, while searching for terminating C</>,
For constructs with three-part delimiters (C<s///>, C<y///>, and
C<tr///>), the search is repeated once more.
-If the first delimiter is not an opening punctuation, three delimiters must
-be same such as C<s!!!> and C<tr)))>, in which case the second delimiter
+If the first delimiter is not an opening punctuation, the three delimiters must
+be the same, such as C<s!!!> and C<tr)))>,
+in which case the second delimiter
terminates the left part and starts the right part at once.
If the left part is delimited by bracketing punctuation (that is C<()>,
C<[]>, C<{}>, or C<< <> >>), the right part needs another pair of
delimiters such as C<s(){}> and C<tr[]//>. In these cases, whitespace
-and comments are allowed between both parts, though the comment must follow
+and comments are allowed between the two parts, though the comment must follow
at least one whitespace character; otherwise a character expected as the
start of the comment may be regarded as the starting delimiter of the right part.
modifier. So the embedded C<#> is interpreted as a literal C<#>.
Also no attention is paid to C<\c\> (multichar control char syntax) during
-this search. Thus the second C<\> in C<qq/\c\/> is interpreted as a part
+this search. Thus the second C<\> in C<qq/\c\/> is interpreted as a part
of C<\/>, and the following C</> is not recognized as a delimiter.
Instead, use C<\034> or C<\x1c> at the end of quoted constructs.
Note also that the interpolation code needs to make a decision on
where the interpolated scalar ends. For instance, whether
-C<< "a $b -> {c}" >> really means:
+C<< "a $x -> {c}" >> really means:
- "a " . $b . " -> {c}";
+ "a " . $x . " -> {c}";
or:
- "a " . $b -> {c};
+ "a " . $x -> {c};
Most of the time, the longest possible text that does not include
spaces between components and which contains matching braces or
except that it isn't so cumbersome to say, and will actually work.
It really does shift the @ARGV array and put the current filename
into the $ARGV variable. It also uses filehandle I<ARGV>
-internally. <> is just a synonym for <ARGV>, which
+internally. <> is just a synonym for <ARGV>, which
is magical. (The pseudo code above doesn't work because it treats
<ARGV> as non-magical.)
The standard C<Math::BigInt>, C<Math::BigRat>, and C<Math::BigFloat> modules,
along with the C<bignum>, C<bigint>, and C<bigrat> pragmas, provide
variable-precision arithmetic and overloaded operators, although
-they're currently pretty slow. At the cost of some space and
+they're currently pretty slow. At the cost of some space and
considerable speed, they avoid the normal pitfalls associated with
limited-precision representations.
Or with rationals:
- use 5.010;
- use bigrat;
- $a = 3/22;
- $b = 4/6;
- say "a/b is ", $a/$b;
- say "a*b is ", $a*$b;
- a/b is 9/44
- a*b is 1/11
+ use 5.010;
+ use bigrat;
+ $x = 3/22;
+ $y = 4/6;
+ say "x/y is ", $x/$y;
+ say "x*y is ", $x*$y;
+ x/y is 9/44
+ x*y is 1/11
Several modules let you calculate with (bound only by memory and CPU time)
-unlimited or fixed precision. There are also some non-standard modules that
+unlimited or fixed precision. There
+are also some non-standard modules that
provide faster implementations via external C libraries.
Here is a short, but incomplete summary:
X<\> X<backslash>
By using the backslash operator on a variable, subroutine, or value.
-(This works much like the & (address-of) operator in C.)
+(This works much like the & (address-of) operator in C.)
This typically creates I<another> reference to a variable, because
there's already a reference to the variable in the symbol table. But
the symbol table reference might go away, and you'll still have the
a list of references!
@list = (\$a, \@b, \%c);
- @list = \($a, @b, %c); # same thing!
+ @list = \($a, @b, %c); # same thing!
As a special case, C<\(@foo)> returns a list of references to the contents
of C<@foo>, not a reference to C<@foo> itself. Likewise for C<%foo>,
brackets:
$hashref = {
- 'Adam' => 'Eve',
- 'Clyde' => 'Bonnie',
+ 'Adam' => 'Eve',
+ 'Clyde' => 'Bonnie',
};
Anonymous hash and array composers like these can be intermixed freely to
closures work:
sub newprint {
- my $x = shift;
- return sub { my $y = shift; print "$x, $y!\n"; };
+ my $x = shift;
+ return sub { my $y = shift; print "$x, $y!\n"; };
}
$h = newprint("Howdy");
$g = newprint("Greetings");
value to a scalar instead of a typeglob as we do in the examples
below, there's no risk of that happening.
- splutter(*STDOUT); # pass the whole glob
- splutter(*STDOUT{IO}); # pass both file and dir handles
+ splutter(*STDOUT); # pass the whole glob
+ splutter(*STDOUT{IO}); # pass both file and dir handles
sub splutter {
- my $fh = shift;
- print $fh "her um well a hmmm\n";
+ my $fh = shift;
+ print $fh "her um well a hmmm\n";
}
- $rec = get_rec(*STDIN); # pass the whole glob
+ $rec = get_rec(*STDIN); # pass the whole glob
$rec = get_rec(*STDIN{IO}); # pass both file and dir handles
sub get_rec {
- my $fh = shift;
- return scalar <$fh>;
+ my $fh = shift;
+ return scalar <$fh>;
}
=back
the BLOCK can contain any arbitrary expression, in particular,
subscripted expressions:
- &{ $dispatch{$index} }(1,2,3); # call correct routine
+ &{ $dispatch{$index} }(1,2,3); # call correct routine
Because of being able to omit the curlies for the simple case of C<$$x>,
people often make the mistake of viewing the dereferencing symbols as
Consider the difference below; case 0 is a short-hand version of case 1,
I<not> case 2:
- $$hashref{"KEY"} = "VALUE"; # CASE 0
- ${$hashref}{"KEY"} = "VALUE"; # CASE 1
- ${$hashref{"KEY"}} = "VALUE"; # CASE 2
- ${$hashref->{"KEY"}} = "VALUE"; # CASE 3
+ $$hashref{"KEY"} = "VALUE"; # CASE 0
+ ${$hashref}{"KEY"} = "VALUE"; # CASE 1
+ ${$hashref{"KEY"}} = "VALUE"; # CASE 2
+ ${$hashref->{"KEY"}} = "VALUE"; # CASE 3
Case 2 is also deceptive in that you're accessing a variable
called %hashref, not dereferencing through $hashref to the hash
X<reference, numeric context>
if ($ref1 == $ref2) { # cheap numeric compare of references
- print "refs 1 and 2 refer to the same thing\n";
+ print "refs 1 and 2 refer to the same thing\n";
}
Using a reference as a string produces both its referent's type,
People frequently expect it to work like this. So it does.
$name = "foo";
- $$name = 1; # Sets $foo
- ${$name} = 2; # Sets $foo
- ${$name x 2} = 3; # Sets $foofoo
- $name->[0] = 4; # Sets $foo[0]
- @$name = (); # Clears @foo
- &$name(); # Calls &foo()
+ $$name = 1; # Sets $foo
+ ${$name} = 2; # Sets $foo
+ ${$name x 2} = 3; # Sets $foofoo
+ $name->[0] = 4; # Sets $foo[0]
+ @$name = (); # Clears @foo
+ &$name(); # Calls &foo()
$pack = "THAT";
- ${"${pack}::$name"} = 5; # Sets $THAT::foo without eval
+ ${"${pack}::$name"} = 5; # Sets $THAT::foo without eval
This is powerful, and slightly dangerous, in that it's possible
to intend (with the utmost sincerity) to use a hard reference, and
local $value = 10;
$ref = "value";
{
- my $value = 20;
- print $$ref;
+ my $value = 20;
+ print $$ref;
}
This will still print 10, not 20. Remember that local() affects package
using strict refs:
use strict 'refs';
- ${ bareword }; # Okay, means $bareword.
- ${ "bareword" }; # Error, symbolic reference.
+ ${ bareword }; # Okay, means $bareword.
+ ${ "bareword" }; # Error, symbolic reference.
Similarly, because of all the subscripting that is done using single words,
the same rule applies to any bareword that is used for subscripting a hash.
The red() and green() functions would be similar. To create these,
we'll assign a closure to a typeglob of the name of the function we're
-trying to build.
+trying to build.
@colors = qw(red blue green yellow orange purple violet);
for my $name (@colors) {
- no strict 'refs'; # allow symbol table manipulation
+ no strict 'refs'; # allow symbol table manipulation
*$name = *{uc $name} = sub { "<FONT COLOR='$name'>@_</FONT>" };
- }
+ }
Now all those different functions appear to exist independently. You can
call red(), RED(), blue(), BLUE(), green(), etc. This technique saves on
nested subroutines in other programming languages with their own private
variables, you'll have to work at it a bit in Perl. The intuitive coding
of this type of thing incurs mysterious warnings about "will not stay
-shared" due to the reasons explained above.
+shared" due to the reasons explained above.
For example, this won't work:
sub outer {
mode>, when it detects its program running with differing real and effective
user or group IDs. The setuid bit in Unix permissions is mode 04000, the
setgid bit mode 02000; either or both may be set. You can also enable taint
-mode explicitly by using the B<-T> command line flag. This flag is
+mode explicitly by using the B<-T> command line flag. This flag is
I<strongly> suggested for server programs and any program run on behalf of
-someone else, such as a CGI script. Once taint mode is on, it's on for
+someone else, such as a CGI script. Once taint mode is on, it's on for
the remainder of your script.
While in this mode, Perl takes special precautions called I<taint
When the taint mode (C<-T>) is in effect, the "." directory is removed
from C<@INC>, and the environment variables C<PERL5LIB> and C<PERLLIB>
-are ignored by Perl. You can still adjust C<@INC> from outside the
+are ignored by Perl. You can still adjust C<@INC> from outside the
program by using the C<-I> command line option as explained in
-L<perlrun>. The two environment variables are ignored because
+L<perlrun>. The two environment variables are ignored because
they are obscured, and a user running a program could be unaware that
they are set, whereas the C<-I> option is clearly visible and
therefore permitted.
perl -Mlib=/foo program
The benefit of using C<-Mlib=/foo> over C<-I/foo>, is that the former
-will automagically remove any duplicated directories, while the later
+will automagically remove any duplicated directories, while the latter
will not.
Note that if a tainted string is added to C<@INC>, the following
The PATH isn't the only environment variable which can cause problems.
Because some shells may use the variables IFS, CDPATH, ENV, and
BASH_ENV, Perl checks that those are either empty or untainted when
-starting subprocesses. You may wish to add something like this to your
+starting subprocesses. You may wish to add something like this to your
setid and taint-checking scripts.
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
care whether they use tainted values. Make judicious use of the file
tests in dealing with any user-supplied filenames. When possible, do
opens and such B<after> properly dropping any special user (or group!)
-privileges. Perl doesn't prevent you from opening tainted filenames for reading,
+privileges. Perl doesn't prevent you from
+opening tainted filenames for reading,
so be careful what you print out. The tainting mechanism is intended to
prevent stupid mistakes, not to remove the need for thought.
not be considered bullet-proof, though: it will not prevent the foreign
code to set up infinite loops, allocate gigabytes of memory, or even
abusing perl bugs to make the host interpreter crash or behave in
-unpredictable ways. In any case it's better avoided completely if you're
+unpredictable ways. In any case it's better avoided completely if you're
really concerned about security.
=head2 Security Bugs
Hash Algorithm - Hash algorithms like the one used in Perl are well
known to be vulnerable to collision attacks on their hash function.
Such attacks involve constructing a set of keys which collide into
-the same bucket producing inefficient behavior. Such attacks often
+the same bucket producing inefficient behavior. Such attacks often
depend on discovering the seed of the hash function used to map the
-keys to buckets. That seed is then used to brute-force a key set which
-can be used to mount a denial of service attack. In Perl 5.8.1 changes
+keys to buckets. That seed is then used to brute-force a key set which
+can be used to mount a denial of service attack. In Perl 5.8.1 changes
were introduced to harden Perl to such attacks, and then later in
Perl 5.18.0 these features were enhanced and additional protections
added.
At the time of this writing, Perl 5.18.0 is considered to be
well-hardened against algorithmic complexity attacks on its hash
-implementation. This is largely owed to the following measures
+implementation. This is largely owed to the following measures
mitigate attacks:
=over 4
=item Hash Seed Randomization
In order to make it impossible to know what seed to generate an attack
-key set for, this seed is randomly initialized at process start. This
+key set for, this seed is randomly initialized at process start. This
may be overridden by using the PERL_HASH_SEED environment variable, see
-L<perlrun/PERL_HASH_SEED>. This environment variable controls how
+L<perlrun/PERL_HASH_SEED>. This environment variable controls how
items are actually stored, not how they are presented via
C<keys>, C<values> and C<each>.
Modifying a hash by insertion will change the iteration order of that hash.
This behavior can be overridden by using C<hash_traversal_mask()> from
L<Hash::Util> or by using the PERL_PERTURB_KEYS environment variable,
-see L<perlrun/PERL_PERTURB_KEYS>. Note that this feature controls the
+see L<perlrun/PERL_PERTURB_KEYS>. Note that this feature controls the
"visible" order of the keys, and not the actual order they are stored in.
=item Bucket Order Perturbance
When items collide into a given hash bucket the order they are stored in
-the chain is no longer predictable in Perl 5.18. This has the intention
-to make it harder to observe a collisions. This behavior can be overridden by using
+the chain is no longer predictable in Perl 5.18. This
+has the intention to make it harder to observe a
+collision. This behavior can be overridden by using
the PERL_PERTURB_KEYS environment variable, see L<perlrun/PERL_PERTURB_KEYS>.
=item New Default Hash Function
The source code includes multiple hash algorithms to choose from. While we
believe that the default perl hash is robust to attack, we have included the
-hash function Siphash as a fall-back option. At the time of release of
+hash function Siphash as a fall-back option. At the time of release of
Perl 5.18.0 Siphash is believed to be of cryptographic strength. This is
not the default as it is much slower than the default hash.
=back
Without compiling a special Perl, there is no way to get the exact same
-behavior of any versions prior to Perl 5.18.0. The closest one can get
+behavior of any versions prior to Perl 5.18.0. The closest one can get
is by setting PERL_PERTURB_KEYS to 0 and setting the PERL_HASH_SEED
-to a known value. We do not advise those settings for production use
+to a known value. We do not advise those settings for production use
due to the above security considerations.
B<Perl has never guaranteed any ordering of the hash keys>, and
one large indistinguishable list.
If no C<return> is found and if the last statement is an expression, its
-value is returned. If the last statement is a loop control structure
-like a C<foreach> or a C<while>, the returned value is unspecified. The
+value is returned. If the last statement is a loop control structure
+like a C<foreach> or a C<while>, the returned value is unspecified. The
empty sub returns the empty list.
X<subroutine, return value> X<return value> X<return>
all capitals is a loosely-held convention meaning it will be called
indirectly by the run-time system itself, usually due to a triggered event.
Subroutines whose name start with a left parenthesis are also reserved the
-same way. The following is a list of some subroutines that currently do
+same way. The following is a list of some subroutines that currently do
special, pre-defined things.
=over
X<state> X<state variable> X<static> X<variable, persistent> X<variable, static> X<closure>
There are two ways to build persistent private variables in Perl 5.10.
-First, you can simply use the C<state> feature. Or, you can use closures,
+First, you can simply use the C<state> feature. Or, you can use closures,
if you want to stay compatible with releases older than 5.10.
=head3 Persistent variables via state()
It's also worth taking a moment to explain what happens when you
C<local>ize a member of a composite type (i.e. an array or hash element).
-In this case, the element is C<local>ized I<by name>. This means that
+In this case, the element is C<local>ized I<by name>. This means that
when the scope of the C<local()> ends, the saved value will be
restored to the hash element whose key was named in the C<local()>, or
the array element whose index was named in the C<local()>. If that
You can use the C<delete local $array[$idx]> and C<delete local $hash{key}>
constructs to delete a composite type entry for the current block and restore
-it when it ends. They return the array/hash value before the localization,
+it when it ends. They return the array/hash value before the localization,
which means that they are respectively equivalent to
do {
$val
}
-except that for those the C<local> is scoped to the C<do> block. Slices are
+except that for those the C<local> is
+scoped to the C<do> block. Slices are
also accepted.
my %hash = (
The scalar/list context for the subroutine and for the right-hand
side of assignment is determined as if the subroutine call is replaced
-by a scalar. For example, consider:
+by a scalar. For example, consider:
data(2,3) = get_data(3,4);
all the subroutines are called in a list context.
Lvalue subroutines are convenient, but you have to keep in mind that,
-when used with objects, they may violate encapsulation. A normal
+when used with objects, they may violate encapsulation. A normal
mutator can check the supplied argument before setting the attribute
-it is protecting, an lvalue subroutine cannot. If you require any
+it is protecting, an lvalue subroutine cannot. If you require any
special processing when storing and retrieving the values, consider
using the CPAN module Sentinel or something similar.
baz(); # recursive call
}
+It is a known bug that lexical subroutines cannot be used as the C<SUBNAME>
+argument to C<sort>. This will be fixed in a future version of Perl.
+
=head3 C<state sub> vs C<my sub>
What is the difference between "state" subs and "my" subs? Each time that
that must start with that character (optionally preceded by C<my>,
C<our> or C<local>), with the exception of C<$>, which will
accept any scalar lvalue expression, such as C<$foo = 7> or
-C<< my_function()->[0] >>. The value passed as part of C<@_> will be a
+C<< my_function()->[0] >>. The value passed as part of C<@_> will be a
reference to the actual argument given in the subroutine call,
obtained by applying C<\> to that argument.
You can use the C<\[]> backslash group notation to specify more than one
-allowed argument type. For example:
+allowed argument type. For example:
sub myref (\[$@%&*])
As alluded to earlier you can also declare inlined subs dynamically at
BEGIN time if their body consists of a lexically-scoped scalar which
-has no other references. Only the first example here will be inlined:
+has no other references. Only the first example here will be inlined:
BEGIN {
my $var = 1;
};
If you redefine a subroutine that was eligible for inlining, you'll
-get a warning by default. You can use this warning to tell whether or
+get a warning by default. You can use this warning to tell whether or
not a particular subroutine is considered inlinable, since it's
different than the warning for overriding non-inlined subroutines:
C<glob>, the C<< <*> >> glob operator is overridden as well.
In a similar fashion, overriding the C<readline> function also overrides
-the equivalent I/O operator C<< <FILEHANDLE> >>. Also, overriding
+the equivalent I/O operator C<< <FILEHANDLE> >>. Also, overriding
C<readpipe> also overrides the operators C<``> and C<qx//>.
Finally, some built-ins (e.g. C<exists> or C<grep>) can't be overridden.
X<subroutine, declaration>
sub myname;
- $me = myname $0 or die "can't get myname";
+ $me = myname $0 or die "can't get myname";
A bare declaration like that declares the function to be a list operator,
not a unary operator, so you have to be careful to use parentheses (or
This is so that you can write loops like:
do {
- $line = <STDIN>;
- ...
+ $line = <STDIN>;
+ ...
} until !defined($line) || $line eq ".\n"
See L<perlfunc/do>. Note also that the loop control statements described
X<next> X<last> X<redo>
do {{
- next if $x == $y;
- # do something here
+ next if $x == $y;
+ # do something here
}} until $x++ > $z;
For C<last>, you have to be more elaborate:
X<last>
- LOOP: {
- do {
- last if $x = $y**2;
- # do something here
- } while $x++ <= $z;
+ LOOP: {
+ do {
+ last if $x = $y**2;
+ # do something here
+ } while $x++ <= $z;
}
B<NOTE:> The behaviour of a C<my>, C<state>, or
PHASE BLOCK
-The experimental C<given> statement is I<not automatically enabled>; see
+The experimental C<given> statement is I<not automatically enabled>; see
L</"Switch Statements"> below for how to do so, and the attendant caveats.
Unlike in C and Pascal, in Perl these are all defined in terms of BLOCKs,
die "Can't open $FOO: $!" unless open(FOO);
open(FOO) || die "Can't open $FOO: $!";
open(FOO) ? () : die "Can't open $FOO: $!";
- # a bit exotic, that last one
+ # a bit exotic, that last one
The C<if> statement is straightforward. Because BLOCKs are always
bounded by curly brackets, there is never any ambiguity about which
The C<next> command starts the next iteration of the loop:
LINE: while (<STDIN>) {
- next LINE if /^#/; # discard comments
- ...
+ next LINE if /^#/; # discard comments
+ ...
}
The C<last> command immediately exits the loop in question. The
C<continue> block, if any, is not executed:
LINE: while (<STDIN>) {
- last LINE if /^$/; # exit when done with header
- ...
+ last LINE if /^$/; # exit when done with header
+ ...
}
The C<redo> command restarts the loop block without evaluating the
want to skip ahead and get the next record.
while (<>) {
- chomp;
- if (s/\\$//) {
- $_ .= <>;
- redo unless eof();
- }
- # now process $_
+ chomp;
+ if (s/\\$//) {
+ $_ .= <>;
+ redo unless eof();
+ }
+ # now process $_
}
which is Perl shorthand for the more explicitly written version:
LINE: while (defined($line = <ARGV>)) {
- chomp($line);
- if ($line =~ s/\\$//) {
- $line .= <ARGV>;
- redo LINE unless eof(); # not eof(ARGV)!
- }
- # now process $line
+ chomp($line);
+ if ($line =~ s/\\$//) {
+ $line .= <ARGV>;
+ redo LINE unless eof(); # not eof(ARGV)!
+ }
+ # now process $line
}
Note that if there were a C<continue> block on the above code, it would
# inspired by :1,$g/fred/s//WILMA/
while (<>) {
- m?(fred)? && s//WILMA $1 WILMA/;
- m?(barney)? && s//BETTY $1 BETTY/;
- m?(homer)? && s//MARGE $1 MARGE/;
+ m?(fred)? && s//WILMA $1 WILMA/;
+ m?(barney)? && s//BETTY $1 BETTY/;
+ m?(homer)? && s//MARGE $1 MARGE/;
} continue {
- print "$ARGV $.: $_";
- close ARGV if eof; # reset $.
- reset if eof; # reset ?pat?
+ print "$ARGV $.: $_";
+ close ARGV if eof; # reset $.
+ reset if eof; # reset ?pat?
}
If the word C<while> is replaced by the word C<until>, the sense of the
they aren't loops. You can double the braces to make them such, though.
if (/pattern/) {{
- last if /fred/;
- next if /barney/; # same effect as "last",
- # but doesn't document as well
- # do something here
+ last if /fred/;
+ next if /barney/; # same effect as "last",
+ # but doesn't document as well
+ # do something here
}}
This is caused by the fact that a block by itself acts as a loop that
that means that this:
for ($i = 1; $i < 10; $i++) {
- ...
+ ...
}
is the same as this:
$i = 1;
while ($i < 10) {
- ...
+ ...
} continue {
- $i++;
+ $i++;
}
There is one minor difference: if variables are declared with C<my>
C<while> loop) is empty, it is treated as true. That is, both
for (;;) {
- ...
+ ...
}
and
while () {
- ...
+ ...
}
are treated as infinite loops.
$on_a_tty = -t STDIN && -t STDOUT;
sub prompt { print "yes? " if $on_a_tty }
for ( prompt(); <STDIN>; prompt() ) {
- # do something
+ # do something
}
Using C<readline> (or the operator form, C<< <EXPR> >>) as the
for (@ary) { s/foo/bar/ }
for my $elem (@elements) {
- $elem *= 2;
+ $elem *= 2;
}
for $count (reverse(1..10), "BOOM") {
- print $count, "\n";
- sleep(1);
+ print $count, "\n";
+ sleep(1);
}
for (1..15) { print "Merry Christmas\n"; }
foreach $item (split(/:[\\\n:]*/, $ENV{TERMCAP})) {
- print "Item: $item\n";
+ print "Item: $item\n";
}
Here's how a C programmer might code up a particular algorithm in Perl:
for (my $i = 0; $i < @ary1; $i++) {
- for (my $j = 0; $j < @ary2; $j++) {
- if ($ary1[$i] > $ary2[$j]) {
- last; # can't go to outer :-(
- }
- $ary1[$i] += $ary2[$j];
- }
- # this is where that last takes me
+ for (my $j = 0; $j < @ary2; $j++) {
+ if ($ary1[$i] > $ary2[$j]) {
+ last; # can't go to outer :-(
+ }
+ $ary1[$i] += $ary2[$j];
+ }
+ # this is where that last takes me
}
Whereas here's how a Perl programmer more comfortable with the idiom might
OUTER: for my $wid (@ary1) {
INNER: for my $jet (@ary2) {
- next OUTER if $wid > $jet;
- $wid += $jet;
- }
- }
+ next OUTER if $wid > $jet;
+ $wid += $jet;
+ }
+ }
See how much easier this is? It's cleaner, safer, and faster. It's
cleaner because it's less noisy. It's safer because if code gets added
The BLOCK construct can be used to emulate case structures.
SWITCH: {
- if (/^abc/) { $abc = 1; last SWITCH; }
- if (/^def/) { $def = 1; last SWITCH; }
- if (/^xyz/) { $xyz = 1; last SWITCH; }
- $nothing = 1;
+ if (/^abc/) { $abc = 1; last SWITCH; }
+ if (/^def/) { $def = 1; last SWITCH; }
+ if (/^xyz/) { $xyz = 1; last SWITCH; }
+ $nothing = 1;
}
You'll also find that C<foreach> loop used to create a topicalizer
SWITCH:
for ($var) {
- if (/^abc/) { $abc = 1; last SWITCH; }
- if (/^def/) { $def = 1; last SWITCH; }
- if (/^xyz/) { $xyz = 1; last SWITCH; }
- $nothing = 1;
+ if (/^abc/) { $abc = 1; last SWITCH; }
+ if (/^def/) { $def = 1; last SWITCH; }
+ if (/^xyz/) { $xyz = 1; last SWITCH; }
+ $nothing = 1;
}
Such constructs are quite frequently used, both because older versions of
use v5.10.1;
for ($var) {
- when (/^abc/) { $abc = 1 }
- when (/^def/) { $def = 1 }
- when (/^xyz/) { $xyz = 1 }
- default { $nothing = 1 }
+ when (/^abc/) { $abc = 1 }
+ when (/^def/) { $def = 1 }
+ when (/^xyz/) { $xyz = 1 }
+ default { $nothing = 1 }
}
The C<foreach> is the non-experimental way to set a topicalizer.
use v5.10.1;
given ($var) {
- when (/^abc/) { $abc = 1 }
- when (/^def/) { $def = 1 }
- when (/^xyz/) { $xyz = 1 }
- default { $nothing = 1 }
+ when (/^abc/) { $abc = 1 }
+ when (/^def/) { $def = 1 }
+ when (/^xyz/) { $xyz = 1 }
+ default { $nothing = 1 }
}
As of 5.14, that can also be written this way:
use v5.14;
for ($var) {
- $abc = 1 when /^abc/;
- $def = 1 when /^def/;
- $xyz = 1 when /^xyz/;
- default { $nothing = 1 }
+ $abc = 1 when /^abc/;
+ $def = 1 when /^def/;
+ $xyz = 1 when /^xyz/;
+ default { $nothing = 1 }
}
Or if you don't care to play it safe, like this:
use v5.14;
given ($var) {
- $abc = 1 when /^abc/;
- $def = 1 when /^def/;
- $xyz = 1 when /^xyz/;
- default { $nothing = 1 }
+ $abc = 1 when /^abc/;
+ $def = 1 when /^def/;
+ $xyz = 1 when /^xyz/;
+ default { $nothing = 1 }
}
The arguments to C<given> and C<when> are in scalar context,
sub unimplemented { ... }
eval { unimplemented() };
if ($@ =~ /^Unimplemented at /) {
- say "I found an ellipsis!";
+ say "I found an ellipsis!";
}
You can only use the elliptical statement to stand in for a
...;
eval { ... };
sub somemeth {
- my $self = shift;
- ...;
+ my $self = shift;
+ ...;
}
$x = do {
- my $n;
- ...;
- say "Hurrah!";
- $n;
+ my $n;
+ ...;
+ say "Hurrah!";
+ $n;
};
The elliptical statement cannot stand in for an expression that
case, it doesn't think the C<...> is an ellipsis because it's expecting an
expression instead of a statement:
- @transformed = map { ... } @input; # syntax error
-
-You can use a C<;> inside your block to denote that the C<{ ... }> is a
-block and not a hash reference constructor. Now the ellipsis works:
+ @transformed = map { ... } @input; # syntax error
- @transformed = map {; ... } @input; # ; disambiguates
+Inside your block, you can use a C<;> before the ellipsis to denote that the
+C<{ ... }> is a block and not a hash reference constructor. Now the ellipsis
+works:
- @transformed = map { ...; } @input; # ; disambiguates
+ @transformed = map {; ... } @input; # ';' disambiguates
Note: Some folks colloquially refer to this bit of punctuation as a
"yada-yada" or "triple-dot", but its true name
-is actually an ellipsis. Perl does not yet
-accept the Unicode version, U+2026 HORIZONTAL ELLIPSIS, as an alias for
-C<...>, but someday it may.
+is actually an ellipsis.
=head2 PODs: Embedded Documentation
X<POD> X<documentation>
=cut back to the compiler, nuff of this pod stuff!
sub snazzle($) {
- my $thingie = shift;
- .........
+ my $thingie = shift;
+ .........
}
Note that pod translators should look at only paragraphs beginning
use feature ":5.10";
given ($foo) {
- when (undef) {
- say '$foo is undefined';
- }
- when ("foo") {
- say '$foo is the string "foo"';
- }
- when ([1,3,5,7,9]) {
- say '$foo is an odd digit';
- continue; # Fall through
- }
- when ($_ < 100) {
- say '$foo is numerically less than 100';
- }
- when (\&complicated_check) {
- say 'a complicated check for $foo is true';
- }
- default {
- die q(I don't know what to do with $foo);
- }
+ when (undef) {
+ say '$foo is undefined';
+ }
+ when ("foo") {
+ say '$foo is the string "foo"';
+ }
+ when ([1,3,5,7,9]) {
+ say '$foo is an odd digit';
+ continue; # Fall through
+ }
+ when ($_ < 100) {
+ say '$foo is numerically less than 100';
+ }
+ when (\&complicated_check) {
+ say 'a complicated check for $foo is true';
+ }
+ default {
+ die q(I don't know what to do with $foo);
+ }
}
Before Perl 5.18, C<given(EXPR)> assigned the value of I<EXPR> to
merely a lexically scoped I<B<copy>> (!) of C<$_>, not a dynamically
scoped alias the way C<foreach> does. That made it similar to
- do { my $_ = EXPR; ... }
+ do { my $_ = EXPR; ... }
except that the block was automatically broken out of by a successful
C<when> or an explicit C<break>. Because it was only a copy, and because
case to the next:
given($foo) {
- when (/x/) { say '$foo contains an x'; continue }
- when (/y/) { say '$foo contains a y' }
- default { say '$foo does not contain a y' }
+ when (/x/) { say '$foo contains an x'; continue }
+ when (/y/) { say '$foo contains a y' }
+ default { say '$foo does not contain a y' }
}
=head3 Return value
evaluate to an empty list.
my $price = do {
- given ($item) {
- when (["pear", "apple"]) { 1 }
- break when "vote"; # My vote cannot be bought
- 1e10 when /Mona Lisa/;
- "unknown";
- }
+ given ($item) {
+ when (["pear", "apple"]) { 1 }
+ break when "vote"; # My vote cannot be bought
+ 1e10 when /Mona Lisa/;
+ "unknown";
+ }
};
Currently, C<given> blocks can't always
use v5.10.1;
my $count = 0;
for (@array) {
- when ("foo") { ++$count }
+ when ("foo") { ++$count }
}
print "\@array contains $count copies of 'foo'\n";
use v5.14;
my $count = 0;
for (@array) {
- ++$count when "foo";
+ ++$count when "foo";
}
print "\@array contains $count copies of 'foo'\n";
because Perl 5 would parse the expression
given $foo {
- ...
+ ...
}
as though the argument to C<given> were an element of the hash
sleep(15); # Let thread run for awhile
sub sub1 {
- $a = 0;
+ my $count = 0;
while (1) {
- $a++;
- print("\$a is $a\n");
+ $count++;
+ print("\$count is $count\n");
sleep(1);
}
}
use threads;
use threads::shared;
- my $a :shared = 1;
+ my $x :shared = 1;
my $thr1 = threads->create(\&sub1);
my $thr2 = threads->create(\&sub2);
$thr1->join();
$thr2->join();
- print("$a\n");
+ print("$x\n");
- sub sub1 { my $foo = $a; $a = $foo + 1; }
- sub sub2 { my $bar = $a; $a = $bar + 1; }
+ sub sub1 { my $foo = $x; $x = $foo + 1; }
+ sub sub2 { my $bar = $x; $x = $bar + 1; }
-What do you think C<$a> will be? The answer, unfortunately, is I<it
-depends>. Both C<sub1()> and C<sub2()> access the global variable C<$a>, once
+What do you think C<$x> will be? The answer, unfortunately, is I<it
+depends>. Both C<sub1()> and C<sub2()> access the global variable C<$x>, once
to read and once to write. Depending on factors ranging from your
thread implementation's scheduling algorithm to the phase of the moon,
-C<$a> can be 2 or 3.
+C<$x> can be 2 or 3.
Race conditions are caused by unsynchronized access to shared
data. Without explicit synchronization, there's no way to be sure that
possibility of error:
use threads;
- my $a :shared = 2;
- my $b :shared;
- my $c :shared;
- my $thr1 = threads->create(sub { $b = $a; $a = $b + 1; });
- my $thr2 = threads->create(sub { $c = $a; $a = $c + 1; });
+ my $x :shared = 2;
+ my $y :shared;
+ my $z :shared;
+ my $thr1 = threads->create(sub { $y = $x; $x = $y + 1; });
+ my $thr2 = threads->create(sub { $z = $x; $x = $z + 1; });
$thr1->join();
$thr2->join();
-Two threads both access C<$a>. Each thread can potentially be interrupted
-at any point, or be executed in any order. At the end, C<$a> could be 3
-or 4, and both C<$b> and C<$c> could be 2 or 3.
+Two threads both access C<$x>. Each thread can potentially be interrupted
+at any point, or be executed in any order. At the end, C<$x> could be 3
+or 4, and both C<$y> and C<$z> could be 2 or 3.
-Even C<$a += 5> or C<$a++> are not guaranteed to be atomic.
+Even C<$x += 5> or C<$x++> are not guaranteed to be atomic.
Whenever your program accesses data or resources that can be accessed
by other threads, you must take steps to coordinate access or risk
use threads;
- my $a :shared = 4;
- my $b :shared = 'foo';
+ my $x :shared = 4;
+ my $y :shared = 'foo';
my $thr1 = threads->create(sub {
- lock($a);
+ lock($x);
sleep(20);
- lock($b);
+ lock($y);
});
my $thr2 = threads->create(sub {
- lock($b);
+ lock($y);
sleep(20);
- lock($a);
+ lock($x);
});
This program will probably hang until you kill it. The only way it
first. A guaranteed-to-hang version is more complicated, but the
principle is the same.
-The first thread will grab a lock on C<$a>, then, after a pause during which
+The first thread will grab a lock on C<$x>, then, after a pause during which
the second thread has probably had time to do some work, try to grab a
-lock on C<$b>. Meanwhile, the second thread grabs a lock on C<$b>, then later
-tries to grab a lock on C<$a>. The second lock attempt for both threads will
+lock on C<$y>. Meanwhile, the second thread grabs a lock on C<$y>, then later
+tries to grab a lock on C<$x>. The second lock attempt for both threads will
block, each waiting for the other to release its lock.
This condition is called a deadlock, and it occurs whenever two or
There are a number of ways to handle this sort of problem. The best
way is to always have all threads acquire locks in the exact same
-order. If, for example, you lock variables C<$a>, C<$b>, and C<$c>, always lock
-C<$a> before C<$b>, and C<$b> before C<$c>. It's also best to hold on to locks for
+order. If, for example, you lock variables C<$x>, C<$y>, and C<$z>, always lock
+C<$x> before C<$y>, and C<$y> before C<$z>. It's also best to hold on to locks for
as short a period of time to minimize the risks of deadlock.
The other synchronization primitives described below can suffer from
Since kernel threading can interrupt a thread at any time, they will
uncover some of the implicit locking assumptions you may make in your
-program. For example, something as simple as C<$a = $a + 2> can behave
-unpredictably with kernel threads if C<$a> is visible to other
-threads, as another thread may have changed C<$a> between the time it
+program. For example, something as simple as C<$x = $x + 2> can behave
+unpredictably with kernel threads if C<$x> is visible to other
+threads, as another thread may have changed C<$x> between the time it
was fetched on the right hand side and the time the new value is
stored.
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<$;>.
}
}
else {
- anum = 0;
+ anum = seed();
}
- if (anum)
- (void)srand48_deterministic((Rand_seed_t)anum);
- else
(void)seedDrand01((Rand_seed_t)anum);
PL_srand_called = TRUE;
if (anum)
break;
}
itembytes = s - item;
+ chophere = s;
break;
}
goto append;
case FF_CHOP: /* (for ^*) chop the current item */
- {
+ if (sv != &PL_sv_no) {
const char *s = chophere;
if (chopspace) {
while (isSPACE(*s))
const char *const send = s + len;
item_is_utf8 = DO_UTF8(sv);
+ chophere = s + len;
if (!len)
break;
trans = 0;
gotsome = TRUE;
- chophere = s + len;
source = (U8 *) s;
to_copy = len;
while (s < send) {
len = SvCUR(sv);
if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
goto nuts2;
+#if defined(_AIX)
+ /* XXX Configure test: does getsockopt set the length properly? */
+ if (len == 256)
+ len = sizeof(int);
+#endif
SvCUR_set(sv, len);
*SvEND(sv) ='\0';
PUSHs(sv);
}
else {
NV input = Perl_floor(POPn);
+ const bool pl_isnan = Perl_isnan(input);
when = (Time64_T)input;
- if (when != input) {
+ if (UNLIKELY(pl_isnan || when != input)) {
/* diag_listed_as: gmtime(%f) too large */
Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
"%s(%.0" NVff ") too large", opname, input);
+ if (pl_isnan) {
+ err = NULL;
+ goto failed;
+ }
}
}
if (err == NULL) {
/* diag_listed_as: gmtime(%f) failed */
/* XXX %lld broken for quads */
+ failed:
Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
"%s(%.0" NVff ") failed", opname, when);
}
min++;
if (flags & SCF_DO_STCLASS) {
bool invert = 0;
- SV* my_invlist = sv_2mortal(_new_invlist(0));
+ SV* my_invlist = NULL;
U8 namedclass;
/* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */
/* FALL THROUGH */
case POSIXA:
if (FLAGS(scan) == _CC_ASCII) {
- my_invlist = PL_XPosix_ptrs[_CC_ASCII];
+ my_invlist = invlist_clone(PL_XPosix_ptrs[_CC_ASCII]);
}
else {
_invlist_intersection(PL_XPosix_ptrs[FLAGS(scan)],
assert(flags & SCF_DO_STCLASS_OR);
ssc_union(data->start_class, my_invlist, invert);
}
+ SvREFCNT_dec(my_invlist);
}
if (flags & SCF_DO_STCLASS_OR)
ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
&& is_PROBLEMATIC_LOCALE_FOLD_cp(ender)))
{
if (UTF) {
- const STRLEN unilen = reguni(pRExC_state, ender, s);
+
+ /* Normally, we don't need the representation of the
+ * character in the sizing pass--just its size, but if
+ * folding, we have to actually put the character out
+ * even in the sizing pass, because the size could
+ * change as we juggle things at the end of this loop
+ * to avoid splitting a too-full node in the middle of
+ * a potential multi-char fold [perl #123539] */
+ const STRLEN unilen = (SIZE_ONLY && ! FOLD)
+ ? UNISKIP(ender)
+ : (uvchr_to_utf8((U8*)s, ender) - (U8*)s);
if (unilen > 0) {
s += unilen;
len += unilen;
* cancel out the increment that follows */
len--;
}
+ else if (FOLD) {
+ /* See comment above for [perl #123539] */
+ *(s++) = (char) ender;
+ }
else {
REGC((char)ender, s++);
}
goto fail;
}
+ RX_MATCH_UTF8_set(rx,utf8_target);
reginfo->is_utf8_target = cBOOL(utf8_target);
reginfo->info_aux = NULL;
reginfo->strbeg = strbeg;
}
RX_MATCH_TAINTED_off(rx);
+ RX_MATCH_UTF8_set(rx, utf8_target);
reginfo->prog = rx; /* Yes, sorry that this is confusing. */
reginfo->intuit = 0;
if (RXp_PAREN_NAMES(prog))
(void)hv_iterinit(RXp_PAREN_NAMES(prog));
- RX_MATCH_UTF8_set(rx, utf8_target);
-
/* make sure $`, $&, $', and $digit will work later */
if ( !(flags & REXEC_NOT_FIRST) )
S_reg_set_capture_string(aTHX_ rx,
char *gconvert(double, int, int, char *);
#endif
-#ifdef PERL_NEW_COPY_ON_WRITE
-# ifndef SV_COW_THRESHOLD
+#ifndef SV_COW_THRESHOLD
# define SV_COW_THRESHOLD 0 /* COW iff len > K */
-# endif
-# ifndef SV_COWBUF_THRESHOLD
+#endif
+#ifndef SV_COWBUF_THRESHOLD
# define SV_COWBUF_THRESHOLD 1250 /* COW iff len > K */
-# endif
-# ifndef SV_COW_MAX_WASTE_THRESHOLD
+#endif
+#ifndef SV_COW_MAX_WASTE_THRESHOLD
# define SV_COW_MAX_WASTE_THRESHOLD 80 /* COW iff (len - cur) < K */
-# endif
-# ifndef SV_COWBUF_WASTE_THRESHOLD
+#endif
+#ifndef SV_COWBUF_WASTE_THRESHOLD
# define SV_COWBUF_WASTE_THRESHOLD 80 /* COW iff (len - cur) < K */
-# endif
-# ifndef SV_COW_MAX_WASTE_FACTOR_THRESHOLD
+#endif
+#ifndef SV_COW_MAX_WASTE_FACTOR_THRESHOLD
# define SV_COW_MAX_WASTE_FACTOR_THRESHOLD 2 /* COW iff len < (cur * K) */
-# endif
-# ifndef SV_COWBUF_WASTE_FACTOR_THRESHOLD
+#endif
+#ifndef SV_COWBUF_WASTE_FACTOR_THRESHOLD
# define SV_COWBUF_WASTE_FACTOR_THRESHOLD 2 /* COW iff len < (cur * K) */
-# endif
#endif
/* Work around compiler warnings about unsigned >= THRESHOLD when thres-
hold is 0. */
? count * body_size \
: FIT_ARENA0 (body_size)
#define FIT_ARENA(count,body_size) \
- count \
+ (U32)(count \
? FIT_ARENAn (count, body_size) \
- : FIT_ARENA0 (body_size)
+ : FIT_ARENA0 (body_size))
/* Calculate the length to copy. Specifically work out the length less any
final padding the compiler needed to add. See the comment in sv_upgrade
* set so starts from there. Otherwise, can use memory copy to
* get up to where we are now, and then start from here */
- if (invariant_head <= 0) {
+ if (invariant_head == 0) {
d = dst;
} else {
Copy(s, dst, invariant_head, char);
/* slated for free anyway (and not COW)? */
(sflags & (SVs_TEMP|SVf_IsCOW)) == SVs_TEMP
/* or a swipable TARG */
- || ((sflags & (SVs_PADTMP|SVf_READONLY|SVf_IsCOW))
+ || ((sflags & (SVs_PADTMP|SVs_PADMY|SVf_READONLY
+ |SVf_IsCOW))
== SVs_PADTMP
/* whose buffer is worth stealing */
&& CHECK_COWBUF_THRESHOLD(cur,len)
Tells an SV to use C<ptr> to find its string value. Normally the
string is stored inside the SV, but sv_usepvn allows the SV to use an
outside string. The C<ptr> should point to memory that was allocated
-by L<Newx|perlclib/Memory Management and String Handling>. It must be
+by L<Newx|perlclib/Memory Management and String Handling>. It must be
the start of a Newx-ed block of memory, and not a pointer to the
middle of it (beware of L<OOK|perlguts/Offsets> and copy-on-write),
-and not be from a non-Newx memory allocator like C<malloc>. The
+and not be from a non-Newx memory allocator like C<malloc>. The
string length, C<len>, must be supplied. By default this function
will C<Renew> (i.e. realloc, move) the memory pointed to by C<ptr>,
so that pointer should not be freed or used by the programmer after
case SAVEt_CLEARPADRANGE:
break;
case SAVEt_HELEM: /* hash element */
+ case SAVEt_SV: /* scalar reference */
sv = (const SV *)POPPTR(ss,ix);
- TOPPTR(nss,ix) = sv_dup_inc(sv, param);
+ TOPPTR(nss,ix) = SvREFCNT_inc(sv_dup_inc(sv, param));
/* fall through */
case SAVEt_ITEM: /* normal string */
case SAVEt_GVSV: /* scalar slot in GV */
- case SAVEt_SV: /* scalar reference */
sv = (const SV *)POPPTR(ss,ix);
TOPPTR(nss,ix) = sv_dup_inc(sv, param);
+ if (type == SAVEt_SV)
+ break;
/* fall through */
case SAVEt_FREESV:
case SAVEt_MORTALIZESV:
case SAVEt_SVREF: /* scalar reference */
sv = (const SV *)POPPTR(ss,ix);
TOPPTR(nss,ix) = sv_dup_inc(sv, param);
+ if (type == SAVEt_SVREF)
+ SvREFCNT_inc_simple_void((SV *)TOPPTR(nss,ix));
ptr = POPPTR(ss,ix);
TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
break;
break;
case SAVEt_AELEM: /* array element */
sv = (const SV *)POPPTR(ss,ix);
- TOPPTR(nss,ix) = sv_dup_inc(sv, param);
+ TOPPTR(nss,ix) = SvREFCNT_inc(sv_dup_inc(sv, param));
i = POPINT(ss,ix);
TOPINT(nss,ix) = i;
av = (const AV *)POPPTR(ss,ix);
the SV if the SV does not contain a string. The SV may cache the
stringified version becoming C<SvPOK>. Handles 'get' magic. The
C<len> variable will be set to the length of the string (this is a macro, so
-don't use C<&len>). See also C<SvPVx> for a version which guarantees to
+don't use C<&len>). See also C<SvPVx> for a version which guarantees to
evaluate sv only once.
Note that there is no guarantee that the return value of C<SvPV()> is
d_isnan='undef'
d_isnanl='undef'
d_killpg='undef'
-d_lc_monetary_2008='undef'
d_lchown='undef'
d_ldbl_dig='undef'
d_libm_lib_version='undef'
}
eval("sub flim () { 0; }") unless defined(&flim);
eval("sub flam () { 1; }") unless defined(&flam);
+ eval 'sub blli_in_use {
+ my($blli) = @_;
+ eval q({ ($blli->{l2_proto}) || ($blli->{l3_proto}); });
+ }' unless defined(&blli_in_use);
eval 'sub multiline () {"multilinestring";}' unless defined(&multiline);
}
1;
# go through testing all the locales on the platform.
if (CORE::fc(chr utf8::unicode_to_native(0xdf)) ne "ss") {
if ($locale =~ /UTF-?8/i) {
- diag("Cannot verify $locale with UTF-8 in name is a UTF-8 locale");
- #ok (0, "Verify $locale with UTF-8 in name is a UTF-8 locale");
+ ok (0, "Verify $locale with UTF-8 in name is a UTF-8 locale");
}
}
else {
)
}
->(("${\''}")[0,0]);
+
+# [perl #122995] Hang when compiling while(1) in a sub-list
+# No ok() or is() necessary.
+sub foo { () = ($a, my $b, ($c, do { while(1) {} })) }
is(quotemeta($char), "\\$char", "quotemeta '\\N{U+D7}' locale in UTF-8");
is(length(quotemeta($char)), 2, "quotemeta '\\N{U+D7}' locale in UTF-8 length");
- SKIP: {
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 2
- }
- $char = "\N{U+D8}"; # Every non-ASCII Latin1 is quoted in locale.
- utf8::upgrade($char);
- is(quotemeta($char), "\\$char", "quotemeta '\\N{U+D8}' locale in UTF-8");
- is(length(quotemeta($char)), 2, "quotemeta '\\N{U+D8}' locale in UTF-8 length");
- }
+ $char = "\N{U+D8}"; # Every non-ASCII Latin1 is quoted in locale.
+ utf8::upgrade($char);
+ is(quotemeta($char), "\\$char", "quotemeta '\\N{U+D8}' locale in UTF-8");
+ is(length(quotemeta($char)), 2, "quotemeta '\\N{U+D8}' locale in UTF-8 length");
is(quotemeta("\x{263a}"), "\\\x{263a}", "quotemeta locale Unicode quoted");
is(length(quotemeta("\x{263a}")), 2, "quotemeta locale Unicode quoted length");
require 'test.pl';
}
use warnings;
-plan( tests => 182 );
+plan( tests => 183 );
# these shouldn't hang
{
@b = sort CORE::reverse (4,1,3,2);
cmp_ok("@b",'eq','1 2 3 4','CORE::reverse then sort');
+eval { @b = sort CORE::revers (4,1,3,2); };
+like($@, qr/^Undefined sort subroutine "CORE::revers" called at /);
sub twoface { no warnings 'redefine'; *twoface = sub { $a <=> $b }; &twoface }
use strict;
use Config;
-plan tests => 816;
+plan tests => 801;
$| = 1;
is($res, 1, "$desc: res value");
is($one, 'a', "$desc: \$1 value");
- SKIP: {
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 10 }
SKIP: {
skip 'No locale testing without d_setlocale', 10 if(!$Config{d_setlocale});
is_tainted($one, "$desc: \$1 tainted");
is($res, 1, "$desc: res value");
is($one, 'abcd', "$desc: \$1 value");
- }
$desc = "match /g with pattern tainted via locale";
$s = 'abcd';
($res) = $s =~ /$TAINT(.+)/;
$one = $1;
- SKIP: {
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 12
- }
isnt_tainted($s, "$desc: s not tainted");
is_tainted($res, "$desc: res tainted");
is_tainted($one, "$desc: \$1 tainted");
is($res, 'a', "$desc: res value");
is($res2,'b', "$desc: res2 value");
is($one, 'd', "$desc: \$1 value");
- }
SKIP: {
- skip 'No locale testing without d_setlocale', 12 if(!$Config{d_setlocale}) || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/;
+ skip 'No locale testing without d_setlocale', 12 if(!$Config{d_setlocale});
$desc = "match with pattern tainted via locale, list cxt";
is($one, 'd', "$desc: \$1 value");
$desc = "substitution /ge with pattern tainted";
- SKIP: {
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 18
- }
$s = 'abc';
{
is($s, 'abcd', "$desc: s value");
is($res, 'xyz', "$desc: res value");
is($one, 'abcd', "$desc: \$1 value");
- }
SKIP: {
- skip 'No locale testing without d_setlocale', 18 if(!$Config{d_setlocale} || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/);
+ skip 'No locale testing without d_setlocale', 18 if(!$Config{d_setlocale});
$desc = "substitution with pattern tainted via locale";
$desc = "use re 'taint': match /g with string tainted";
$s = 'abcd' . $TAINT;
- SKIP: {
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 10
- }
$res = $s =~ /(.)/g;
$one = $1;
is_tainted($s, "$desc: s tainted");
is_tainted($one, "$desc: \$1 tainted");
is($res, 1, "$desc: res value");
is($one, 'a', "$desc: \$1 value");
- }
$desc = "use re 'taint': match with string tainted, list cxt";
$s = 'abcd' . $TAINT;
($res, $res2) = $s =~ /(.)/g;
$one = $1;
- SKIP: {
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 12
- }
is_tainted($s, "$desc: s tainted");
is_tainted($res, "$desc: res tainted");
is_tainted($res2, "$desc: res2 tainted");
is($res, 'a', "$desc: res value");
is($res2,'b', "$desc: res2 value");
is($one, 'd', "$desc: \$1 value");
- }
$desc = "use re 'taint': match with pattern tainted";
is($one, 'a', "$desc: \$1 value");
SKIP: {
- skip 'No locale testing without d_setlocale', 10 if(!$Config{d_setlocale} || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/);
+ skip 'No locale testing without d_setlocale', 10 if(!$Config{d_setlocale});
$desc = "use re 'taint': match with pattern tainted via locale";
is($one, 'd', "$desc: \$1 value");
SKIP: {
- skip 'No locale testing without d_setlocale', 12 if(!$Config{d_setlocale} || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/);
+ skip 'No locale testing without d_setlocale', 12 if(!$Config{d_setlocale});
$desc = "use re 'taint': match with pattern tainted via locale, list cxt";
is_tainted($one, "$desc: \$1 tainted");
is($s, 'xyz', "$desc: s value");
is($res, 1, "$desc: res value");
- SKIP: {
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 18
- }
is($one, 'abcd', "$desc: \$1 value");
$desc = "use re 'taint': substitution /g with string tainted";
is($s, 'abcd', "$desc: s value");
is($res, 'xyz', "$desc: res value");
is($one, 'abcd', "$desc: \$1 value");
- }
$desc = "use re 'taint': substitution /e with string tainted";
is($one, 'abcd', "$desc: \$1 value");
SKIP: {
- skip 'No locale testing without d_setlocale', 18 if(!$Config{d_setlocale} || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/);
+ skip 'No locale testing without d_setlocale', 18 if(!$Config{d_setlocale});
+
$desc = "use re 'taint': substitution with pattern tainted via locale";
$s = 'abcd';
isnt_tainted($b, "regex optimization of single char /[]/i doesn't taint");
}
-SKIP: {
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 4
- }
+{
# RT 81230: tainted value during FETCH created extra ref to tied obj
package P81230;
}
SKIP: {
- skip 'No locale testing without d_setlocale', 4 if(!$Config{d_setlocale} || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/);
+ skip 'No locale testing without d_setlocale', 4 if(!$Config{d_setlocale});
use feature 'fc';
BEGIN {
$_ = "$TAINT".reset "x";
is eval { eval $::x.1 }, 1, 'reset does not taint undef';
+# [perl #122669]
+{
+ # See the comment above the first formline test.
+ local $ENV{PATH} = $ENV{PATH};
+ $ENV{PATH} = $old_env_path if $Is_MSWin32;
+ is runperl(
+ switches => [ '-T' ],
+ prog => 'use constant K=>$^X; 0 if K; BEGIN{} use strict; '
+ .'print 122669, qq-\n-',
+ stderr => 1,
+ ), "122669\n",
+ 'tainted constant as logop condition should not prevent "use"';
+}
+
# This may bomb out with the alarm signal so keep it last
SKIP: {
skip "No alarm()" unless $Config{d_alarm};
require './test.pl';
}
-plan tests => 70;
+plan tests => 72;
# These tests make sure, among other things, that we don't end up
# burning tons of CPU for dates far in the future.
like $warning, qr/^localtime\($small_time_f\) too small/;
like $warning, qr/^localtime\($small_time_f\) failed/m;
}
+
+{
+ local $^W;
+ scalar gmtime("NaN");
+ pass('[perl #123495] gmtime(NaN) does not crash');
+ scalar localtime("NaN");
+ pass('localtime(NaN) does not crash');
+}
my $bas_tests = 21;
# number of tests in section 3
-my $bug_tests = 66 + 3 * 3 * 5 * 2 * 3 + 2 + 66 + 4 + 2 + 3 + 96 + 11;
+my $bug_tests = 66 + 3 * 3 * 5 * 2 * 3 + 2 + 66 + 4 + 2 + 3 + 96 + 11 + 3;
# number of tests in section 4
my $hmb_tests = 37;
is $x, undef, 'formats in subs do not leak';
}
+fresh_perl_is(<<'EOP', <<'EXPECT',
+use warnings 'syntax' ;
+format STDOUT =
+^*|^*
+my $x = q/dd/, $x
+.
+write;
+EOP
+dd|
+EXPECT
+ { stderr => 1 }, '#123245 panic in sv_chop');
+
+fresh_perl_is(<<'EOP', <<'EXPECT',
+use warnings 'syntax' ;
+format STDOUT =
+^*|^*
+my $x = q/dd/
+.
+write;
+EOP
+Not enough format arguments at - line 4.
+dd|
+EXPECT
+ { stderr => 1 }, '#123245 different panic in sv_chop');
+
+fresh_perl_is(<<'EOP', <<'EXPECT',
+format STDOUT =
+# x at the end to make the spaces visible
+@... x
+q/a/
+.
+write;
+EOP
+a x
+EXPECT
+ { stderr => 1 }, '#123538 crash in FF_MORE');
#############################
## Section 4
-Digest::MD5 cpan/Digest-MD5/t/files.t c1417867017210ce3d199eb9d55d8ef61fdf1a83
+CPAN cpan/CPAN/lib/CPAN/Author.pm 792d7c8fbe6ed45e1244e589a8b712878c5dd2a5
+CPAN cpan/CPAN/lib/CPAN/CacheMgr.pm 132adb7f96014ec7ded45457044ed925d3181475
+CPAN cpan/CPAN/lib/CPAN/FTP.pm 3f0d5fc572c8749a566d73ca892c6c89ce3fb676
+CPAN cpan/CPAN/lib/CPAN/HandleConfig.pm e52052b6ef6d1d664f0ffa6cf01d48a8d1321520
+CPAN cpan/CPAN/lib/CPAN/HTTP/Client.pm 242842ca566fd8e3d776deb549ff758a571ca2e3
+CPAN cpan/CPAN/lib/CPAN/Index.pm 73aee30450127c5ac4dc05abc2c10a8accd4b198
+CPAN cpan/CPAN/lib/CPAN/LWP/UserAgent.pm e09525b0c2377c5ac28b7fad1b6d70c57e343913
+CPAN cpan/CPAN/lib/CPAN/Mirrors.pm 580e74746abaf1628d533015d5b529d82a470af4
+Digest::MD5 cpan/Digest-MD5/t/files.t bdbe05b705d9da305fedce7a9f4b6ba63250c7cf
Encode cpan/Encode/bin/enc2xs f60036fd3574ec05c9aab7f4db00a828d5dea92d
Encode cpan/Encode/Byte/Makefile.PL 0986e25f981a3bf182a13a0060d28d4efedd87e6
Encode cpan/Encode/CN/Makefile.PL 5507a49d822d0c1d14e967f4595e29e9c873540b
Encode cpan/Encode/TW/Makefile.PL 0cc44f95e59f45c0fb3b66bde41525f13c19a25c
Module::Build cpan/Module-Build/lib/Module/Build/ConfigData.pm 85eb9656e68d1f256737dc52d86b5d0fed28f832
PerlIO::via::QuotedPrint cpan/PerlIO-via-QuotedPrint/t/QuotedPrint.t ca39f0146e89de02c746e199c45dcb3e5edad691
+Pod::Parser cpan/Pod-Parser/lib/Pod/PlainText.pm f0b490545b4e52e141450d1192d0ca00bd8d7a82
Text::Balanced cpan/Text-Balanced/t/01_compile.t 1598cf491a48fa546260a2ec41142abe84da533d
Text::Balanced cpan/Text-Balanced/t/02_extbrk.t 6ba1b64a4604e822dc2260b8ffcea6b406339ee8
Text::Balanced cpan/Text-Balanced/t/03_extcbk.t 3307c980af28963414cab799c427b359ef3b8657
# Exceptions that are found in dual-life bin dirs but aren't
# installed by default; some occur only during testing:
my $not_installed = qr{^(?:
- \.\./cpan/Archive-Tar/bin/ptar.*
- |
- \.\./cpan/JSON-PP/bin/json_pp
- |
- \.\./cpan/IO-Compress/bin/zipdetails
- |
\.\./cpan/Encode/bin/u(?:cm(?:2table|lint|sort)|nidump)
|
\.\./cpan/Module-(?:Metadata|Build)
require './test.pl';
}
-plan tests => 722; # Update this when adding/deleting tests.
+plan tests => 726; # Update this when adding/deleting tests.
run_tests() unless caller;
is(qr/\b\v$/, '(?^:\b\v$)', 'qr/\b\v$/');
}
- SKIP: { # Test that charset modifier work, and are interpolated
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 13
- }
+ { # Test that charset modifier work, and are interpolated
is(qr/\b\v$/, '(?^:\b\v$)', 'Verify no locale, no unicode_strings gives default modifier');
is(qr/(?l:\b\v$)/, '(?^:(?l:\b\v$))', 'Verify infix l modifier compiles');
is(qr/(?u:\b\v$)/, '(?^:(?u:\b\v$))', 'Verify infix u modifier compiles');
like("X", qr/$x/, "UTF-8 of /[x]/i matches upper case");
}
+ { # [perl #123539]
+ like("TffffffffffffTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT5TTTTTTTTTTTTTTTTTTTTTTTTT3TTgTTTTTTTTTTTTTTTTTTTTT2TTTTTTTTTTTTTTTTTTTTTTTHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHiHHHHHHHfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&ffff", qr/TffffffffffffTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT5TTTTTTTTTTTTTTTTTTTTTTTTT3TTgTTTTTTTTTTTTTTTTTTTTT2TTTTTTTTTTTTTTTTTTTTTTTHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHiHHHHHHHfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&ffff/il, "");
+ like("TffffffffffffT\x{100}TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT5TTTTTTTTTTTTTTTTTTTTTTTTT3TTgTTTTTTTTTTTTTTTTTTTTT2TTTTTTTTTTTTTTTTTTTTTTTHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHiHHHHHHHfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&ffff", qr/TffffffffffffT\x{100}TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT5TTTTTTTTTTTTTTTTTTTTTTTTT3TTgTTTTTTTTTTTTTTTTTTTTT2TTTTTTTTTTTTTTTTTTTTTTTHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHiHHHHHHHfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&ffff/il, "");
+ }
+
+ { # [perl #123604]
+ my($s, $x, @x) = ('abc', 'a', 'd');
+ my $long = 'b' x 2000;
+ my $eval = q{$s =~ m{$x[bbb]c} ? 1 : 0};
+ $eval =~ s{bbb}{$long};
+ my $match = eval $eval;
+ ok(1, "did not crash");
+ ok($match, "[bbb...] resolved as character class, not subscript");
+ }
} # End of sub run_tests
1;
utf8::upgrade($utf8);
is(fc($latin1), fc($utf8), "fc() gives the same results for \\x{$_} in Latin-1 and UTF-8 under unicode_strings");
SKIP: {
- skip 'No locale testing without d_setlocale', 2 if(!$Config{d_setlocale}) || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/;
+ skip 'No locale testing without d_setlocale', 2 if(!$Config{d_setlocale});
BEGIN {
if($Config{d_setlocale}) {
require locale; import locale;
is(fc($latin1), lc($latin1), "use locale; fc(qq{\\x{$_}}), lc(qq{\\x{$_}}) when qq{\\x{$_}} is in latin-1");
is(fc($utf8), lc($utf8), "use locale; fc(qq{\\x{$_}}), lc(qq{\\x{$_}}) when qq{\\x{$_}} is in latin-1");
}
- SKIP: {
- if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
- ) {
- skip "no locale support", 2
- }
+ {
no feature 'unicode_strings';
is(fc($latin1), lc($latin1), "under nothing, fc() for <256 is the same as lc");
}
$have_setlocale++;
}
};
-if (
- !$Config::Config{d_setlocale}
- || $Config::Config{ccflags} =~ /\bD?NO_LOCALE(_|\b)/
-) {
- $have_setlocale = 0;
-}
SKIP: {
if (!$have_setlocale) {
s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
if (check_keyword) {
char *s2 = PL_tokenbuf;
+ STRLEN len2 = len;
if (allow_pack && len > 6 && strnEQ(s2, "CORE::", 6))
- s2 += 6, len -= 6;
- if (keyword(s2, len, 0))
+ s2 += 6, len2 -= 6;
+ if (keyword(s2, len2, 0))
return start;
}
start_force(PL_curforce);
&& !(last_un_char == '$' || last_un_char == '@'
|| last_un_char == '&')
&& isALPHA(*s) && s[1] && isALPHA(s[1])) {
- char *d = tmpbuf;
+ char *d = s;
while (isALPHA(*s))
- *d++ = *s++;
- *d = '\0';
- if (keyword(tmpbuf, d - tmpbuf, 0))
+ s++;
+ if (keyword(d, s - d, 0))
weight -= 150;
}
if (un_char == last_un_char + 1)
*/
/*#define HAS_LOCALECONV / **/
-/* HAS_LC_MONETARY_2008:
- * This symbol, if defined, indicates that the localeconv routine is
- * available and has the additional members added in POSIX 1003.1-2008.
- */
-/*#define HAS_LC_MONETARY_2008 / **/
-
/* HAS_LOCKF:
* This symbol, if defined, indicates that the lockf routine is
* available to do file locking.
#endif
/* Generated from:
- * 1efb97c1f4b2c9e6bb17b9172f43cc7f281124904ecca38fa6561d6800432847 config_h.SH
- * 87143cb3dacf7a54fe1df682d22e85daae58d626055b7bd02efa3d12d3f05c27 uconfig.sh
+ * 7557e985de18f71e80f627226b454bc8eaf20477dcf0c45b5b2c51ec792f5c89 config_h.SH
+ * dbc8d38ba52ae23e5423418bb3f56b1b6fcdaa82cf71ba0be3463e8221bfe0c0 uconfig.sh
* ex: set ro: */
d_isnan='undef'
d_isnanl='undef'
d_killpg='undef'
-d_lc_monetary_2008='undef'
d_lchown='undef'
d_ldbl_dig='undef'
d_libm_lib_version='undef'
d_isnan='undef'
d_isnanl='undef'
d_killpg='undef'
-d_lc_monetary_2008='undef'
d_lchown='undef'
d_ldbl_dig='undef'
d_libm_lib_version='undef'
U32
Perl_seed(pTHX)
{
-#if defined(__OpenBSD__)
- return arc4random();
-#else
dVAR;
/*
* This is really just a quick hack which grabs various garbage
u += SEED_C5 * (U32)PTR2UV(&when);
#endif
return u;
-#endif
}
void
if (!PERLDB_SUB_NN) {
GV *gv = CvGV(cv);
- if (!svp) {
+ if (gv && !svp) {
gv_efullname3(dbsv, gv, NULL);
}
- else if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED))
+ else if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED)) || !gv
|| strEQ(GvNAME(gv), "END")
|| ( /* Could be imported, and old sub redefined. */
(GvCV(gv) != cv || !S_gv_has_usable_name(aTHX_ gv))
utils/h2ph
utils/h2xs
utils/instmodsh
+utils/json_pp
utils/libnetcfg
-utils/perlbug
+utils/perlbug # link = utils/perlthanks
utils/perldoc
utils/perlivp
utils/piconv
utils/pl2pm
utils/pod2html
utils/prove
+utils/ptar
+utils/ptardiff
+utils/ptargrep
+utils/shasum
utils/splain
utils/xsubpp
+utils/zipdetails
x2p/a2p
x2p/find2perl
x2p/s2p # link = x2p/psed
# Files to be built with variable substitution after miniperl is
# available. Dependencies handled manually below (for now).
-pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL
-plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh perlbug perldoc perlivp pl2pm prove splain libnetcfg piconv enc2xs xsubpp pod2html
-plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html
+pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL zipdetails.PL
+plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep shasum splain libnetcfg piconv enc2xs xsubpp pod2html zipdetails
+plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html ./zipdetails
all: $(plextract)
instmodsh: instmodsh.PL ../config.sh
+json_pp: json_pp.PL ../config.sh
+
perlbug: perlbug.PL ../config.sh ../patchlevel.h
perldoc: perldoc.PL ../config.sh
prove: prove.PL ../config.sh
+ptar: ptar.PL ../config.sh
+
+ptardiff: ptardiff.PL ../config.sh
+
+ptargrep: ptargrep.PL ../config.sh
+
pl2pm: pl2pm.PL ../config.sh
+shasum: shasum.PL ../config.sh
+
splain: splain.PL ../config.sh ../lib/diagnostics.pm
libnetcfg: libnetcfg.PL ../config.sh
xsubpp: xsubpp.PL ../config.sh
+zipdetails: zipdetails.PL ../config.sh
+
pod2html: pod2html.PL ../config.sh ../ext/Pod-Html/bin/pod2html
clean:
$in =~ s/\?\?</{/g; # | ??<| {|
$in =~ s/\?\?>/}/g; # | ??>| }|
}
- if ($in =~ s/^\#ifdef __LANGUAGE_PASCAL__//) {
+ if ($in =~ /^\#ifdef __LANGUAGE_PASCAL__/) {
# Tru64 disassembler.h evilness: mixed C and Pascal.
while (<IN>) {
last if /^\#endif/;
$in = "";
next READ;
}
- # Skip inlined functions in headers
- if ($in =~ s/^(extern|static) (__inline__|inline) .*[^;]\s*$//) {
+ if ($in =~ /^extern inline / && # Inlined assembler.
+ $^O eq 'linux' && $file =~ m!(?:^|/)asm/[^/]+\.h$!) {
while (<IN>) {
last if /^}/;
}
This program provides an easy way to send a thank-you message back to the
authors and maintainers of perl.
-If you wish to submit a bug report, please run it without the -T flag.
+If you wish to submit a bug report, please run it without the -T flag
+(or run the program perlbug rather than perlthanks)
EOF
} else {
paraprint <<"EOF";
This program provides an easy way to create a message reporting a
bug in the core perl distribution (along with tests or patches)
to the volunteers who maintain perl at $address. To send a thank-you
-note to $thanksaddress instead of a bug report, please use the -T flag.
+note to $thanksaddress instead of a bug report, please run 'perlthanks'.
Please do not use $0 to send test messages, test whether perl
works, or to report bugs in perl modules from CPAN.
B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]>
S<[ B<-A> ]> S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]>
+B<perlthanks>
+
=head1 DESCRIPTION
=item Can you use C<perlbug> to submit a thank-you note?
-Yes, you can do this by using the C<-T> option.
-Thank-you notes are good. It makes people
+Yes, you can do this by either using the C<-T> option, or by invoking
+the program as C<perlthanks>. Thank-you notes are good. It makes people
smile.
=back
/* may get too much accuracy */
char tbuf[64];
-#ifdef __vax__
- SV *sv = SvNVX(ver) > 10e37 ? newSV(64) : 0;
-#else
SV *sv = SvNVX(ver) > 10e50 ? newSV(64) : 0;
-#endif
char *buf;
#ifdef USE_LOCALE_NUMERIC
const char * const cur_numeric = setlocale(LC_NUMERIC, NULL);
# versioned installation can be obtained by setting INST_TOP above to a
# path that includes an arbitrary version string.
#
-#INST_VER = \5.20.1
+#INST_VER = \5.20.2
#
# Comment this out if you DON'T want your perl installation to have
copy ..\README.tw ..\pod\perltw.pod
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
- copy ..\pod\perldelta.pod ..\pod\perl5201delta.pod
+ copy ..\pod\perldelta.pod ..\pod\perl5202delta.pod
cd ..\win32
$(PERLEXE) $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
-if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
-if exist $(LIBDIR)\Module rmdir /s /q $(LIBDIR)\Module
-if exist $(LIBDIR)\Net\FTP rmdir /s /q $(LIBDIR)\Net\FTP
- -if exist $(LIBDIR)\OpenBSD rmdir /s /q $(LIBDIR)\OpenBSD
-if exist $(LIBDIR)\Package rmdir /s /q $(LIBDIR)\Package
-if exist $(LIBDIR)\Params rmdir /s /q $(LIBDIR)\Params
-if exist $(LIBDIR)\Parse rmdir /s /q $(LIBDIR)\Parse
-if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
-if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
-cd $(PODDIR) && del /f *.html *.bat roffitall \
- perl5201delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
+ perl5202delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
perlapi.pod perlbs2000.pod perlce.pod perlcn.pod perlcygwin.pod \
perldos.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
perlnetware.pod perlopenbsd.pod perlos2.pod perlos390.pod \
perlos400.pod perlplan9.pod perlqnx.pod perlriscos.pod \
perlsolaris.pod perlsymbian.pod perlsynology.pod perltoc.pod \
- perltru64.pod perltw.pod perlvos.pod perlwin32.pod
+ perltru64.pod perltw.pod perluniprops.pod perlvos.pod \
+ perlwin32.pod
-cd ..\utils && del /f h2ph splain perlbug pl2pm c2ph pstruct h2xs \
perldoc perlivp libnetcfg enc2xs piconv cpan *.bat \
xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep shasum corelist config_data zipdetails
d_isnan='define'
d_isnanl='undef'
d_killpg='undef'
-d_lc_monetary_2008='undef'
d_lchown='undef'
d_ldbl_dig='define'
d_libm_lib_version='undef'
d_localtime64='undef'
d_localtime_r='undef'
d_localtime_r_needs_tzset='undef'
-d_locconv='define'
+d_locconv='undef'
d_lockf='undef'
d_longdbl='undef'
d_longlong='undef'
i_langinfo='undef'
i_libutil='undef'
i_limits='define'
-i_locale='undef'
+i_locale='define'
i_machcthr='undef'
i_malloc='define'
i_mallocmalloc='undef'
d_isnan='define'
d_isnanl='undef'
d_killpg='define'
-d_lc_monetary_2008='undef'
d_lchown='undef'
d_ldbl_dig='define'
d_libm_lib_version='undef'
d_isnan='define'
d_isnanl='undef'
d_killpg='define'
-d_lc_monetary_2008='undef'
d_lchown='undef'
d_ldbl_dig='define'
d_libm_lib_version='undef'
# versioned installation can be obtained by setting INST_TOP above to a
# path that includes an arbitrary version string.
#
-#INST_VER *= \5.20.1
+#INST_VER *= \5.20.2
#
# Comment this out if you DON'T want your perl installation to have
copy ..\README.tw ..\pod\perltw.pod
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
- copy ..\pod\perldelta.pod ..\pod\perl5201delta.pod
+ copy ..\pod\perldelta.pod ..\pod\perl5202delta.pod
$(PERLEXE) $(PL2BAT) $(UTILS)
$(MINIPERL) -I..\lib ..\autodoc.pl ..
$(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
-if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
-if exist $(LIBDIR)\Module rmdir /s /q $(LIBDIR)\Module
-if exist $(LIBDIR)\Net\FTP rmdir /s /q $(LIBDIR)\Net\FTP
- -if exist $(LIBDIR)\OpenBSD rmdir /s /q $(LIBDIR)\OpenBSD
-if exist $(LIBDIR)\Package rmdir /s /q $(LIBDIR)\Package
-if exist $(LIBDIR)\Params rmdir /s /q $(LIBDIR)\Params
-if exist $(LIBDIR)\Parse rmdir /s /q $(LIBDIR)\Parse
-if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
-if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
-cd $(PODDIR) && del /f *.html *.bat roffitall \
- perl5201delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
+ perl5202delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
perlapi.pod perlbs2000.pod perlce.pod perlcn.pod perlcygwin.pod \
perldos.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
perlnetware.pod perlopenbsd.pod perlos2.pod perlos390.pod \
perlos400.pod perlplan9.pod perlqnx.pod perlriscos.pod \
perlsolaris.pod perlsymbian.pod perlsynology.pod perltoc.pod \
- perltru64.pod perltw.pod perlvos.pod perlwin32.pod
+ perltru64.pod perltw.pod perluniprops.pod perlvos.pod \
+ perlwin32.pod
-cd ..\utils && del /f h2ph splain perlbug pl2pm c2ph pstruct h2xs \
perldoc perlivp libnetcfg enc2xs piconv cpan *.bat \
xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep shasum corelist config_data zipdetails
perl5180delta.pod \
perl5181delta.pod \
perl5182delta.pod \
+ perl5184delta.pod \
perl5200delta.pod \
perl5201delta.pod \
+ perl5202delta.pod \
perl561delta.pod \
perl56delta.pod \
perl581delta.pod \
perltoot.pod \
perltrap.pod \
perlunicode.pod \
+ perlunicook.pod \
perlunifaq.pod \
perluniintro.pod \
perluniprops.pod \
perl5180delta.man \
perl5181delta.man \
perl5182delta.man \
+ perl5184delta.man \
perl5200delta.man \
perl5201delta.man \
+ perl5202delta.man \
perl561delta.man \
perl56delta.man \
perl581delta.man \
perltoot.man \
perltrap.man \
perlunicode.man \
+ perlunicook.man \
perlunifaq.man \
perluniintro.man \
perluniprops.man \
perl5180delta.html \
perl5181delta.html \
perl5182delta.html \
+ perl5184delta.html \
perl5200delta.html \
perl5201delta.html \
+ perl5202delta.html \
perl561delta.html \
perl56delta.html \
perl581delta.html \
perltoot.html \
perltrap.html \
perlunicode.html \
+ perlunicook.html \
perlunifaq.html \
perluniintro.html \
perluniprops.html \
perl5180delta.tex \
perl5181delta.tex \
perl5182delta.tex \
+ perl5184delta.tex \
perl5200delta.tex \
perl5201delta.tex \
+ perl5202delta.tex \
perl561delta.tex \
perl56delta.tex \
perl581delta.tex \
perltoot.tex \
perltrap.tex \
perlunicode.tex \
+ perlunicook.tex \
perlunifaq.tex \
perluniintro.tex \
perluniprops.tex \
#define snprintf _snprintf
#define vsnprintf _vsnprintf
-#ifdef USING_MSVC6
-/* VC6 has broken NaN semantics: NaN == NaN returns true instead of false */
-#define NAN_COMPARE_BROKEN 1
-#endif
-
/* on VC2003, msvcrt.lib is missing these symbols */
#if _MSC_VER >= 1300 && _MSC_VER < 1400
# pragma intrinsic(_rotl64,_rotr64)
#ifdef MYMALLOC
#define EMBEDMYMALLOC /**/
-/* #define USE_PERL_SBRK /**/
-/* #define PERL_SBRK_VIA_MALLOC /**/
+/* #define USE_PERL_SBRK / **/
+/* #define PERL_SBRK_VIA_MALLOC / **/
#endif
#ifdef PERL_TEXTMODE_SCRIPTS