Andreas König <a.koenig@mind.de>
Andreas Marienborg <andreas.marienborg@gmail.com>
Andreas Schwab <schwab@suse.de>
+Andreas Voegele <andreas@andreasvoegele.com>
Andrei Yelistratov <andrew@sundale.net>
Andrej Borsenkow <Andrej.Borsenkow@mow.siemens.ru>
Andrew Bettison <andrewb@zip.com.au>
Andy Lester <andy@petdance.com>
Anno Siegel <anno4000@lublin.zrz.tu-berlin.de>
Anthony David <adavid@netinfo.com.au>
+Anthony Heading <anthony@ajrh.net>
Anton Berezin <tobez@tobez.org>
Anton Nikishaev <me@lelf.lu>
Anton Tagunov <tagunov@motor.ru>
Dominic Hargreaves <dom@earth.li>
Dominique Dumont <Dominique_Dumont@grenoble.hp.com>
Dominique Quatravaux
+Doug Bell <madcityzen@gmail.com>
Doug Campbell <soup@ampersand.com>
Doug MacEachern <dougm@covalent.net>
Douglas Christopher Wilson <doug@somethingdoug.com>
Duncan Findlay <duncf@debian.org>
E. Choroba <choroba@weed.(none)>
Ed Avis <eda@waniasset.com>
+Ed J <etj@cpan.org>
Ed Mooring <mooring@Lynx.COM>
Ed Santiago <esm@pobox.com>
Eddy Tan <eddy.net@gmail.com>
Gideon Israel Dsouza <gideon@cpan.org>
Giles Lean <giles@nemeton.com.au>
Gisle Aas <gisle@aas.no>
+Glenn D. Golden <gdg@zplane.com>
Glenn Linderman <perl@nevcal.com>
Gordon Lack <gml4410@ggr.co.uk>
Gordon J. Miller <gjm@cray.com>
Johan Holtman
Johan Vromans <jvromans@squirrel.nl>
Johann Klasek <jk@auto.tuwien.ac.at>
+Johann 'Myrkraverk' Oskarsson <johann@myrkraverk.com>
Johannes Plunien <plu@pqpq.de>
John Bley <jbb6@acpub.duke.edu>
John Borwick <jhborwic@unity.ncsu.edu>
Sven Strickroth <sven.strickroth@tu-clausthal.de>
Sven Verdoolaege <skimo@breughel.ufsia.ac.be>
SynaptiCAD, Inc. <sales@syncad.com>
+Tadeusz Sośnierz <tadeusz.sosnierz@onet.pl>
Takis Psarogiannakopoulos <takis@xfree86.org>
Taro KAWAGISHI
Tassilo von Parseval <tassilo.parseval@post.rwth-aachen.de>
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='arm-none-linux-gnueabi-gcc'
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'
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
"url" : "http://perl5.git.perl.org/"
}
},
- "version" : "5.020001"
+ "version" : "5.020002"
}
homepage: http://www.perl.org/
license: http://dev.perl.org/licenses/
repository: http://perl5.git.perl.org/
-version: '5.020001'
+version: '5.020002'
# Here comes the CW tools - TO BE FILLED TO BUILD WITH CW -
-MODULE_DESC = "Perl 5.20.1 for NetWare"
+MODULE_DESC = "Perl 5.20.2 for NetWare"
CCTYPE = CodeWarrior
C_COMPILER = mwccnlm -c
CPP_COMPILER = mwccnlm
# 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
* 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 "c:\\perl\\5.20.1\\lib\\NetWare-x86-multi-thread" /**/
+#define ARCHLIB "c:\\perl\\5.20.2\\lib\\NetWare-x86-multi-thread" /**/
/*#define ARCHLIB_EXP "" /**/
/* ARCHNAME:
* This symbol is the filename expanded version of the BIN symbol, for
* programs that do not want to deal with that at run-time.
*/
-#define BIN "c:\\perl\\5.20.1\\bin\\NetWare-x86-multi-thread" /**/
-#define BIN_EXP "c:\\perl\\5.20.1\\bin\\NetWare-x86-multi-thread" /**/
+#define BIN "c:\\perl\\5.20.2\\bin\\NetWare-x86-multi-thread" /**/
+#define BIN_EXP "c:\\perl\\5.20.2\\bin\\NetWare-x86-multi-thread" /**/
/* BYTEORDER:
* This symbol holds the hexadecimal constant defined in byteorder,
* 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 "c:\\perl\\site\\5.20.1\\lib\\NetWare-x86-multi-thread" /**/
+#define SITEARCH "c:\\perl\\site\\5.20.2\\lib\\NetWare-x86-multi-thread" /**/
/*#define SITEARCH_EXP "" /**/
/* SITELIB:
* 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 "c:\\perl\\site\\5.20.1\\lib" /**/
+#define SITELIB "c:\\perl\\site\\5.20.2\\lib" /**/
/*#define SITELIB_EXP "" /**/
#define SITELIB_STEM "" /**/
@skip{
'cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm', # just a test module
'cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/XS.pm', # just a test module
+ 'cpan/Module-Build/t/lib/DistGen.pm', # just a test module
+ 'cpan/Module-Build/t/lib/MBTest.pm', # just a test module
+ 'cpan/Module-Metadata/t/lib/DistGen.pm', # just a test module
+ 'cpan/Module-Metadata/t/lib/MBTest.pm', # just a test module
+ 'cpan/Module-Metadata/t/lib/Tie/CPHash.pm', # just a test module
'dist/Attribute-Handlers/demo/MyClass.pm', # it's just demonstration code
'dist/Exporter/lib/Exporter/Heavy.pm',
'lib/Carp/Heavy.pm',
# look for a .pm in lib/ based on that:
my ($path) = shift =~ m!^(.*)/!;
my ($last) = $path =~ m!([^/]+)\z!;
+ $last = 'List-Util' if $last eq 'Scalar-List-Utils';
$last =~ tr !-!/!;
return "$path/lib/$last";
}) {
and grep $pm_version eq $_, @{$skip_versions{$pm_file}}) {
print "ok $count - SKIP $pm_file version $pm_version\n";
} else {
- print "not ok $count - $pm_file\n";
+ print "not ok $count - $pm_file version $pm_version\n";
}
} else {
push @diff, @{$module_diffs{$pm_file}};
- print "$pm_file\n";
+ print "$pm_file version $pm_version\n";
}
}
}
my $corelist_file = 'dist/Module-CoreList/lib/Module/CoreList.pm';
my $utils_file = 'dist/Module-CoreList/lib/Module/CoreList/Utils.pm';
-my $pod_file = 'dist/Module-CoreList/lib/Module/CoreList.pod';
my %lines;
my %module_to_file;
write_corelist($corelist,$corelist_file);
-open( my $pod_fh, '<', $pod_file );
-my $pod = join( '', <$pod_fh> );
-
-unless ( $pod =~ /and $perl_vstring releases of perl/ ) {
- warn "Adding $perl_vstring to the list of perl versions covered by Module::CoreList\n";
- $pod =~ s/(currently\s+covers\s+(?:.*?))\s*and\s+(.*?)\s+releases\s+of\s+perl/$1, $2 and $perl_vstring releases of perl/ism;
-}
-
-write_corelist($pod,$pod_file);
-
open( my $utils_fh, '<', $utils_file );
my $utils = join( '', <$utils_fh> );
close $utils_fh;
write_corelist($utils,$utils_file);
warn "All done. Please check over the following files carefully before committing.\nThanks!\n";
-warn "$corelist_file\n$pod_file\n$utils_file\n";
+warn "$corelist_file\n$utils_file\n";
sub write_corelist {
my $content = shift;
=head1 EPIGRAPHS
+=head2 v5.20.2-RC1 - Jonathan "Jonti" Picking, L<"Scampi"|http://www.weebls-stuff.com/other-toons/video/scampi.html>
+
+L<Announced on 2015-02-01 by Steve Hay|http://www.nntp.perl.org/group/perl.perl5.porters/2015/02/msg225273.html>
+
+ I've seen things,
+ I've seen them with my eyes;
+ I've seen things,
+ They're often in disguise.
+
+ Like carrots, handbags, cheese, toilets,
+ Russians, planets, hamsters, weddings,
+ Poets, Stalin, Kuala Lumpur!
+ Pygmies, budgies, Kuala Lumpur!
+
+ I've seen things,
+ I've seen them with my eyes;
+ I've seen things,
+ They're often in disguise.
+
+ Like carrots, handbags, cheese...
+
+=head2 v5.21.8 - Bill Watterson, "Scientific Progress Goes 'Boink': A Calvin and Hobbes Collection"
+
+L<Announced on 2015-01-20 by Matthew Horsfall|http://www.nntp.perl.org/group/perl.perl5.porters/2015/01/msg224869.html>
+
+Calvin: OK Hobbes, press the button and duplicate me.
+Hobbes: Are you sure this is such a good idea?
+Calvin: Brother! You doubting Thomases get in the way of more scientific advances with your stupid ethical questions! This is a *BRILLIANT* idea! Hit the button, will ya?
+Hobbes: I'd hate to be accused of inhibiting scientific progress... Here you go.
+[Box]: *BOINK*
+Hobbes: Scientific progress goes "BOINK"?
+Calvin?: It worked! It worked! I'm a genius!
+Cavlin??: No you're not, you liar! *I* invented this!
+
+=head2 v5.21.7 - Robert Heinlein, The Number of the Beast
+
+L<Announced on 2014-12-20 by Max Maischein|http://www.nntp.perl.org/group/perl.perl5.porters/2014/12/msg223774.html>
+
+ "Zebadiah, Hilda and I salvaged and put everything into the basket.
+ Hilda started to put it into our wardrobe-and it was heavy. So
+ we looked. Packed as tight as when we left Oz. Six bananas-and
+ everything else. Cross my heart. No, go look."
+ "Hmmm- Jake, can you write equations for a picnic basket that
+ refills itself? Will it go on doing so?"
+ "Zeb, equations can be written to describe anything. The description
+ would be simpler for a basket that replenishes itself indefinitely
+ than for one that does it once and stops-I would have to describe
+ the discontinuity."
+
+=head2 v5.21.6 - Jeff Noon, Vurt
+
+L<Announced on 2014-11-20 by Chris 'BinGOs' Williams|http://www.nntp.perl.org/group/perl.perl5.porters/2014/11/msg222448.html>
+
+ GAME CAT
+
+ EXCHANGE MECHANISMS. Sometimes we lose precious
+ things. Friends and colleagues, fellow travellers in the
+ Vurt, sometimes we lose them; even lovers we sometimes
+ lose. And get bad things in exchange: aliens, objects,
+ snakes, and sometimes even death. Things we don't want.
+ This is part of the deal, part of the game deal;
+ all things, in all worlds, must be kept in balance.
+ Kittlings often ask, who decides on the swappings? Now then,
+ some say it's all accidental; that some poor Vurt thing
+ finds himself too close to a door, at too critical a time,
+ just when something real is being lost. Whoosh! Swap time!
+ Others say that some kind of overseer is working the
+ MECHANISMS OF EXCHANGE, deciding the fate of innocents.
+ The Cat can only tease at this, because of the big secrets
+ involved, and because of the levels between you, the reader,
+ and me, the Game Cat. Hey, listen; I've struggled to get
+ where I am today; why should I give you the easy route?
+ Get working, kittlings! Reach up higher. Work the Vurt.
+
+=head2 v5.21.5 - Friso Wiegersma (text), Jean Ferrat (music), Wim Sonneveld (performer), Het Dorp
+
+L<Announced on 2014-10-20 by Abigail|http://www.nntp.perl.org/group/perl.perl5.porters/2014/10/msg221399.html>
+
+ Het Dorp
+
+ Thuis heb ik nog een ansichtkaart
+ waarop een kerk, een kar met paard,
+ een slagerij J. van der Ven.
+ Een kroeg, een juffrouw op de fiets
+ het zegt u hoogstwaarschijnlijk niets,
+ maar 't is waar ik geboren ben.
+ Dit dorp, ik weet nog hoe het was,
+ de boerenkind'ren in de klas,
+ een kar die ratelt op de keien,
+ het raadhuis met een pomp ervoor,
+ een zandweg tussen koren door,
+ het vee, de boerderijen.
+
+ En langs het tuinpad van m'n vader
+ zag ik de hoge bomen staan.
+ Ik was een kind en wist niet beter,
+ dan dat dat nooit voorbij zou gaan.
+
+ Wat leefden ze eenvoudig toen
+ in simp'le huizen tussen groen
+ met boerenbloemen en een heg.
+ Maar blijkbaar leefden ze verkeerd,
+ het dorp is gemoderniseerd
+ en nu zijn ze op de goeie weg.
+ Want ziet, hoe rijk het leven is,
+ ze zien de televisiequiz
+ en wonen in betonnen dozen,
+ met flink veel glas, dan kun je zien
+ hoe of het bankstel staat bij Mien
+ en d'r dressoir met plastic rozen.
+
+ En langs het tuinpad van m'n vader
+ zag ik de hoge bomen staan.
+ Ik was een kind en wist niet beter,
+ dan dat dat nooit voorbij zou gaan.
+
+ De dorpsjeugd klit wat bij elkaar
+ in minirok en beatle-haar
+ en joelt wat mee met beat-muziek.
+ Ik weet wel, het is hun goeie recht,
+ de nieuwe tijd, net wat u zegt,
+ maar het maakt me wat melancholiek.
+ Ik heb hun vaders nog gekend
+ ze kochten zoethout voor een cent
+ ik zag hun moeders touwtjespringen.
+ Dat dorp van toen, het is voorbij,
+ dit is al wat er bleef voor mij:
+ een ansicht en herinneringen.
+
+ Toen ik langs het tuinpad van m'n vader
+ de hoge bomen nog zag staan.
+ Ik was een kind, hoe kon ik weten
+ dat dat voorgoed voorbij zou gaan.
+
+=head2 v5.21.4 - Edgar Allan Poe, The Narrative of Arthur Gordon Pym of Nantucket
+
+L<Announced on 2014-09-20 by Steve Hay|http://www.nntp.perl.org/group/perl.perl5.porters/2014/09/msg220267.html>
+
+ To-day, being in latitude 83° 20', longitude 43° 5' W. (the sea being
+ of an extraordinarily dark colour), we again saw land from the
+ masthead, and, upon a closer scrutiny, found it to be one of a group
+ of very large islands. The shore was precipitous, and the interior
+ seemed to be well wooded, a circumstance which occasioned us great
+ joy. In about four hours from our first discovering the land we came
+ to anchor in ten fathoms, sandy bottom, a league from the coast, as a
+ high surf, with strong ripples here and there, rendered a nearer
+ approach of doubtful expediency. The two largest boats were now
+ ordered out, and a party, well armed (among whome were Peters and
+ myself), proceeded to look for an opening in the reef which appeared
+ to encircle the island. After searching about for some time, we
+ discovered an inlet, which we were entering, when we saw four large
+ canoes put off from the shore, filled with men who seemed to be well
+ armed. We waited for them to come up, and, as they moved with great
+ rapidity, they were soon within hail. Captain Guy now held up a white
+ handkerchief on the blade of an oar, when the strangers made a full
+ stop, and commenced a loud jabbering all at once, intermingled with
+ occasional shouts, in which we could distinguish the words Anamoo-moo!
+ and Lama-Lama! They continued this for at least half an hour, during
+ which we had a good opportunity of observing their appearance.
+
+=head2 v5.20.1 - Lorenzo da Ponte, Così fan tutte
+
+L<Announced on 2014-09-14 by Steve Hay|http://www.nntp.perl.org/group/perl.perl5.porters/2014/09/msg219789.html>
+
+ DORABELLA (as if waking from a daze): Where are they?
+ DON ALFONSO: They've gone.
+ FIORDILIGI: Oh, the cruel bitterness of parting!
+
+ DON ALFONSO:
+ Take heart, my dearest children.
+ Look, in the distance, your lovers are waving to you.
+
+ FIORDILIGI: Bon voyage, my darling!
+ DORABELLA: Bon voyage!
+
+ FIORDILIGI:
+ O heavens! How swiftly the ship is sailing away!
+ It is disappearing already!
+ It is no longer in sight!
+ Oh, may heaven grant it a prosperous voyage!
+
+ DORABELLA: May good luck attend it to the battlefield!
+ DON ALFONSO: And may your sweethearts and my friends be safe!
+
+ FIORDILIGI, DORABELLA, DON ALFONSO:
+ May the wind be gentle,
+ may the sea be calm,
+ and may the elements
+ respond kindly
+ to our wishes.
+
+ -- Lorenzo da Ponte, /Così fan tutte/,
+ trans. Diana Reed
+
=head2 v5.20.1-RC2 - Lorenzo da Ponte, Così fan tutte
L<Announced on 2014-09-07 by Steve Hay|http://www.nntp.perl.org/group/perl.perl5.porters/2014/09/msg219446.html>
…that I can't fix…
…with my hands…
+=head2 v5.18.4 - Robert W. Chambers, "The King in Yellow"
+
+L<Announced on 2014-10-01 by Ricardo Signes|http://www.nntp.perl.org/group/perl.perl5.porters/2014/10/msg220770.html>
+
+ Along the shore the cloud waves break,
+ The twin suns sink beneath the lake,
+ The shadows lengthen
+ In Carcosa.
+
+ Strange is the night where black stars rise,
+ And strange moons circle through the skies
+ But stranger still is
+ Lost Carcosa.
+
+ Songs that the Hyades shall sing,
+ Where flap the tatters of the King,
+ Must die unheard in
+ Dim Carcosa.
+
+ Song of my soul, my voice is dead;
+ Die thou, unsung, as tears unshed
+ Shall dry and die in
+ Lost Carcosa.
+
+ -- Cassilda's Song in "The King in Yellow," Act i, Scene 2.
+ Robert W. Chambers
+
+=head2 v5.18.3 - (no epigraph)
+
+(no epigraph)
+
+=head2 v5.18.3-RC2 - Robert W. Chambers, "The King in Yellow"
+
+L<Announced on 2014-09-27|http://nntp.perl.org/group/perl.perl5.porters/220613>
+
+"Ah! I see it now!" I shrieked. "You have seized the throne and the
+empire. Woe! woe to you who are crowned with the crown of the King in
+Yellow!"
+
+ -- Robert W. Chambers, The King in Yellow, Act I, Scene 2.
+
+=head2 v5.18.3-RC1 - Robert W. Chambers, "The King in Yellow"
+
+L<Announced on 2014-09-17|http://nntp.perl.org/group/perl.perl5.porters/220072>
+
+ CAMILLA: You, sir, should unmask.
+
+ STRANGER: Indeed?
+
+ CASSILDA: Indeed it's time. We all have laid aside disguise but you.
+
+ STRANGER: I wear no mask.
+
+ CAMILLA: (Terrified, aside to Cassilda.) No mask? No mask!
+
+ -- Robert W. Chambers, The King in Yellow, Act I, Scene 2.
+
=head2 v5.18.2 - Miss Manners
L<Announced on 2014-01-06 by Ricardo Signes|http://www.nntp.perl.org/group/perl.perl5.porters/2014/01/msg211224.html>
XXX Generate this with:
- perl Porting/acknowledgements.pl v5.20.1..HEAD
+ perl Porting/acknowledgements.pl v5.20.2..HEAD
=head1 Reporting Bugs
[ACKNOWLEDGEMENTS SECTION FROM PERLDELTA]
We expect to release version [NEXT BLEAD VERSION.SUBVERSION] on [FUTURE
-DATE]. The next major stable release of Perl 5, version 20.0, should
-appear in May 2014.
+DATE]. The next major stable release of Perl 5, version 22.0, should
+appear in May 2015.
[YOUR SALUTATION HERE]
This script is run as:
- perl Porting/make-rmg-checklist \
- --type [BLEAD-POINT or MAINT or ...] > /tmp/rmg.pod
+ perl Porting/make-rmg-checklist \
+ --type [BLEAD-POINT or MAINT or ...] > /tmp/rmg.pod
You can also pass the C<--html> flag to generate an HTML document instead of
POD.
- perl Porting/make-rmg-checklist --html \
- --type [BLEAD-POINT or MAINT or ...] > /tmp/rmg.html
+ perl Porting/make-rmg-checklist --html \
+ --type [BLEAD-POINT or MAINT or ...] > /tmp/rmg.html
=head1 SYNOPSIS
a few weeks before the release, a number of steps are performed,
including bumping the version to 5.10.2
- ...a few weeks passes...
+ ...a few weeks pass...
perl-5.10.2-RC1 is released
sweet-talking somebody with a Github account into obedience is needed. This
is only needed on the day of the release or shortly afterwards.
-=for checklist skip RC
-
=head3 Quotation for release announcement epigraph
-I<SKIP this step for RC>
-
-For all except an RC release of perl, you will need a quotation
-to use as an epigraph to your release announcement.
+You will need a quotation to use as an epigraph to your release announcement.
=head2 Building a release - advance actions
Ensure dual-life CPAN modules are stable, which comes down to:
- for each module that fails its regression tests on $current
- did it fail identically on $previous?
- if yes, "SEP" (Somebody Else's Problem)
- else work out why it failed (a bisect is useful for this)
+ for each module that fails its regression tests on $current
+ did it fail identically on $previous?
+ if yes, "SEP" (Somebody Else's Problem)
+ else work out why it failed (a bisect is useful for this)
- attempt to group failure causes
+ attempt to group failure causes
- for each failure cause
- is that a regression?
- if yes, figure out how to fix it
- (more code? revert the code that broke it)
- else
- (presumably) it's relying on something un-or-under-documented
- should the existing behaviour stay?
- yes - goto "regression"
- no - note it in perldelta as a significant bugfix
- (also, try to inform the module's author)
+ for each failure cause
+ is that a regression?
+ if yes, figure out how to fix it
+ (more code? revert the code that broke it)
+ else
+ (presumably) it's relying on something un-or-under-documented
+ should the existing behaviour stay?
+ yes - goto "regression"
+ no - note it in perldelta as a significant bugfix
+ (also, try to inform the module's author)
=head3 monitor smoke tests for failures
There is a tool to semi-automate this process:
- $ ./perl -Ilib Porting/bump-perl-version -i 5.10.0 5.10.1
+ $ ./perl -Ilib Porting/bump-perl-version -i 5.10.0 5.10.1
Remember that this tool is largely just grepping for '5.10.0' or whatever,
so it will generate false positives. Be careful not change text like
Be particularly careful with F<INSTALL>, which contains a mixture of
C<5.10.0>-type strings, some of which need bumping on every release, and
some of which need to be left unchanged.
-The line in F<INSTALL> about "is binary incompatible with" requires a
-correct choice of earlier version to declare incompatibility with.
+See below in L<"update INSTALL"> for more details.
+
+For the first RC release leading up to a BLEAD-FINAL release, update the
+description of which releases are now "officially" supported in
+F<pod/perlpolicy.pod>.
When doing a BLEAD-POINT or BLEAD-FINAL release, also make sure the
C<PERL_API_*> constants in F<patchlevel.h> are in sync with the version
After editing, regenerate uconfig.h (this must be run on a system with a
/bin/sh available):
- $ perl regen/uconfig_h.pl
+ $ perl regen/uconfig_h.pl
This might not cause any new changes.
+You may have to add stub entries in C<%Module::CoreList::version>,
+C<%Module::CoreList::deprecated> and C<%Module::CoreList::Utils::delta>.
+If so, you must up their version numbers as well.
+
Test your changes:
- $ git clean -xdf # careful if you don't have local files to keep!
- $ ./Configure -des -Dusedevel
- $ make
- $ make test
+ $ git clean -xdf # careful if you don't have local files to keep!
+ $ ./Configure -des -Dusedevel
+ $ make
+ $ make test
Commit your changes:
- $ git status
- $ git diff
- B<review the delta carefully>
+ $ git status
+ $ git diff
+ B<review the delta carefully>
- $ git commit -a -m 'Bump the perl version in various places for 5.x.y'
+ $ git commit -a -m 'Bump the perl version in various places for 5.x.y'
At this point you may want to compare the commit with a previous bump to
see if they look similar. See commit f7cf42bb69 for an example of a
=head3 update INSTALL
-Review and update INSTALL to account for the change in version number;
-in particular, the "Coexistence with earlier versions of perl 5" section.
+Review and update INSTALL to account for the change in version number.
+The lines in F<INSTALL> about "is not binary compatible with" may require a
+correct choice of earlier version to declare incompatibility with. These are
+in the "Changes and Incompatibilities" and "Coexistence with earlier versions
+of perl 5" sections.
Be particularly careful with the section "Upgrading from 5.X.Y or earlier".
The "X.Y" needs to be changed to the most recent version that we are
Check that the copyright years are up to date by running:
- $ ./perl t/porting/copyright.t --now
+ $ ./perl t/porting/copyright.t --now
Remedy any test failures by editing README or perl.c accordingly (search for
the "Copyright"). If updating perl.c, check if the file's own copyright date in
BLEAD-FINAL, MAINT, and RC releases, since blead will already be frozen in
those cases. Create the branch by running
- git checkout -b release-5.xx.yy
+ git checkout -b release-5.xx.yy
=head3 build a clean perl
$ ./Configure -Dusedevel -des && make
+=head3 Check module versions
+
+For each Perl release since the previous release of the current branch, check
+for modules that have identical version numbers but different contents by
+running:
+
+ $ ./perl Porting/cmpVERSION.pl --tag=v5.X.YY
+
+(This is done automatically by F<t/porting/cmp_version.t> for the previous
+release of the current branch, but not for any releases from other branches.)
+
+Any modules that fail will need a version bump, plus a nudge to the upstream
+maintainer for 'cpan' upstream modules.
+
=head3 update Module::CoreList
=head4 Bump Module::CoreList* $VERSIONs
-If necessary, bump C<$Module::CoreList::VERSION> (there's no need to do this for
-every RC; in RC1, bump the version to a new clean number that will
+If necessary, bump C<$Module::CoreList::VERSION> (there's no need to do this
+for every RC; in RC1, bump the version to a new clean number that will
appear in the final release, and leave as-is for the later RCs and final).
It may also happen that C<Module::CoreList> has been modified in blead, and
hence has a new version number already. (But make sure it is not the same
C<$Module::CoreList::VERSION>. If necessary, bump those two versions to match
before proceeding.
+The files to modify are: F<dist/Module-CoreList/lib/Module/CoreList.pm>,
+F<dist/Module-CoreList/lib/Module/CoreList/Utils.pm> and
+F<dist/Module-CoreList/lib/Module/CoreList/TieHashDelta.pm>.
+
=head4 Update C<Module::CoreList> with module version data for the new release.
Note that if this is a MAINT release, you should run the following actions
badly-indexed CPAN modules unrelated to the modules actually in core.
Assuming all goes well, it will update
F<dist/Module-CoreList/lib/Module/CoreList.pm> and possibly
-F<dist/Module-CoreList/lib/Module/CoreList.pod> and/or
F<dist/Module-CoreList/lib/Module/CoreList/Utils.pm>.
Check those files over carefully:
$ git diff dist/Module-CoreList/lib/Module/CoreList.pm
- $ git diff dist/Module-CoreList/lib/Module/CoreList.pod
$ git diff dist/Module-CoreList/lib/Module/CoreList/Utils.pm
=head4 Bump version in Module::CoreList F<Changes>
=for checklist skip RC
-=head4 Update C<%Module::CoreList::released> and C<CAVEATS>
-
-In addition, if this is a final release (rather than a release candidate):
-
-=over 4
-
-=item *
+=head4 Update C<%Module::CoreList::released>
-Update this version's entry in the C<%released> hash with today's date.
-
-=item *
-
-Make sure that the script has correctly updated the C<CAVEATS> section
-(Note, the C<CAVEATS> section is in
-F<dist/Module-CoreList/lib/Module/CoreList.pod>)
-
-=back
+For any release except an RC: Update this version's entry in the C<%released>
+hash with today's date.
=head4 Commit Module::CoreList changes
(unless this is for MAINT; in which case commit it to blead first, then
cherry-pick it back).
- $ git commit -m 'Update Module::CoreList for 5.x.y' dist/Module-CoreList/Changes dist/Module-CoreList/lib/Module/CoreList.pm dist/Module-CoreList/lib/Module/CoreList.pod dist/Module-CoreList/lib/Module/CoreList/Utils.pm
+ $ git commit -m 'Update Module::CoreList for 5.x.y' \
+ dist/Module-CoreList/Changes \
+ dist/Module-CoreList/lib/Module/CoreList.pm \
+ dist/Module-CoreList/lib/Module/CoreList/Utils.pm
=head4 Rebuild and test
-Build and test to get the changes into the currently built lib directory and to ensure
-all tests are passing.
+Build and test to get the changes into the currently built lib directory and to
+ensure all tests are passing.
=head3 finalize perldelta
Finalize the perldelta. In particular, fill in the Acknowledgements
section, which can be generated with something like:
- $ perl Porting/acknowledgements.pl v5.15.0..HEAD
+ $ perl Porting/acknowledgements.pl v5.15.0..HEAD
+
+Fill in the "New/Updated Modules" sections now that Module::CoreList is
+updated:
+
+ $ ./perl -Ilib Porting/corelist-perldelta.pl \
+ --mode=update pod/perldelta.pod
-Fill in the "New/Updated Modules" sections now that Module::CoreList is updated:
+For a MAINT release use something like this instead:
- $ ./perl -Ilib Porting/corelist-perldelta.pl --mode=update pod/perldelta.pod
+ $ ./perl -Ilib Porting/corelist-perldelta.pl 5.020001 5.020002 \
+ --mode=update pod/perldelta.pod
Ideally, also fill in a summary of the major changes to each module for which
an entry has been added by F<corelist-perldelta.pl>.
Also, you may want to generate and view an HTML version of it to check
formatting, e.g.
- $ ./perl -Ilib ext/Pod-Html/bin/pod2html pod/perldelta.pod > /tmp/perldelta.html
+ $ ./perl -Ilib ext/Pod-Html/bin/pod2html pod/perldelta.pod > \
+ /tmp/perldelta.html
Another good HTML preview option is http://search.cpan.org/pod2html
$ cp ..../blead/pod/perlhist.pod pod/
$ git commit -m 'sync perlhist from blead' pod/perlhist.pod
-=for checklist skip RC
-
=head3 update perlhist.pod
-I<You MUST SKIP this step for a RC release>
-
Add an entry to F<pod/perlhist.pod> with the release date, e.g.:
David 5.10.1 2009-Aug-06
-Make sure that the correct pumpking is listed in the left-hand column, and
-if this is the first release under the stewardship of a new pumpking, make
-sure that his or her name is listed in the section entitled
-C<THE KEEPERS OF THE PUMPKIN>.
+List yourself in the left-hand column, and if this is the first release
+that you've ever done, make sure that your name is listed in the section
+entitled C<THE KEEPERS OF THE PUMPKIN>.
I<If you're making a BLEAD-FINAL release>, also update the "SELECTED
RELEASE SIZES" section with the output of
static const char * const local_patches[] = {
NULL
+ ,"RC1"
- PERL_GIT_UNPUSHED_COMMITS /* do not remove this line */
+ #ifdef PERL_GIT_UNCOMMITTED_CHANGES
+ ,"uncommitted-changes"
+ #endif
Be sure to commit your change:
commits. (Note that for an odd-numbered version, perl will install
itself as C<perl5.x.y>). C<perl -v> will identify itself as:
- This is perl 5, version X, subversion Y (v5.X.Y (v5.X.Z-NNN-gdeadbeef))
+ This is perl 5, version X, subversion Y (v5.X.Y (v5.X.Z-NNN-gdeadbeef))
where 5.X.Z is the latest tag, NNN the number of commits since this tag,
and C<< deadbeef >> commit of that tag.
Create a tarball. Use the C<-s> option to specify a suitable suffix for
the tarball and directory name:
- $ cd root/of/perl/tree
- $ make distclean
- $ git clean -xdf # make sure perl and git agree on files
- $ git status # and there's nothing lying around
+ $ cd root/of/perl/tree
+ $ make distclean # make sure distclean works
+ $ git clean -xdf # make sure perl and git agree on files
+ # git clean should not output anything!
+ $ git status # and there's nothing lying around
- $ perl Porting/makerel -b -s RC1 # for a release candidate
- $ perl Porting/makerel -b # for a final release
+ $ perl Porting/makerel -b -s RC1 # for a release candidate
+ $ perl Porting/makerel -b # for a final release
This creates the directory F<../perl-x.y.z-RC1> or similar, copies all
the MANIFEST files into it, sets the correct permissions on them, then
$ ./Configure -des && make all test
+ # Or for a development release:
+ $ ./Configure -Dusedevel -des && make all test
+
=head4 Run the test harness and install
Check that the test harness and install work on each test machine:
$ bin/cpan
+ # Or, perhaps:
+ $ bin/cpan5.xx.x
+
=head4 Install the Inline module with CPAN and test it
Try installing a popular CPAN module that's reasonably complex and that
has dependencies; for example:
- CPAN> install Inline
+ CPAN> install Inline::C
CPAN> quit
Check that your perl can run this:
static const char * const local_patches[] = {
NULL
- ,"RC1"
- PERL_GIT_UNPUSHED_COMMITS /* do not remove this line */
+ #ifdef PERL_GIT_UNCOMMITTED_CHANGES
+ ,"uncommitted-changes"
+ #endif
Be sure to commit your change:
Merge the (local) release branch back into master now, and delete it.
- git checkout blead
- git pull
- git merge release-5.xx.yy
- git push
- git branch -d release-5.xx.yy
+ git checkout blead
+ git pull
+ git merge release-5.xx.yy
+ git push
+ git branch -d release-5.xx.yy
Note: The merge will create a merge commit if other changes have been pushed
to blead while you've been working on your release branch. Do NOT rebase your
=for checklist skip RC
+=head3 Release schedule
+
+I<You MUST SKIP this step for RC>
+
+Tick the entry for your release in F<Porting/release_schedule.pod>.
+
+=for checklist skip RC
+
=head3 Module::CoreList nagging
I<You MUST SKIP this step for RC>
After bumping the version, follow the section L<"update INSTALL"> to
ensure all version number references are correct.
+(Note: The version is NOT bumped immediately after a MAINT release in order
+to avoid confusion and wasted time arising from bug reports relating to
+"intermediate versions" such as 5.20.1-and-a-bit: If the report is caused
+by a bug that gets fixed in 5.20.2 and this intermediate version already
+calls itself 5.20.2 then much time can be wasted in figuring out why there
+is a failure from something that "should have been fixed". If the bump is
+late then there is a much smaller window of time for such confusing bug
+reports to arise. (The opposite problem -- trying to figure out why there
+*is* a bug in something calling itself 5.20.1 when in fact the bug was
+introduced later -- shouldn't arise for MAINT releases since they should,
+in theory, only contain bug fixes but never regressions.))
+
=head3 clean build and test
Run a clean build and test to make sure nothing obvious is broken.
In particular, F<Porting/perldelta_template.pod> is intentionally exempted
from podchecker tests, to avoid false positives about placeholder text.
However, once it's copied to F<pod/perldelta.pod> the contents can now
-cause test failures. Problems should resolved by doing one of the
+cause test failures. Problems should be resolved by doing one of the
following:
=over
Copy the perldelta.pod for this release into blead; for example:
- $ cd ..../blead
- $ cp -i ../5.10.x/pod/perldelta.pod pod/perl5101delta.pod # for example
- $ git add pod/perl5101delta.pod
+ $ cd ..../blead
+ $ cp -i ../5.10.x/pod/perldelta.pod pod/perl5101delta.pod # for example
+ $ git add pod/perl5101delta.pod
Don't forget to set the NAME correctly in the new file (e.g. perl5101delta
rather than perldelta).
Make sure any recent F<pod/perlhist.pod> entries are copied to
F<perlhist.pod> on blead. e.g.
- 5.8.9 2008-Dec-14
+ 5.8.9 2008-Dec-14
=head3 bump RT version number
=head2 Building a release - the day after
-=head3 link announcement in epigraphs.pod
-
-Add, to your quote to F<Porting/epigraphs.pod>, a link to the release
-announcement in the web-visible mailing list archive. Commit it.
-
=for checklist skip BLEAD-FINAL, MAINT, RC
=head3 update Module::CoreList
$ ./perl -Ilib Porting/corelist.pl cpan
-This will update F<dist/Module-CoreList/lib/Module/CoreList.pm>,
-F<dist/Module-CoreList/lib/Module/CoreList.pod> and
+This will update F<dist/Module-CoreList/lib/Module/CoreList.pm> and
F<dist/Module-CoreList/lib/Module/CoreList/Utils.pm> as it did before,
but this time adding new sections for the next BLEAD-POINT release.
Run
- $ ./perl -Ilib -MModule::CoreList -le 'print Module::CoreList->find_version($]) ? "ok" : "not ok"'
+ $ ./perl -Ilib -MModule::CoreList \
+ -le 'print Module::CoreList->find_version($]) ? "ok" : "not ok"'
and check that it outputs "ok" to prove that Module::CoreList now knows
about blead's current version.
This schedule lists the projected or historical development and
release schedules for the next, current and previous stable versions
-of Perl. Dates with all question marks will only be releases if
+of Perl. Dates with two or more question marks will only be releases if
deemed necessary by the Pumpking.
-=head2 Perl 5.20
+=head2 Perl 5.22
-Code freezes (which happen in the 5.19.X series)
+Code freezes (which happen in the 5.21.X series)
- 2014-01-20 5.19.8 Contentious changes freeze
- 2014-02-20 5.19.9 User-visible changes freeze
- 2014-03-20 5.19.10 Full code freeze
- 2014-05-20 5.20.0 Stable release!
+ 2015-01-20 5.21.8 Contentious changes freeze
+ 2015-02-20 5.21.9 User-visible changes freeze
+ 2015-03-20 5.21.10 Full code freeze
+ 2015-05-20 5.22.0 Stable release!
-=head2 Perl 5.18
+=head2 Perl 5.20
-Release schedule (with release manager):
+ 2014-05-27 5.20.0 ✓ Ricardo Signes
+ 2014-09-14 5.20.1 ✓ Steve Hay
+ 2015-01-?? 5.20.2 Steve Hay
+
+=head2 Perl 5.18
2013-05-18 5.18.0 ✓ Ricardo Signes
2013-08-12 5.18.1 ✓ Ricardo Signes
- 2013-11-?? 5.18.2 Ricardo Signes
-
-(RC0 will be released once we think that all the blockers have been
-addressed. This typically means some time in April or May.)
-
-=head2 Perl 5.16
-
-Release schedule (with release managers):
-
- 2012-05-20 5.16.0 ✓ Ricardo Signes
- 2012-08-08 5.16.1 ✓ Ricardo Signes
- 2012-11-01 5.16.2 ✓ Ricardo Signes
- 2013-03-11 5.16.3 ✓ Ricardo Signes
- ????-??-?? 5.16.4 ??
+ 2014-01-06 5.18.2 ✓ Ricardo Signes
+ 2014-10-01 5.18.3 ✓ Ricardo Signes
+ 2014-10-01 5.18.4 ✓ Ricardo Signes
+ 2015-??-?? 5.18.5 ??
=head1 DEVELOPMENT RELEASE SCHEDULE
the next four releases. If a stable version of Perl is released,
you should reset the version numbers to the next blead series.
-=head2 Perl 5.19
-
- 2013-05-20 5.19.0 Ricardo Signes
- 2013-06-20 5.19.1 David Golden
- 2013-07-20 5.19.2 Aristotle Pagaltzis
- 2013-08-20 5.19.3 Steve Hay
- 2013-09-20 5.19.4 Steve Hay
- 2013-10-20 5.19.5 Steve Hay
- 2013-11-20 5.19.6 Chris Williams
- 2013-12-20 5.19.7 Abigail
- 2014-01-20 5.19.8 Ricardo Signes
- 2014-02-20 5.19.9 Tony Cook
- 2014-03-20 5.19.10 Aaron Crane
- 2014-04-20 5.19.11 Steve Hay
-
=head2 Perl 5.21
- 2014-05-20 5.21.0 Ricardo Signes
- 2014-06-20 5.21.1 Matthew Horsfall
- 2014-07-20 5.21.2 Abigail
- 2014-08-20 5.21.3 ?
- 2014-09-20 5.21.4 ?
- 2014-10-20 5.21.5 ?
- 2014-11-20 5.21.6 ?
- 2014-12-20 5.21.7 ?
- 2015-01-20 5.21.8 ?
+ 2014-05-20 5.21.0 ✓ Ricardo Signes
+ 2014-06-20 5.21.1 ✓ Matthew Horsfall
+ 2014-07-20 5.21.2 ✓ Abigail
+ 2014-08-20 5.21.3 ✓ Peter Martini
+ 2014-09-20 5.21.4 ✓ Steve Hay
+ 2014-10-20 5.21.5 ✓ Abigail
+ 2014-11-20 5.21.6 ✓ Chris "BinGOs" Williams
+ 2014-12-20 5.21.7 ✓ Max Maischein
+ 2015-01-20 5.21.8 ✓ Matthew Horsfall
2015-02-20 5.21.9 ?
2015-03-20 5.21.10 ?
2015-04-20 5.21.11 ?
+(RC0 for 5.22.0 will be released once we think that all the blockers have been
+addressed. This typically means some time in April or May.)
+
=head1 VICTIMS
The following porters have all consented to do at least
Jesse Vincent <jesse@cpan.org>
Leon Brocard <acme@astray.com>
Matt Trout <mst@shadowcat.co.uk>
+Matthew Horsfall <wolfsage@gmail.com>
Max Maischein <corion@cpan.org>
Peter Martini <petercmartini@gmail.com>
Philippe Bruhat <book@cpan.org>
On these systems, it might be the default compilation mode, and there
is currently no guarantee that passing no use64bitall option to the
Configure process will build a 32bit perl. Implementing -Duse32bit*
-options would be nice for perl 5.20.1.
+options would be nice for perl 5.20.2.
=head2 Profile Perl - am I hot or not?
=head2 Virtualize operating system access
Implement a set of "vtables" that virtualizes operating system access
-(open(), mkdir(), unlink(), readdir(), getenv(), etc.) At the very
-least these interfaces should take SVs as "name" arguments instead of
-bare char pointers; probably the most flexible and extensible way
-would be for the Perl-facing interfaces to accept HVs. The system
-needs to be per-operating-system and per-file-system
-hookable/filterable, preferably both from XS and Perl level
-(L<perlport/"Files and Filesystems"> is good reading at this point,
-in fact, all of L<perlport> is.)
+(chdir(), chmod(), dbmopen(), getenv(), glob(), link(), mkdir(), open(),
+opendir(), readdir(), rename(), rmdir(), stat(), sysopen(), uname(),
+unlink(), etc.) At the very least these interfaces should take SVs as
+"name" arguments instead of bare char pointers; probably the most
+flexible and extensible way would be for the Perl-facing interfaces to
+accept HVs. The system needs to be per-operating-system and
+per-file-system hookable/filterable, preferably both from XS and Perl
+level (L<perlport/"Files and Filesystems"> is good reading at this
+point, in fact, all of L<perlport> is.)
This has actually already been implemented (but only for Win32),
take a look at F<iperlsys.h> and F<win32/perlhost.h>. While all Win32
=head1 Big projects
Tasks that will get your name mentioned in the description of the "Highlights
-of 5.20.1"
+of 5.20.2"
=head2 make ithreads more robust
Make perl executable and create a symlink for libperl:
chmod a+x /boot/common/bin/perl
- cd /boot/common/lib; ln -s perl5/5.20.1/BePC-haiku/CORE/libperl.so .
+ cd /boot/common/lib; ln -s perl5/5.20.2/BePC-haiku/CORE/libperl.so .
-Replace C<5.20.1> with your respective version of Perl.
+Replace C<5.20.2> with your respective version of Perl.
=head1 KNOWN PROBLEMS
This document briefly describes Perl under Mac OS X.
- curl -O http://www.cpan.org/src/perl-5.20.1.tar.gz
- tar -xzf perl-5.20.1.tar.gz
- cd perl-5.20.1
+ curl -O http://www.cpan.org/src/perl-5.20.2.tar.gz
+ tar -xzf perl-5.20.2.tar.gz
+ cd perl-5.20.2
./Configure -des -Dprefix=/usr/local/
make
make test
=head1 DESCRIPTION
-The latest Perl release (5.20.1 as of this writing) builds without changes
+The latest Perl release (5.20.2 as of this writing) builds without changes
under all versions of Mac OS X from 10.3 "Panther" onwards.
In order to build your own version of Perl you will need 'make',
use vars qw(
$VERSION
);
-$VERSION = "5.5001";
+$VERSION = "5.5002";
package CPAN::Author;
use strict;
use vars qw(
$VERSION
);
-$VERSION = "5.5001";
+$VERSION = "5.5002";
package CPAN::CacheMgr;
use strict;
use vars qw(
$VERSION
);
-$VERSION = "5.5005";
+$VERSION = "5.5006";
#-> sub CPAN::FTP::ftp_statistics
# if they want to rewrite, they need to pass in a filehandle
use CPAN::HTTP::Credentials;
use HTTP::Tiny 0.005;
-$CPAN::HTTP::Client::VERSION = $CPAN::HTTP::Client::VERSION = "1.9600";
+$CPAN::HTTP::Client::VERSION = $CPAN::HTTP::Client::VERSION = "1.9601";
# CPAN::HTTP::Client is adapted from parts of cpanm by Tatsuhiko Miyagawa
# and parts of LWP by Gisle Aas
=cut
-$VERSION = "5.5003"; # see also CPAN::Config::VERSION at end of file
+$VERSION = "5.5005"; # see also CPAN::Config::VERSION at end of file
%can = (
commit => "Commit changes to disk",
use strict;
use vars qw($AUTOLOAD $VERSION);
- $VERSION = "5.5002";
+ $VERSION = "5.5005";
# formerly CPAN::HandleConfig was known as CPAN::Config
sub AUTOLOAD { ## no critic
package CPAN::Index;
use strict;
use vars qw($LAST_TIME $DATE_OF_02 $DATE_OF_03 $HAVE_REANIMATED $VERSION);
-$VERSION = "1.9600";
+$VERSION = "1.9601";
@CPAN::Index::ISA = qw(CPAN::Debug);
$LAST_TIME ||= 0;
$DATE_OF_03 ||= 0;
use CPAN::HTTP::Credentials;
# we delay requiring LWP::UserAgent and setting up inheritance until we need it
-$CPAN::LWP::UserAgent::VERSION = $CPAN::LWP::UserAgent::VERSION = "1.9600";
+$CPAN::LWP::UserAgent::VERSION = $CPAN::LWP::UserAgent::VERSION = "1.9601";
sub config {
package CPAN::Mirrors;
use strict;
use vars qw($VERSION $urllist $silent);
-$VERSION = "1.9600";
+$VERSION = "1.9601";
use Carp;
use FileHandle;
touch_file($exporter);
$rv = $base->perl_src();
ok( -d $rv, "perl_src(): returned a directory" );
- is( uc($rv), uc(Cwd::realpath($subdir)), "perl_src(): identified directory" );
+ my $rp = Cwd::realpath($subdir);
+ SKIP: {
+ if ($^O eq 'dec_osf' && $rp =~ m[^/cluster/members/]) {
+ skip "Tru64 cluster filesystem", 1;
+ } # SKIP
+ is( uc($rv), uc($rp), "perl_src(): identified directory" );
+ }
is( $capture, q{}, "perl_src(): no warning, as expected" );
chdir $cwd
@ISA = qw(IO::Handle);
-$VERSION = "1.37";
+$VERSION = "1.38";
@EXPORT_OK = qw(sockatmark);
=item connected
-If the socket is in a connected state the peer address is returned.
-If the socket is not in a connected state then undef will be returned.
+If the socket is in a connected state, the peer address is returned. If the
+socket is not in a connected state, undef is returned.
+
+Note that connected() considers a half-open TCP socket to be "in a connected
+state". Specifically, connected() does not distinguish between the
+B<ESTABLISHED> and B<CLOSE-WAIT> TCP states; it returns the peer address,
+rather than undef, in either case. Thus, in general, connected() cannot
+be used to reliably learn whether the peer has initiated a graceful shutdown
+because in most cases (see below) the local TCP state machine remains in
+B<CLOSE-WAIT> until the local application calls shutdown() or close();
+only at that point does connected() return undef.
+
+The "in most cases" hedge is because local TCP state machine behavior may
+depend on the peer's socket options. In particular, if the peer socket has
+SO_LINGER enabled with a zero timeout, then the peer's close() will generate
+a RST segment, upon receipt of which the local TCP transitions immediately to
+B<CLOSED>, and in that state, connected() I<will> return undef.
=item protocol
{ # [perl #64772] IO::Handle->sync fails on an O_RDONLY descriptor
$Config{d_fsync}
or skip "No fsync", 1;
- $^O eq 'aix'
- and skip "fsync() documented to fail on non-writable handles on AIX", 1;
+ $^O =~ /^(?:aix|irix)$/
+ and skip "fsync() documented to fail on non-writable handles on $^O", 1;
$^O eq 'cygwin'
and skip "fsync() on cygwin uses FlushFileBuffers which requires a writable handle", 1;
open my $fh, "<", "t/io_xs.t"
-5.020001
+5.20150214
+ - Updated for v5.20.2
+
+5.20150120
+ - Updated for v5.21.8
+
+5.20141220
+ - Updated for v5.21.7
+
+5.20141120
+ - Updated for v5.21.6
+
+5.20141020
+ - Updated for v5.21.5
+
+5.20141002
+ - Updated for v5.18.3 and v5.18.4
+
+5.20140920
+ - Updated for v5.21.4
+
+5.20140914
- Updated for v5.20.1
5.021003
%bug_tracker %deprecated %delta/;
use Module::CoreList::TieHashDelta;
use version;
-$VERSION = '5.020001';
+$VERSION = '5.20150214';
my $dumpinc = 0;
sub import {
my $version = shift;
my @perls = $version
- ? grep { exists $version{$_}{ $module } &&
+ ? grep { defined $version{$_}{ $module } &&
$version{$_}{ $module } ge $version } keys %version
: grep { exists $version{$_}{ $module } } keys %version;
5.019006 => '2013-11-20',
5.019007 => '2013-12-20',
5.018002 => '2014-01-06',
+ 5.018003 => '2014-10-01',
+ 5.018004 => '2014-10-01',
5.019008 => '2014-01-20',
5.019009 => '2014-02-20',
5.01901 => '2014-03-20',
5.021002 => '2014-07-20',
5.021003 => '2014-08-20',
5.020001 => '2014-09-14',
+ 5.021004 => '2014-09-20',
+ 5.021005 => '2014-10-20',
+ 5.021006 => '2014-11-20',
+ 5.021007 => '2014-12-20',
+ 5.021008 => '2015-01-20',
+ 5.020002 => '2015-02-14',
);
for my $version ( sort { $a <=> $b } keys %released ) {
'Module::CoreList::Utils'=> '3.03',
},
},
+ 5.018003 => {
+ delta_from => 5.018002,
+ changed => {
+ 'Module::CoreList' => '3.12',
+ 'Module::CoreList::TieHashDelta'=> '3.12',
+ 'Module::CoreList::Utils'=> '3.12',
+ },
+ },
+ 5.018004 => {
+ delta_from => 5.018003,
+ changed => {
+ 'Module::CoreList' => '3.13',
+ 'Module::CoreList::TieHashDelta'=> '3.13',
+ 'Module::CoreList::Utils'=> '3.13',
+ },
+ },
5.019000 => {
delta_from => 5.018000,
changed => {
removed => {
}
},
+ 5.021004 => {
+ delta_from => 5.021003,
+ changed => {
+ 'App::Prove' => '3.33',
+ 'App::Prove::State' => '3.33',
+ 'App::Prove::State::Result'=> '3.33',
+ 'App::Prove::State::Result::Test'=> '3.33',
+ 'Archive::Tar' => '2.02',
+ 'Archive::Tar::Constant'=> '2.02',
+ 'Archive::Tar::File' => '2.02',
+ 'Attribute::Handlers' => '0.97',
+ 'B' => '1.51',
+ 'B::Concise' => '0.993',
+ 'B::Deparse' => '1.28',
+ 'B::Op_private' => '5.021004',
+ 'CPAN::Meta::Requirements'=> '2.128',
+ 'Config' => '5.021004',
+ 'Cwd' => '3.50',
+ 'Data::Dumper' => '2.154',
+ 'ExtUtils::CBuilder' => '0.280219',
+ 'ExtUtils::CBuilder::Base'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::android'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280219',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.280219',
+ 'ExtUtils::Install' => '2.04',
+ 'ExtUtils::Installed' => '2.04',
+ 'ExtUtils::Liblist::Kid'=> '6.98_01',
+ 'ExtUtils::Manifest' => '1.68',
+ 'ExtUtils::Packlist' => '2.04',
+ 'File::Find' => '1.28',
+ 'File::Spec' => '3.50',
+ 'File::Spec::Cygwin' => '3.50',
+ 'File::Spec::Epoc' => '3.50',
+ 'File::Spec::Functions' => '3.50',
+ 'File::Spec::Mac' => '3.50',
+ 'File::Spec::OS2' => '3.50',
+ 'File::Spec::Unix' => '3.50',
+ 'File::Spec::VMS' => '3.50',
+ 'File::Spec::Win32' => '3.50',
+ 'Getopt::Std' => '1.11',
+ 'HTTP::Tiny' => '0.049',
+ 'IO' => '1.34',
+ 'IO::Socket::IP' => '0.32',
+ 'List::Util' => '1.41',
+ 'List::Util::XS' => '1.41',
+ 'Locale::Codes' => '3.32',
+ 'Locale::Codes::Constants'=> '3.32',
+ 'Locale::Codes::Country'=> '3.32',
+ 'Locale::Codes::Country_Codes'=> '3.32',
+ 'Locale::Codes::Country_Retired'=> '3.32',
+ 'Locale::Codes::Currency'=> '3.32',
+ 'Locale::Codes::Currency_Codes'=> '3.32',
+ 'Locale::Codes::Currency_Retired'=> '3.32',
+ 'Locale::Codes::LangExt'=> '3.32',
+ 'Locale::Codes::LangExt_Codes'=> '3.32',
+ 'Locale::Codes::LangExt_Retired'=> '3.32',
+ 'Locale::Codes::LangFam'=> '3.32',
+ 'Locale::Codes::LangFam_Codes'=> '3.32',
+ 'Locale::Codes::LangFam_Retired'=> '3.32',
+ 'Locale::Codes::LangVar'=> '3.32',
+ 'Locale::Codes::LangVar_Codes'=> '3.32',
+ 'Locale::Codes::LangVar_Retired'=> '3.32',
+ 'Locale::Codes::Language'=> '3.32',
+ 'Locale::Codes::Language_Codes'=> '3.32',
+ 'Locale::Codes::Language_Retired'=> '3.32',
+ 'Locale::Codes::Script' => '3.32',
+ 'Locale::Codes::Script_Codes'=> '3.32',
+ 'Locale::Codes::Script_Retired'=> '3.32',
+ 'Locale::Country' => '3.32',
+ 'Locale::Currency' => '3.32',
+ 'Locale::Language' => '3.32',
+ 'Locale::Script' => '3.32',
+ 'Math::BigFloat' => '1.9997',
+ 'Math::BigInt' => '1.9997',
+ 'Math::BigInt::Calc' => '1.9997',
+ 'Math::BigInt::CalcEmu' => '1.9997',
+ 'Module::CoreList' => '5.20140920',
+ 'Module::CoreList::TieHashDelta'=> '5.20140920',
+ 'Module::CoreList::Utils'=> '5.20140920',
+ 'POSIX' => '1.43',
+ 'Pod::Perldoc' => '3.24',
+ 'Pod::Perldoc::BaseTo' => '3.24',
+ 'Pod::Perldoc::GetOptsOO'=> '3.24',
+ 'Pod::Perldoc::ToANSI' => '3.24',
+ 'Pod::Perldoc::ToChecker'=> '3.24',
+ 'Pod::Perldoc::ToMan' => '3.24',
+ 'Pod::Perldoc::ToNroff' => '3.24',
+ 'Pod::Perldoc::ToPod' => '3.24',
+ 'Pod::Perldoc::ToRtf' => '3.24',
+ 'Pod::Perldoc::ToTerm' => '3.24',
+ 'Pod::Perldoc::ToText' => '3.24',
+ 'Pod::Perldoc::ToTk' => '3.24',
+ 'Pod::Perldoc::ToXml' => '3.24',
+ 'Scalar::Util' => '1.41',
+ 'Sub::Util' => '1.41',
+ 'TAP::Base' => '3.33',
+ 'TAP::Formatter::Base' => '3.33',
+ 'TAP::Formatter::Color' => '3.33',
+ 'TAP::Formatter::Console'=> '3.33',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.33',
+ 'TAP::Formatter::Console::Session'=> '3.33',
+ 'TAP::Formatter::File' => '3.33',
+ 'TAP::Formatter::File::Session'=> '3.33',
+ 'TAP::Formatter::Session'=> '3.33',
+ 'TAP::Harness' => '3.33',
+ 'TAP::Harness::Env' => '3.33',
+ 'TAP::Object' => '3.33',
+ 'TAP::Parser' => '3.33',
+ 'TAP::Parser::Aggregator'=> '3.33',
+ 'TAP::Parser::Grammar' => '3.33',
+ 'TAP::Parser::Iterator' => '3.33',
+ 'TAP::Parser::Iterator::Array'=> '3.33',
+ 'TAP::Parser::Iterator::Process'=> '3.33',
+ 'TAP::Parser::Iterator::Stream'=> '3.33',
+ 'TAP::Parser::IteratorFactory'=> '3.33',
+ 'TAP::Parser::Multiplexer'=> '3.33',
+ 'TAP::Parser::Result' => '3.33',
+ 'TAP::Parser::Result::Bailout'=> '3.33',
+ 'TAP::Parser::Result::Comment'=> '3.33',
+ 'TAP::Parser::Result::Plan'=> '3.33',
+ 'TAP::Parser::Result::Pragma'=> '3.33',
+ 'TAP::Parser::Result::Test'=> '3.33',
+ 'TAP::Parser::Result::Unknown'=> '3.33',
+ 'TAP::Parser::Result::Version'=> '3.33',
+ 'TAP::Parser::Result::YAML'=> '3.33',
+ 'TAP::Parser::ResultFactory'=> '3.33',
+ 'TAP::Parser::Scheduler'=> '3.33',
+ 'TAP::Parser::Scheduler::Job'=> '3.33',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.33',
+ 'TAP::Parser::Source' => '3.33',
+ 'TAP::Parser::SourceHandler'=> '3.33',
+ 'TAP::Parser::SourceHandler::Executable'=> '3.33',
+ 'TAP::Parser::SourceHandler::File'=> '3.33',
+ 'TAP::Parser::SourceHandler::Handle'=> '3.33',
+ 'TAP::Parser::SourceHandler::Perl'=> '3.33',
+ 'TAP::Parser::SourceHandler::RawTAP'=> '3.33',
+ 'TAP::Parser::YAMLish::Reader'=> '3.33',
+ 'TAP::Parser::YAMLish::Writer'=> '3.33',
+ 'Term::ReadLine' => '1.15',
+ 'Test::Builder' => '1.001006',
+ 'Test::Builder::Module' => '1.001006',
+ 'Test::Builder::Tester' => '1.24',
+ 'Test::Builder::Tester::Color'=> '1.24',
+ 'Test::Harness' => '3.33',
+ 'Test::More' => '1.001006',
+ 'Test::Simple' => '1.001006',
+ 'Time::Piece' => '1.29',
+ 'Time::Seconds' => '1.29',
+ 'XS::APItest' => '0.64',
+ '_charnames' => '1.42',
+ 'attributes' => '0.23',
+ 'bigint' => '0.37',
+ 'bignum' => '0.38',
+ 'bigrat' => '0.37',
+ 'constant' => '1.32',
+ 'experimental' => '0.010',
+ 'overload' => '1.23',
+ 'threads' => '1.96',
+ 'version' => '0.9909',
+ 'version::regex' => '0.9909',
+ 'version::vpp' => '0.9909',
+ },
+ removed => {
+ }
+ },
+ 5.021005 => {
+ delta_from => 5.021004,
+ changed => {
+ 'B' => '1.52',
+ 'B::Concise' => '0.994',
+ 'B::Debug' => '1.22',
+ 'B::Deparse' => '1.29',
+ 'B::Op_private' => '5.021005',
+ 'CPAN::Meta' => '2.142690',
+ 'CPAN::Meta::Converter' => '2.142690',
+ 'CPAN::Meta::Feature' => '2.142690',
+ 'CPAN::Meta::History' => '2.142690',
+ 'CPAN::Meta::Merge' => '2.142690',
+ 'CPAN::Meta::Prereqs' => '2.142690',
+ 'CPAN::Meta::Spec' => '2.142690',
+ 'CPAN::Meta::Validator' => '2.142690',
+ 'Compress::Raw::Bzip2' => '2.066',
+ 'Compress::Raw::Zlib' => '2.066',
+ 'Compress::Zlib' => '2.066',
+ 'Config' => '5.021005',
+ 'Cwd' => '3.51',
+ 'DynaLoader' => '1.27',
+ 'Errno' => '1.21',
+ 'ExtUtils::CBuilder' => '0.280220',
+ 'ExtUtils::CBuilder::Base'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::android'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280220',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.280220',
+ 'ExtUtils::Miniperl' => '1.03',
+ 'Fcntl' => '1.13',
+ 'File::Find' => '1.29',
+ 'File::Spec' => '3.51',
+ 'File::Spec::Cygwin' => '3.51',
+ 'File::Spec::Epoc' => '3.51',
+ 'File::Spec::Functions' => '3.51',
+ 'File::Spec::Mac' => '3.51',
+ 'File::Spec::OS2' => '3.51',
+ 'File::Spec::Unix' => '3.51',
+ 'File::Spec::VMS' => '3.51',
+ 'File::Spec::Win32' => '3.51',
+ 'HTTP::Tiny' => '0.050',
+ 'IO::Compress::Adapter::Bzip2'=> '2.066',
+ 'IO::Compress::Adapter::Deflate'=> '2.066',
+ 'IO::Compress::Adapter::Identity'=> '2.066',
+ 'IO::Compress::Base' => '2.066',
+ 'IO::Compress::Base::Common'=> '2.066',
+ 'IO::Compress::Bzip2' => '2.066',
+ 'IO::Compress::Deflate' => '2.066',
+ 'IO::Compress::Gzip' => '2.066',
+ 'IO::Compress::Gzip::Constants'=> '2.066',
+ 'IO::Compress::RawDeflate'=> '2.066',
+ 'IO::Compress::Zip' => '2.066',
+ 'IO::Compress::Zip::Constants'=> '2.066',
+ 'IO::Compress::Zlib::Constants'=> '2.066',
+ 'IO::Compress::Zlib::Extra'=> '2.066',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.066',
+ 'IO::Uncompress::Adapter::Identity'=> '2.066',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.066',
+ 'IO::Uncompress::AnyInflate'=> '2.066',
+ 'IO::Uncompress::AnyUncompress'=> '2.066',
+ 'IO::Uncompress::Base' => '2.066',
+ 'IO::Uncompress::Bunzip2'=> '2.066',
+ 'IO::Uncompress::Gunzip'=> '2.066',
+ 'IO::Uncompress::Inflate'=> '2.066',
+ 'IO::Uncompress::RawInflate'=> '2.066',
+ 'IO::Uncompress::Unzip' => '2.066',
+ 'JSON::PP' => '2.27300',
+ 'Module::CoreList' => '5.20141020',
+ 'Module::CoreList::TieHashDelta'=> '5.20141020',
+ 'Module::CoreList::Utils'=> '5.20141020',
+ 'Net::Cmd' => '3.02',
+ 'Net::Config' => '3.02',
+ 'Net::Domain' => '3.02',
+ 'Net::FTP' => '3.02',
+ 'Net::FTP::A' => '3.02',
+ 'Net::FTP::E' => '3.02',
+ 'Net::FTP::I' => '3.02',
+ 'Net::FTP::L' => '3.02',
+ 'Net::FTP::dataconn' => '3.02',
+ 'Net::NNTP' => '3.02',
+ 'Net::Netrc' => '3.02',
+ 'Net::POP3' => '3.02',
+ 'Net::SMTP' => '3.02',
+ 'Net::Time' => '3.02',
+ 'Opcode' => '1.29',
+ 'POSIX' => '1.45',
+ 'Socket' => '2.016',
+ 'Test::Builder' => '1.001008',
+ 'Test::Builder::Module' => '1.001008',
+ 'Test::More' => '1.001008',
+ 'Test::Simple' => '1.001008',
+ 'XS::APItest' => '0.65',
+ 'XSLoader' => '0.18',
+ 'attributes' => '0.24',
+ 'experimental' => '0.012',
+ 'feature' => '1.38',
+ 'perlfaq' => '5.0150046',
+ 're' => '0.27',
+ 'threads::shared' => '1.47',
+ 'warnings' => '1.28',
+ 'warnings::register' => '1.04',
+ },
+ removed => {
+ }
+ },
+ 5.021006 => {
+ delta_from => 5.021005,
+ changed => {
+ 'App::Prove' => '3.34',
+ 'App::Prove::State' => '3.34',
+ 'App::Prove::State::Result'=> '3.34',
+ 'App::Prove::State::Result::Test'=> '3.34',
+ 'B' => '1.53',
+ 'B::Concise' => '0.995',
+ 'B::Deparse' => '1.30',
+ 'B::Op_private' => '5.021006',
+ 'CPAN::Meta' => '2.143240',
+ 'CPAN::Meta::Converter' => '2.143240',
+ 'CPAN::Meta::Feature' => '2.143240',
+ 'CPAN::Meta::History' => '2.143240',
+ 'CPAN::Meta::Merge' => '2.143240',
+ 'CPAN::Meta::Prereqs' => '2.143240',
+ 'CPAN::Meta::Requirements'=> '2.130',
+ 'CPAN::Meta::Spec' => '2.143240',
+ 'CPAN::Meta::Validator' => '2.143240',
+ 'Config' => '5.021006',
+ 'Devel::Peek' => '1.19',
+ 'Digest::SHA' => '5.93',
+ 'DynaLoader' => '1.28',
+ 'Encode' => '2.64',
+ 'Exporter' => '5.72',
+ 'Exporter::Heavy' => '5.72',
+ 'ExtUtils::Command::MM' => '7.02',
+ 'ExtUtils::Liblist' => '7.02',
+ 'ExtUtils::Liblist::Kid'=> '7.02',
+ 'ExtUtils::MM' => '7.02',
+ 'ExtUtils::MM_AIX' => '7.02',
+ 'ExtUtils::MM_Any' => '7.02',
+ 'ExtUtils::MM_BeOS' => '7.02',
+ 'ExtUtils::MM_Cygwin' => '7.02',
+ 'ExtUtils::MM_DOS' => '7.02',
+ 'ExtUtils::MM_Darwin' => '7.02',
+ 'ExtUtils::MM_MacOS' => '7.02',
+ 'ExtUtils::MM_NW5' => '7.02',
+ 'ExtUtils::MM_OS2' => '7.02',
+ 'ExtUtils::MM_QNX' => '7.02',
+ 'ExtUtils::MM_UWIN' => '7.02',
+ 'ExtUtils::MM_Unix' => '7.02',
+ 'ExtUtils::MM_VMS' => '7.02',
+ 'ExtUtils::MM_VOS' => '7.02',
+ 'ExtUtils::MM_Win32' => '7.02',
+ 'ExtUtils::MM_Win95' => '7.02',
+ 'ExtUtils::MY' => '7.02',
+ 'ExtUtils::MakeMaker' => '7.02',
+ 'ExtUtils::MakeMaker::Config'=> '7.02',
+ 'ExtUtils::MakeMaker::Locale'=> '7.02',
+ 'ExtUtils::MakeMaker::version'=> '7.02',
+ 'ExtUtils::MakeMaker::version::regex'=> '7.02',
+ 'ExtUtils::MakeMaker::version::vpp'=> '7.02',
+ 'ExtUtils::Manifest' => '1.69',
+ 'ExtUtils::Mkbootstrap' => '7.02',
+ 'ExtUtils::Mksymlists' => '7.02',
+ 'ExtUtils::ParseXS' => '3.26',
+ 'ExtUtils::ParseXS::Constants'=> '3.26',
+ 'ExtUtils::ParseXS::CountLines'=> '3.26',
+ 'ExtUtils::ParseXS::Eval'=> '3.26',
+ 'ExtUtils::ParseXS::Utilities'=> '3.26',
+ 'ExtUtils::testlib' => '7.02',
+ 'File::Spec::VMS' => '3.52',
+ 'HTTP::Tiny' => '0.051',
+ 'I18N::Langinfo' => '0.12',
+ 'IO::Socket' => '1.38',
+ 'Module::CoreList' => '5.20141120',
+ 'Module::CoreList::TieHashDelta'=> '5.20141120',
+ 'Module::CoreList::Utils'=> '5.20141120',
+ 'POSIX' => '1.46',
+ 'PerlIO::encoding' => '0.20',
+ 'PerlIO::scalar' => '0.20',
+ 'TAP::Base' => '3.34',
+ 'TAP::Formatter::Base' => '3.34',
+ 'TAP::Formatter::Color' => '3.34',
+ 'TAP::Formatter::Console'=> '3.34',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.34',
+ 'TAP::Formatter::Console::Session'=> '3.34',
+ 'TAP::Formatter::File' => '3.34',
+ 'TAP::Formatter::File::Session'=> '3.34',
+ 'TAP::Formatter::Session'=> '3.34',
+ 'TAP::Harness' => '3.34',
+ 'TAP::Harness::Env' => '3.34',
+ 'TAP::Object' => '3.34',
+ 'TAP::Parser' => '3.34',
+ 'TAP::Parser::Aggregator'=> '3.34',
+ 'TAP::Parser::Grammar' => '3.34',
+ 'TAP::Parser::Iterator' => '3.34',
+ 'TAP::Parser::Iterator::Array'=> '3.34',
+ 'TAP::Parser::Iterator::Process'=> '3.34',
+ 'TAP::Parser::Iterator::Stream'=> '3.34',
+ 'TAP::Parser::IteratorFactory'=> '3.34',
+ 'TAP::Parser::Multiplexer'=> '3.34',
+ 'TAP::Parser::Result' => '3.34',
+ 'TAP::Parser::Result::Bailout'=> '3.34',
+ 'TAP::Parser::Result::Comment'=> '3.34',
+ 'TAP::Parser::Result::Plan'=> '3.34',
+ 'TAP::Parser::Result::Pragma'=> '3.34',
+ 'TAP::Parser::Result::Test'=> '3.34',
+ 'TAP::Parser::Result::Unknown'=> '3.34',
+ 'TAP::Parser::Result::Version'=> '3.34',
+ 'TAP::Parser::Result::YAML'=> '3.34',
+ 'TAP::Parser::ResultFactory'=> '3.34',
+ 'TAP::Parser::Scheduler'=> '3.34',
+ 'TAP::Parser::Scheduler::Job'=> '3.34',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.34',
+ 'TAP::Parser::Source' => '3.34',
+ 'TAP::Parser::SourceHandler'=> '3.34',
+ 'TAP::Parser::SourceHandler::Executable'=> '3.34',
+ 'TAP::Parser::SourceHandler::File'=> '3.34',
+ 'TAP::Parser::SourceHandler::Handle'=> '3.34',
+ 'TAP::Parser::SourceHandler::Perl'=> '3.34',
+ 'TAP::Parser::SourceHandler::RawTAP'=> '3.34',
+ 'TAP::Parser::YAMLish::Reader'=> '3.34',
+ 'TAP::Parser::YAMLish::Writer'=> '3.34',
+ 'Test::Builder' => '1.301001_075',
+ 'Test::Builder::Module' => '1.301001_075',
+ 'Test::Builder::Tester' => '1.301001_075',
+ 'Test::Builder::Tester::Color'=> '1.301001_075',
+ 'Test::Harness' => '3.34',
+ 'Test::More' => '1.301001_075',
+ 'Test::More::DeepCheck' => undef,
+ 'Test::More::DeepCheck::Strict'=> undef,
+ 'Test::More::DeepCheck::Tolerant'=> undef,
+ 'Test::More::Tools' => undef,
+ 'Test::MostlyLike' => undef,
+ 'Test::Simple' => '1.301001_075',
+ 'Test::Stream' => '1.301001_075',
+ 'Test::Stream::ArrayBase'=> undef,
+ 'Test::Stream::ArrayBase::Meta'=> undef,
+ 'Test::Stream::Carp' => undef,
+ 'Test::Stream::Context' => undef,
+ 'Test::Stream::Event' => undef,
+ 'Test::Stream::Event::Bail'=> undef,
+ 'Test::Stream::Event::Child'=> undef,
+ 'Test::Stream::Event::Diag'=> undef,
+ 'Test::Stream::Event::Finish'=> undef,
+ 'Test::Stream::Event::Note'=> undef,
+ 'Test::Stream::Event::Ok'=> undef,
+ 'Test::Stream::Event::Plan'=> undef,
+ 'Test::Stream::Event::Subtest'=> undef,
+ 'Test::Stream::ExitMagic'=> undef,
+ 'Test::Stream::ExitMagic::Context'=> undef,
+ 'Test::Stream::Exporter'=> undef,
+ 'Test::Stream::Exporter::Meta'=> undef,
+ 'Test::Stream::IOSets' => undef,
+ 'Test::Stream::Meta' => undef,
+ 'Test::Stream::PackageUtil'=> undef,
+ 'Test::Stream::Tester' => undef,
+ 'Test::Stream::Tester::Checks'=> undef,
+ 'Test::Stream::Tester::Checks::Event'=> undef,
+ 'Test::Stream::Tester::Events'=> undef,
+ 'Test::Stream::Tester::Events::Event'=> undef,
+ 'Test::Stream::Tester::Grab'=> undef,
+ 'Test::Stream::Threads' => undef,
+ 'Test::Stream::Toolset' => undef,
+ 'Test::Stream::Util' => undef,
+ 'Test::Tester' => '1.301001_075',
+ 'Test::Tester::Capture' => undef,
+ 'Test::use::ok' => '1.301001_075',
+ 'Unicode::UCD' => '0.59',
+ 'XS::APItest' => '0.68',
+ 'XSLoader' => '0.19',
+ 'experimental' => '0.013',
+ 'locale' => '1.05',
+ 'ok' => '1.301001_075',
+ 'overload' => '1.24',
+ 're' => '0.28',
+ 'warnings' => '1.29',
+ },
+ removed => {
+ }
+ },
+ 5.021007 => {
+ delta_from => 5.021006,
+ changed => {
+ 'Archive::Tar' => '2.04',
+ 'Archive::Tar::Constant'=> '2.04',
+ 'Archive::Tar::File' => '2.04',
+ 'B' => '1.54',
+ 'B::Concise' => '0.996',
+ 'B::Deparse' => '1.31',
+ 'B::Op_private' => '5.021007',
+ 'B::Showlex' => '1.05',
+ 'Compress::Raw::Bzip2' => '2.067',
+ 'Compress::Raw::Zlib' => '2.067',
+ 'Compress::Zlib' => '2.067',
+ 'Config' => '5.021007',
+ 'Cwd' => '3.54',
+ 'DB_File' => '1.834',
+ 'Data::Dumper' => '2.155',
+ 'Devel::PPPort' => '3.25',
+ 'Devel::Peek' => '1.20',
+ 'DynaLoader' => '1.29',
+ 'Encode' => '2.67',
+ 'Errno' => '1.22',
+ 'ExtUtils::CBuilder' => '0.280221',
+ 'ExtUtils::CBuilder::Base'=> '0.280221',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.280221',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.280221',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.280221',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.280221',
+ 'ExtUtils::CBuilder::Platform::android'=> '0.280221',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280221',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.280221',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280221',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.280221',
+ 'ExtUtils::Command::MM' => '7.04',
+ 'ExtUtils::Liblist' => '7.04',
+ 'ExtUtils::Liblist::Kid'=> '7.04',
+ 'ExtUtils::MM' => '7.04',
+ 'ExtUtils::MM_AIX' => '7.04',
+ 'ExtUtils::MM_Any' => '7.04',
+ 'ExtUtils::MM_BeOS' => '7.04',
+ 'ExtUtils::MM_Cygwin' => '7.04',
+ 'ExtUtils::MM_DOS' => '7.04',
+ 'ExtUtils::MM_Darwin' => '7.04',
+ 'ExtUtils::MM_MacOS' => '7.04',
+ 'ExtUtils::MM_NW5' => '7.04',
+ 'ExtUtils::MM_OS2' => '7.04',
+ 'ExtUtils::MM_QNX' => '7.04',
+ 'ExtUtils::MM_UWIN' => '7.04',
+ 'ExtUtils::MM_Unix' => '7.04',
+ 'ExtUtils::MM_VMS' => '7.04',
+ 'ExtUtils::MM_VOS' => '7.04',
+ 'ExtUtils::MM_Win32' => '7.04',
+ 'ExtUtils::MM_Win95' => '7.04',
+ 'ExtUtils::MY' => '7.04',
+ 'ExtUtils::MakeMaker' => '7.04',
+ 'ExtUtils::MakeMaker::Config'=> '7.04',
+ 'ExtUtils::MakeMaker::Locale'=> '7.04',
+ 'ExtUtils::MakeMaker::version'=> '7.04',
+ 'ExtUtils::MakeMaker::version::regex'=> '7.04',
+ 'ExtUtils::MakeMaker::version::vpp'=> '7.04',
+ 'ExtUtils::Mkbootstrap' => '7.04',
+ 'ExtUtils::Mksymlists' => '7.04',
+ 'ExtUtils::ParseXS' => '3.27',
+ 'ExtUtils::ParseXS::Constants'=> '3.27',
+ 'ExtUtils::ParseXS::CountLines'=> '3.27',
+ 'ExtUtils::ParseXS::Eval'=> '3.27',
+ 'ExtUtils::ParseXS::Utilities'=> '3.27',
+ 'ExtUtils::testlib' => '7.04',
+ 'File::Spec' => '3.53',
+ 'File::Spec::Cygwin' => '3.54',
+ 'File::Spec::Epoc' => '3.54',
+ 'File::Spec::Functions' => '3.54',
+ 'File::Spec::Mac' => '3.54',
+ 'File::Spec::OS2' => '3.54',
+ 'File::Spec::Unix' => '3.54',
+ 'File::Spec::VMS' => '3.54',
+ 'File::Spec::Win32' => '3.54',
+ 'Filter::Util::Call' => '1.51',
+ 'HTTP::Tiny' => '0.053',
+ 'IO' => '1.35',
+ 'IO::Compress::Adapter::Bzip2'=> '2.067',
+ 'IO::Compress::Adapter::Deflate'=> '2.067',
+ 'IO::Compress::Adapter::Identity'=> '2.067',
+ 'IO::Compress::Base' => '2.067',
+ 'IO::Compress::Base::Common'=> '2.067',
+ 'IO::Compress::Bzip2' => '2.067',
+ 'IO::Compress::Deflate' => '2.067',
+ 'IO::Compress::Gzip' => '2.067',
+ 'IO::Compress::Gzip::Constants'=> '2.067',
+ 'IO::Compress::RawDeflate'=> '2.067',
+ 'IO::Compress::Zip' => '2.067',
+ 'IO::Compress::Zip::Constants'=> '2.067',
+ 'IO::Compress::Zlib::Constants'=> '2.067',
+ 'IO::Compress::Zlib::Extra'=> '2.067',
+ 'IO::Socket::IP' => '0.34',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.067',
+ 'IO::Uncompress::Adapter::Identity'=> '2.067',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.067',
+ 'IO::Uncompress::AnyInflate'=> '2.067',
+ 'IO::Uncompress::AnyUncompress'=> '2.067',
+ 'IO::Uncompress::Base' => '2.067',
+ 'IO::Uncompress::Bunzip2'=> '2.067',
+ 'IO::Uncompress::Gunzip'=> '2.067',
+ 'IO::Uncompress::Inflate'=> '2.067',
+ 'IO::Uncompress::RawInflate'=> '2.067',
+ 'IO::Uncompress::Unzip' => '2.067',
+ 'Locale::Codes' => '3.33',
+ 'Locale::Codes::Constants'=> '3.33',
+ 'Locale::Codes::Country'=> '3.33',
+ 'Locale::Codes::Country_Codes'=> '3.33',
+ 'Locale::Codes::Country_Retired'=> '3.33',
+ 'Locale::Codes::Currency'=> '3.33',
+ 'Locale::Codes::Currency_Codes'=> '3.33',
+ 'Locale::Codes::Currency_Retired'=> '3.33',
+ 'Locale::Codes::LangExt'=> '3.33',
+ 'Locale::Codes::LangExt_Codes'=> '3.33',
+ 'Locale::Codes::LangExt_Retired'=> '3.33',
+ 'Locale::Codes::LangFam'=> '3.33',
+ 'Locale::Codes::LangFam_Codes'=> '3.33',
+ 'Locale::Codes::LangFam_Retired'=> '3.33',
+ 'Locale::Codes::LangVar'=> '3.33',
+ 'Locale::Codes::LangVar_Codes'=> '3.33',
+ 'Locale::Codes::LangVar_Retired'=> '3.33',
+ 'Locale::Codes::Language'=> '3.33',
+ 'Locale::Codes::Language_Codes'=> '3.33',
+ 'Locale::Codes::Language_Retired'=> '3.33',
+ 'Locale::Codes::Script' => '3.33',
+ 'Locale::Codes::Script_Codes'=> '3.33',
+ 'Locale::Codes::Script_Retired'=> '3.33',
+ 'Locale::Country' => '3.33',
+ 'Locale::Currency' => '3.33',
+ 'Locale::Language' => '3.33',
+ 'Locale::Maketext' => '1.26',
+ 'Locale::Script' => '3.33',
+ 'Module::CoreList' => '5.20141220',
+ 'Module::CoreList::TieHashDelta'=> '5.20141220',
+ 'Module::CoreList::Utils'=> '5.20141220',
+ 'NDBM_File' => '1.14',
+ 'Net::Cmd' => '3.04',
+ 'Net::Config' => '3.04',
+ 'Net::Domain' => '3.04',
+ 'Net::FTP' => '3.04',
+ 'Net::FTP::A' => '3.04',
+ 'Net::FTP::E' => '3.04',
+ 'Net::FTP::I' => '3.04',
+ 'Net::FTP::L' => '3.04',
+ 'Net::FTP::dataconn' => '3.04',
+ 'Net::NNTP' => '3.04',
+ 'Net::Netrc' => '3.04',
+ 'Net::POP3' => '3.04',
+ 'Net::SMTP' => '3.04',
+ 'Net::Time' => '3.04',
+ 'Opcode' => '1.30',
+ 'POSIX' => '1.48',
+ 'PerlIO::scalar' => '0.21',
+ 'Pod::Escapes' => '1.07',
+ 'SDBM_File' => '1.12',
+ 'Storable' => '2.52',
+ 'Sys::Hostname' => '1.20',
+ 'Test::Builder' => '1.301001_090',
+ 'Test::Builder::Module' => '1.301001_090',
+ 'Test::Builder::Tester' => '1.301001_090',
+ 'Test::Builder::Tester::Color'=> '1.301001_090',
+ 'Test::CanFork' => undef,
+ 'Test::CanThread' => undef,
+ 'Test::More' => '1.301001_090',
+ 'Test::Simple' => '1.301001_090',
+ 'Test::Stream' => '1.301001_090',
+ 'Test::Stream::API' => undef,
+ 'Test::Stream::ForceExit'=> undef,
+ 'Test::Stream::Subtest' => undef,
+ 'Test::Tester' => '1.301001_090',
+ 'Test::use::ok' => '1.301001_090',
+ 'Unicode::Collate' => '1.09',
+ 'Unicode::Collate::CJK::Big5'=> '1.09',
+ 'Unicode::Collate::CJK::GB2312'=> '1.09',
+ 'Unicode::Collate::CJK::JISX0208'=> '1.09',
+ 'Unicode::Collate::CJK::Korean'=> '1.09',
+ 'Unicode::Collate::CJK::Pinyin'=> '1.09',
+ 'Unicode::Collate::CJK::Stroke'=> '1.09',
+ 'Unicode::Collate::CJK::Zhuyin'=> '1.09',
+ 'Unicode::Collate::Locale'=> '1.09',
+ 'XS::APItest' => '0.69',
+ 'XSLoader' => '0.20',
+ '_charnames' => '1.43',
+ 'arybase' => '0.09',
+ 'charnames' => '1.43',
+ 'feature' => '1.39',
+ 'mro' => '1.17',
+ 'ok' => '1.301001_090',
+ 'strict' => '1.09',
+ 'threads' => '1.96_001',
+ },
+ removed => {
+ }
+ },
+ 5.021008 => {
+ delta_from => 5.021007,
+ changed => {
+ 'App::Prove' => '3.35',
+ 'App::Prove::State' => '3.35',
+ 'App::Prove::State::Result'=> '3.35',
+ 'App::Prove::State::Result::Test'=> '3.35',
+ 'B' => '1.55',
+ 'B::Deparse' => '1.32',
+ 'B::Op_private' => '5.021008',
+ 'CPAN::Meta::Requirements'=> '2.131',
+ 'Compress::Raw::Bzip2' => '2.068',
+ 'Compress::Raw::Zlib' => '2.068',
+ 'Compress::Zlib' => '2.068',
+ 'Config' => '5.021008',
+ 'DB_File' => '1.835',
+ 'Data::Dumper' => '2.156',
+ 'Devel::PPPort' => '3.28',
+ 'Devel::Peek' => '1.21',
+ 'Digest::MD5' => '2.54',
+ 'Digest::SHA' => '5.95',
+ 'DynaLoader' => '1.30',
+ 'ExtUtils::Command' => '1.20',
+ 'ExtUtils::Manifest' => '1.70',
+ 'Fatal' => '2.26',
+ 'File::Glob' => '1.24',
+ 'Filter::Util::Call' => '1.54',
+ 'Getopt::Long' => '2.43',
+ 'IO::Compress::Adapter::Bzip2'=> '2.068',
+ 'IO::Compress::Adapter::Deflate'=> '2.068',
+ 'IO::Compress::Adapter::Identity'=> '2.068',
+ 'IO::Compress::Base' => '2.068',
+ 'IO::Compress::Base::Common'=> '2.068',
+ 'IO::Compress::Bzip2' => '2.068',
+ 'IO::Compress::Deflate' => '2.068',
+ 'IO::Compress::Gzip' => '2.068',
+ 'IO::Compress::Gzip::Constants'=> '2.068',
+ 'IO::Compress::RawDeflate'=> '2.068',
+ 'IO::Compress::Zip' => '2.068',
+ 'IO::Compress::Zip::Constants'=> '2.068',
+ 'IO::Compress::Zlib::Constants'=> '2.068',
+ 'IO::Compress::Zlib::Extra'=> '2.068',
+ 'IO::Socket::IP' => '0.36',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.068',
+ 'IO::Uncompress::Adapter::Identity'=> '2.068',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.068',
+ 'IO::Uncompress::AnyInflate'=> '2.068',
+ 'IO::Uncompress::AnyUncompress'=> '2.068',
+ 'IO::Uncompress::Base' => '2.068',
+ 'IO::Uncompress::Bunzip2'=> '2.068',
+ 'IO::Uncompress::Gunzip'=> '2.068',
+ 'IO::Uncompress::Inflate'=> '2.068',
+ 'IO::Uncompress::RawInflate'=> '2.068',
+ 'IO::Uncompress::Unzip' => '2.068',
+ 'MIME::Base64' => '3.15',
+ 'Module::CoreList' => '5.20150220',
+ 'Module::CoreList::TieHashDelta'=> '5.20150220',
+ 'Module::CoreList::Utils'=> '5.20150220',
+ 'Module::Load::Conditional'=> '0.64',
+ 'Module::Metadata' => '1.000026',
+ 'Net::Cmd' => '3.05',
+ 'Net::Config' => '3.05',
+ 'Net::Domain' => '3.05',
+ 'Net::FTP' => '3.05',
+ 'Net::FTP::A' => '3.05',
+ 'Net::FTP::E' => '3.05',
+ 'Net::FTP::I' => '3.05',
+ 'Net::FTP::L' => '3.05',
+ 'Net::FTP::dataconn' => '3.05',
+ 'Net::NNTP' => '3.05',
+ 'Net::Netrc' => '3.05',
+ 'Net::POP3' => '3.05',
+ 'Net::SMTP' => '3.05',
+ 'Net::Time' => '3.05',
+ 'Opcode' => '1.31',
+ 'POSIX' => '1.49',
+ 'PerlIO::encoding' => '0.21',
+ 'Pod::Simple' => '3.29',
+ 'Pod::Simple::BlackBox' => '3.29',
+ 'Pod::Simple::Checker' => '3.29',
+ 'Pod::Simple::Debug' => '3.29',
+ 'Pod::Simple::DumpAsText'=> '3.29',
+ 'Pod::Simple::DumpAsXML'=> '3.29',
+ 'Pod::Simple::HTML' => '3.29',
+ 'Pod::Simple::HTMLBatch'=> '3.29',
+ 'Pod::Simple::LinkSection'=> '3.29',
+ 'Pod::Simple::Methody' => '3.29',
+ 'Pod::Simple::Progress' => '3.29',
+ 'Pod::Simple::PullParser'=> '3.29',
+ 'Pod::Simple::PullParserEndToken'=> '3.29',
+ 'Pod::Simple::PullParserStartToken'=> '3.29',
+ 'Pod::Simple::PullParserTextToken'=> '3.29',
+ 'Pod::Simple::PullParserToken'=> '3.29',
+ 'Pod::Simple::RTF' => '3.29',
+ 'Pod::Simple::Search' => '3.29',
+ 'Pod::Simple::SimpleTree'=> '3.29',
+ 'Pod::Simple::Text' => '3.29',
+ 'Pod::Simple::TextContent'=> '3.29',
+ 'Pod::Simple::TiedOutFH'=> '3.29',
+ 'Pod::Simple::Transcode'=> '3.29',
+ 'Pod::Simple::TranscodeDumb'=> '3.29',
+ 'Pod::Simple::TranscodeSmart'=> '3.29',
+ 'Pod::Simple::XHTML' => '3.29',
+ 'Pod::Simple::XMLOutStream'=> '3.29',
+ 'SDBM_File' => '1.13',
+ 'Safe' => '2.39',
+ 'TAP::Base' => '3.35',
+ 'TAP::Formatter::Base' => '3.35',
+ 'TAP::Formatter::Color' => '3.35',
+ 'TAP::Formatter::Console'=> '3.35',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.35',
+ 'TAP::Formatter::Console::Session'=> '3.35',
+ 'TAP::Formatter::File' => '3.35',
+ 'TAP::Formatter::File::Session'=> '3.35',
+ 'TAP::Formatter::Session'=> '3.35',
+ 'TAP::Harness' => '3.35',
+ 'TAP::Harness::Env' => '3.35',
+ 'TAP::Object' => '3.35',
+ 'TAP::Parser' => '3.35',
+ 'TAP::Parser::Aggregator'=> '3.35',
+ 'TAP::Parser::Grammar' => '3.35',
+ 'TAP::Parser::Iterator' => '3.35',
+ 'TAP::Parser::Iterator::Array'=> '3.35',
+ 'TAP::Parser::Iterator::Process'=> '3.35',
+ 'TAP::Parser::Iterator::Stream'=> '3.35',
+ 'TAP::Parser::IteratorFactory'=> '3.35',
+ 'TAP::Parser::Multiplexer'=> '3.35',
+ 'TAP::Parser::Result' => '3.35',
+ 'TAP::Parser::Result::Bailout'=> '3.35',
+ 'TAP::Parser::Result::Comment'=> '3.35',
+ 'TAP::Parser::Result::Plan'=> '3.35',
+ 'TAP::Parser::Result::Pragma'=> '3.35',
+ 'TAP::Parser::Result::Test'=> '3.35',
+ 'TAP::Parser::Result::Unknown'=> '3.35',
+ 'TAP::Parser::Result::Version'=> '3.35',
+ 'TAP::Parser::Result::YAML'=> '3.35',
+ 'TAP::Parser::ResultFactory'=> '3.35',
+ 'TAP::Parser::Scheduler'=> '3.35',
+ 'TAP::Parser::Scheduler::Job'=> '3.35',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.35',
+ 'TAP::Parser::Source' => '3.35',
+ 'TAP::Parser::SourceHandler'=> '3.35',
+ 'TAP::Parser::SourceHandler::Executable'=> '3.35',
+ 'TAP::Parser::SourceHandler::File'=> '3.35',
+ 'TAP::Parser::SourceHandler::Handle'=> '3.35',
+ 'TAP::Parser::SourceHandler::Perl'=> '3.35',
+ 'TAP::Parser::SourceHandler::RawTAP'=> '3.35',
+ 'TAP::Parser::YAMLish::Reader'=> '3.35',
+ 'TAP::Parser::YAMLish::Writer'=> '3.35',
+ 'Test::Builder' => '1.301001_097',
+ 'Test::Builder::Module' => '1.301001_097',
+ 'Test::Builder::Tester' => '1.301001_097',
+ 'Test::Builder::Tester::Color'=> '1.301001_097',
+ 'Test::Harness' => '3.35',
+ 'Test::More' => '1.301001_097',
+ 'Test::Simple' => '1.301001_097',
+ 'Test::Stream' => '1.301001_097',
+ 'Test::Stream::Block' => undef,
+ 'Test::Tester' => '1.301001_097',
+ 'Test::Tester::CaptureRunner'=> undef,
+ 'Test::Tester::Delegate'=> undef,
+ 'Test::use::ok' => '1.301001_097',
+ 'Unicode::Collate' => '1.10',
+ 'Unicode::Collate::CJK::Big5'=> '1.10',
+ 'Unicode::Collate::CJK::GB2312'=> '1.10',
+ 'Unicode::Collate::CJK::JISX0208'=> '1.10',
+ 'Unicode::Collate::CJK::Korean'=> '1.10',
+ 'Unicode::Collate::CJK::Pinyin'=> '1.10',
+ 'Unicode::Collate::CJK::Stroke'=> '1.10',
+ 'Unicode::Collate::CJK::Zhuyin'=> '1.10',
+ 'Unicode::Collate::Locale'=> '1.10',
+ 'VMS::DCLsym' => '1.06',
+ 'XS::APItest' => '0.70',
+ 'arybase' => '0.10',
+ 'attributes' => '0.25',
+ 'autodie' => '2.26',
+ 'autodie::Scope::Guard' => '2.26',
+ 'autodie::Scope::GuardStack'=> '2.26',
+ 'autodie::ScopeUtil' => '2.26',
+ 'autodie::exception' => '2.26',
+ 'autodie::exception::system'=> '2.26',
+ 'autodie::hints' => '2.26',
+ 'autodie::skip' => '2.26',
+ 'ok' => '1.301001_097',
+ 're' => '0.30',
+ 'warnings' => '1.30',
+ },
+ removed => {
+ }
+ },
+ 5.020002 => {
+ delta_from => 5.020001,
+ changed => {
+ 'CPAN::Author' => '5.5002',
+ 'CPAN::CacheMgr' => '5.5002',
+ 'CPAN::FTP' => '5.5006',
+ 'CPAN::HTTP::Client' => '1.9601',
+ 'CPAN::HandleConfig' => '5.5005',
+ 'CPAN::Index' => '1.9601',
+ 'CPAN::LWP::UserAgent' => '1.9601',
+ 'CPAN::Mirrors' => '1.9601',
+ 'Config' => '5.020002',
+ 'Cwd' => '3.48_01',
+ 'Data::Dumper' => '2.151_01',
+ 'Errno' => '1.20_05',
+ 'File::Spec' => '3.48_01',
+ 'File::Spec::Cygwin' => '3.48_01',
+ 'File::Spec::Epoc' => '3.48_01',
+ 'File::Spec::Functions' => '3.48_01',
+ 'File::Spec::Mac' => '3.48_01',
+ 'File::Spec::OS2' => '3.48_01',
+ 'File::Spec::Unix' => '3.48_01',
+ 'File::Spec::VMS' => '3.48_01',
+ 'File::Spec::Win32' => '3.48_01',
+ 'IO::Socket' => '1.38',
+ 'Module::CoreList' => '5.20150214',
+ 'Module::CoreList::TieHashDelta'=> '5.20150214',
+ 'Module::CoreList::Utils'=> '5.20150214',
+ 'PerlIO::scalar' => '0.18_01',
+ 'Pod::PlainText' => '2.07',
+ 'Storable' => '2.49_01',
+ 'VMS::DCLsym' => '1.05_01',
+ 'VMS::Stdio' => '2.41',
+ 'attributes' => '0.23',
+ 'feature' => '1.36_01',
+ },
+ removed => {
+ }
+ },
);
sub is_core
removed => {
}
},
+ 5.018003 => {
+ delta_from => 5.018,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.018004 => {
+ delta_from => 5.018,
+ changed => {
+ },
+ removed => {
+ }
+ },
5.019 => {
delta_from => 5.018,
removed => {
}
},
+ 5.021004 => {
+ delta_from => 5.021003,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.021005 => {
+ delta_from => 5.021004,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.021006 => {
+ delta_from => 5.021005,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.021007 => {
+ delta_from => 5.021006,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.021008 => {
+ delta_from => 5.021007,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.020002 => {
+ delta_from => 5.020001,
+ changed => {
+ },
+ removed => {
+ }
+ },
);
for my $version (sort { $a <=> $b } keys %deprecated) {
'Test' => undef,
'Test::Builder' => 'http://github.com/Test-More/test-more/issues/',
'Test::Builder::Module' => 'http://github.com/Test-More/test-more/issues/',
- 'Test::Builder::Tester' => 'http://github.com/schwern/test-more/issues',
- 'Test::Builder::Tester::Color'=> 'http://github.com/schwern/test-more/issues',
+ 'Test::Builder::Tester' => 'http://github.com/Test-More/test-more/issues/',
+ 'Test::Builder::Tester::Color'=> 'http://github.com/Test-More/test-more/issues/',
'Test::Harness' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
'Test::More' => 'http://github.com/Test-More/test-more/issues/',
'Test::Simple' => 'http://github.com/Test-More/test-more/issues/',
'encoding' => undef,
'encoding::warnings' => undef,
'experimental' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=experimental',
- 'inc::latest' => undef,
+ 'inc::latest' => 'https://github.com/dagolden/inc-latest/issues',
'parent' => undef,
'perlfaq' => 'https://github.com/perl-doc-cats/perlfaq/issues',
- 'version' => undef,
- 'version::regex' => undef,
- 'version::vpp' => undef,
+ 'version' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=version',
+ 'version::regex' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=version',
+ 'version::vpp' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=version',
);
# Create aliases with trailing zeros for $] use
=head1 CAVEATS
Module::CoreList currently covers the 5.000, 5.001, 5.002, 5.003_07,
-5.004, 5.004_05, 5.005, 5.005_03, 5.005_04, 5.6.0, 5.6.1, 5.6.2, 5.7.3,
-5.8.0, 5.8.1, 5.8.2, 5.8.3, 5.8.4, 5.8.5, 5.8.6, 5.8.7, 5.8.8, 5.8.9,
-5.9.0, 5.9.1, 5.9.2, 5.9.3, 5.9.4, 5.9.5, 5.10.0, 5.10.1, 5.11.0, 5.11.1,
-5.11.2, 5.11.3, 5.11.4, 5.11.5, 5.12.0, 5.12.1, 5.12.2, 5.12.3, 5.12.4,
-5.12.5, 5.13.0, 5.13.1, 5.13.2, 5.13.3, 5.13.4, 5.13.5, 5.13.6, 5.13.7,
-5.13.8, 5.13.9, 5.13.10, 5.13.11, 5.14.0, 5.14.1, 5.14.2 5.14.3, 5.14.4,
-5.15.0, 5.15.1, 5.15.2, 5.15.3, 5.15.4, 5.15.5, 5.15.6, 5.15.7, 5.15.8,
-5.15.9, 5.16.0, 5.16.1, 5.16.2, 5.16.3, 5.17.0, 5.17.1, 5.17.2, 5.17.3,
-5.17.4, 5.17.5, 5.17.6, 5.17.7, 5.17.8, 5.17.9, 5.17.10, 5.17.11, 5.18.0,
-5.19.0, 5.19.1, 5.19.2, 5.19.3, 5.19.4, 5.19.5, 5.19.6, 5.19.7, 5.19.8,
-5.19.9, 5.19.10, 5.19.11, 5.20.0, 5.21.0, 5.21.1, 5.21.2, 5.21.3 and
-5.20.1 releases of perl.
+5.004, 5.004_05, 5.005, 5.005_03, 5.005_04 and 5.7.3 releases of perl.
+
+All stable releases of perl since 5.6.0 are covered.
+
+All development releases of perl since 5.9.0 are covered.
+
=head1 HISTORY
use strict;
use vars qw($VERSION);
-$VERSION = '5.020001';
+$VERSION = '5.20150214';
sub TIEHASH {
my ($class, $changed, $removed, $parent) = @_;
use Module::CoreList;
use Module::CoreList::TieHashDelta;
-$VERSION = '5.020001';
+$VERSION = '5.20150214';
sub utilities {
my $perl = shift;
removed => {
}
},
+ 5.018003 => {
+ delta_from => 5.018000,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.018004 => {
+ delta_from => 5.018000,
+ changed => {
+ },
+ removed => {
+ }
+ },
5.019000 => {
delta_from => 5.018000,
changed => {
removed => {
}
},
+ 5.021004 => {
+ delta_from => 5.021003,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.021005 => {
+ delta_from => 5.021004,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.021006 => {
+ delta_from => 5.021005,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.021007 => {
+ delta_from => 5.021006,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.021008 => {
+ delta_from => 5.021007,
+ changed => {
+ },
+ removed => {
+ }
+ },
+ 5.020002 => {
+ delta_from => 5.020001,
+ changed => {
+ },
+ removed => {
+ }
+ },
);
for my $version (sort { $a <=> $b } keys %delta) {
#!perl -w
use strict;
use Module::CoreList;
-use Test::More tests => 25;
+use Test::More tests => 29;
BEGIN { require_ok('Module::CoreList'); }
is(Module::CoreList::removed_from('CPANPLUS::inc'), 5.010001,
"CPANPLUS::inc was removed from 5.010001");
+{
+ my $warnings_count = 0;
+ local $SIG{__WARN__} = sub { $warnings_count++ };
+ local $^W = 1;
+
+ ok(exists $Module::CoreList::version{5}{strict},
+ "strict was in 5");
+
+ ok(!defined $Module::CoreList::version{5}{strict},
+ "strict had no version in 5");
+
+ is(Module::CoreList::first_release('strict', 1.01), 5.00405,
+ "strict reached 1.01 with 5.00405");
+
+ cmp_ok($warnings_count, '==', 0,
+ "an undefined version does not produce warnings rt#123556");
+}
use Exporter;
use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
-$VERSION = '3.48';
+$VERSION = '3.48_01';
my $xs_version = $VERSION;
$VERSION =~ tr/_//;
symlink[slen] = '/';
symlink[slen + 1] = 0;
}
- left_len = my_strlcat(symlink, left, sizeof(left));
+ left_len = my_strlcat(symlink, left, sizeof(symlink));
if (left_len >= sizeof(left)) {
errno = ENAMETOOLONG;
return (NULL);
use strict;
use vars qw(@ISA $VERSION);
-$VERSION = '3.48';
+$VERSION = '3.48_01';
$VERSION =~ tr/_//;
my %module = (MacOS => 'Mac',
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '3.48';
+$VERSION = '3.48_01';
$VERSION =~ tr/_//;
@ISA = qw(File::Spec::Unix);
use strict;
use vars qw($VERSION @ISA);
-$VERSION = '3.48';
+$VERSION = '3.48_01';
$VERSION =~ tr/_//;
require File::Spec::Unix;
use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
-$VERSION = '3.48';
+$VERSION = '3.48_01';
$VERSION =~ tr/_//;
require Exporter;
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '3.48';
+$VERSION = '3.48_01';
$VERSION =~ tr/_//;
@ISA = qw(File::Spec::Unix);
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '3.48';
+$VERSION = '3.48_01';
$VERSION =~ tr/_//;
@ISA = qw(File::Spec::Unix);
use strict;
use vars qw($VERSION);
-$VERSION = '3.48';
+$VERSION = '3.48_01';
my $xs_version = $VERSION;
$VERSION =~ tr/_//;
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '3.48';
+$VERSION = '3.48_01';
$VERSION =~ tr/_//;
@ISA = qw(File::Spec::Unix);
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '3.48';
+$VERSION = '3.48_01';
$VERSION =~ tr/_//;
@ISA = qw(File::Spec::Unix);
use vars qw($canonical $forgive_me $VERSION);
-$VERSION = '2.49';
+$VERSION = '2.49_01';
BEGIN {
if (eval { local $SIG{__DIE__}; require Log::Agent; 1 }) {
The store functions will C<croak> if they run into such references
unless you set C<$Storable::forgive_me> to some C<TRUE> value. In that
-case, the fatal message is turned in a warning and some
-meaningless string is stored instead.
+case, the fatal message is converted to a warning and some meaningless
+string is stored instead.
Setting C<$Storable::canonical> may not yield frozen strings that
compare equal due to possible stringification of numbers. When the
}
END {
+ # rmtree() can indirectly load the XS object for Win32, ensure
+ # we have our original sane @INC
+ local @INC = @OrigINC;
# cleanup the auto/ directory we created.
rmtree([$lib_dir[0]]);
}
use Config;
use strict;
-our $VERSION = "1.20_03";
+our $VERSION = "1.20_05";
my %err = ();
my($name,$expr);
next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
next if $name eq $expr;
- $expr =~ s/\(?\(\s*[a-z_]\w*\s*\)([^\)]*)\)?/$1/i; # ((type)0xcafebabe) at alia
- $expr =~ s/((?:0x)?[0-9a-fA-F]+)[luLU]+\b/$1/g; # 2147483647L et alia
- next if $expr =~ m/^[a-zA-Z]+$/; # skip some Win32 functions
+ $expr =~ s/\(?\(\s*[a-z_]\w*\s*\)\(?([^\)]+)\)?\)?/$1/i; # ((type)0xcafebabe) at alia
+ $expr =~ s/\b((?:0x)?[0-9a-f]+)[LU]+\b/$1/gi; # 2147483647L et alia
+ next if $expr =~ m/\b[a-z_]\w*\b/i; # skip expressions containing function names etc
if($expr =~ m/^0[xX]/) {
$err{$name} = hex $expr;
}
package PerlIO::scalar;
-our $VERSION = '0.18';
+our $VERSION = '0.18_01';
require XSLoader;
XSLoader::load();
1;
PerlIOScalar_seek(pTHX_ PerlIO * f, Off_t offset, int whence)
{
PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
+ Off_t new_posn;
switch (whence) {
case SEEK_SET:
- s->posn = offset;
+ new_posn = offset;
break;
case SEEK_CUR:
- s->posn = offset + s->posn;
+ new_posn = offset + s->posn;
break;
case SEEK_END:
{
STRLEN oldcur;
(void)SvPV(s->var, oldcur);
- s->posn = offset + oldcur;
+ new_posn = offset + oldcur;
break;
}
+ default:
+ SETERRNO(EINVAL, SS_IVCHAN);
+ return -1;
}
- if (s->posn < 0) {
+ if (new_posn < 0) {
if (ckWARN(WARN_LAYER))
Perl_warner(aTHX_ packWARN(WARN_LAYER), "Offset outside string");
SETERRNO(EINVAL, SS_IVCHAN);
return -1;
}
+ s->posn = new_posn;
return 0;
}
SV *sv = s->var;
char *p;
STRLEN len;
- I32 got;
+ STRLEN got;
p = SvPV(sv, len);
if (SvUTF8(sv)) {
if (sv_utf8_downgrade(sv, TRUE)) {
return -1;
}
}
- got = len - (STRLEN)(s->posn);
- if (got <= 0)
+ /* I assume that Off_t is at least as large as len (which
+ * seems safe) and that the size of the buffer in our SV is
+ * always less than half the size of the address space
+ */
+ assert(sizeof(Off_t) >= sizeof(len));
+ assert((Off_t)len >= 0);
+ if ((Off_t)len <= s->posn)
return 0;
+ got = len - (STRLEN)(s->posn);
if ((STRLEN)got > (STRLEN)count)
got = (STRLEN)count;
Copy(p + (STRLEN)(s->posn), vbuf, got, STDCHAR);
PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
STRLEN len;
(void)SvPV(s->var,len);
- if (len > (STRLEN) s->posn)
+ if ((Off_t)len > s->posn)
return len - (STRLEN)s->posn;
else
return 0;
$| = 1;
-use Test::More tests => 114;
+use Test::More tests => 120;
my $fh;
my $var = "aaa\n";
print $refh "boo\n";
is $x, $as_string."boo\n", 'string gets appended to ref';
}
+
+SKIP:
+{ # [perl #123443]
+ skip "Can't seek over 4GB with a small off_t", 4
+ if $Config::Config{lseeksize} < 8;
+ my $buf0 = "hello";
+ open my $fh, "<", \$buf0 or die $!;
+ ok(seek($fh, 2**32, SEEK_SET), "seek to a large position");
+ is(read($fh, my $tmp, 1), 0, "read from a large offset");
+ is($tmp, "", "should have read nothing");
+ ok(eof($fh), "fh should be eof");
+}
+
+{
+ my $buf0 = "hello";
+ open my $fh, "<", \$buf0 or die $!;
+ ok(!seek($fh, -10, SEEK_CUR), "seek to negative position");
+ is(tell($fh), 0, "shouldn't change the position");
+}
# Package globals
@ISA = ( 'DynaLoader' );
-$VERSION = '1.05';
+$VERSION = '1.05_01';
my(%Locsyms) = ( ':ID' => 'LOCAL' );
my(%Gblsyms) = ( ':ID' => 'GLOBAL');
my $DoCache = 1;
=head1 VERSION
-1.05 12-Feb-2011
+1.05_01 16-Jun-2013
=head1 BUGS
use DynaLoader ();
use Exporter ();
-$VERSION = '2.4';
+$VERSION = '2.41';
@ISA = qw( Exporter DynaLoader IO::File );
@EXPORT = qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY &O_NOWAIT
&O_RDONLY &O_RDWR &O_TRUNC &O_WRONLY );
skip_all("clone_with_stack requires threads");
}
-plan(4);
+plan(5);
fresh_perl_is( <<'----', <<'====', undef, "minimal clone_with_stack" );
use XS::APItest;
====
}
+
+{
+ fresh_perl_is( <<'----', <<'====', undef, "with localised stuff" );
+use XS::APItest;
+$s = "outer";
+$a[0] = "anterior";
+$h{k} = "hale";
+{
+ local $s = "inner";
+ local $a[0] = 'posterior';
+ local $h{k} = "halt";
+ clone_with_stack();
+}
+print "scl: $s\n";
+print "ary: $a[0]\n";
+print "hsh: $h{k}\n";
+----
+scl: outer
+ary: anterior
+hsh: hale
+====
+
+}
package attributes;
-our $VERSION = 0.22;
+our $VERSION = 0.23;
@EXPORT_OK = qw(get reftype);
@EXPORT = ();
}
break;
default:
- if (memEQs(name, 6, "shared")) {
+ if (memEQs(name, len, "shared")) {
if (negated)
Perl_croak(aTHX_ "A variable may not be unshared");
SvSHARE(sv);
# mkdir -p /opt/perl-catamount
# mkdir -p /opt/perl-catamount/include
# mkdir -p /opt/perl-catamount/lib
-# mkdir -p /opt/perl-catamount/lib/perl5/5.20.1
+# mkdir -p /opt/perl-catamount/lib/perl5/5.20.2
# mkdir -p /opt/perl-catamount/bin
# cp *.h /opt/perl-catamount/include
# cp libperl.a /opt/perl-catamount/lib
-# cp -pr lib/* /opt/perl-catamount/lib/perl5/5.20.1
+# cp -pr lib/* /opt/perl-catamount/lib/perl5/5.20.2
# cp miniperl perl run.sh cc.sh /opt/perl-catamount/lib
#
# With the headers and the libperl.a you can embed Perl to your Catamount
# Allow the user to override ld, but modify it as necessary below
case "$ld" in
- '') ld='cc';;
+ '') case "$cc" in
+ # If the cc is explicitly something else than cc (or empty),
+ # set the ld to be that explicitly something else. Conversely,
+ # if the cc is 'cc' (or empty), set the ld to be 'cc'.
+ cc|'') ld='cc';;
+ *) ld="$cc" ;;
+ esac
+ ;;
esac
# Perl bundles do not expect two-level namespace, added in Darwin 1.4.
/* Hook for File::Glob */
PERLVARI(I, globhook, globhook_t, NULL)
-/* The last unconditional member of the interpreter structure when 5.20.1 was
+/* The last unconditional member of the interpreter structure when 5.20.2 was
released. The offset of the end of this is baked into a global variable in
any shared perl library which will allow a sanity test in future perl
releases. */
package feature;
-our $VERSION = '1.36';
+our $VERSION = '1.36_01';
our %feature = (
fc => 'feature_fc',
This feature is available from Perl 5.18 onwards.
+=head2 The 'postderef' and 'postderef_qq' features
+
+B<WARNING>: This feature is still experimental and the implementation may
+change in future versions of Perl. For this reason, Perl will
+warn when you use the feature, unless you have explicitly disabled the
+warning:
+
+ no warnings "experimental::postderef";
+
+The 'postderef' feature allows the use of L<postfix dereference
+syntax|perlref/Postfix Dereference Syntax>. For example, it will make the
+following two statements equivalent:
+
+ my @x = @{ $h->{a} };
+ my @x = $h->{a}->@*;
+
+The 'postderef_qq' feature extends this, for array and scalar dereference, to
+working inside of double-quotish interpolations.
+
+This feature is available from Perl 5.20 onwards.
+
=head2 The 'signatures' feature
B<WARNING>: This feature is still experimental and the implementation may
# the Makefile.PL. Altering the atime and mtime backwards by 4
# seconds seems to resolve the issue.
eval {
- my $ftime = time - 4;
- utime $ftime, $ftime, 'Makefile.PL';
+ my $ftime = (stat('Makefile.PL'))[9] - 4;
+ utime $ftime, $ftime, 'Makefile.PL';
};
} elsif ($mname =~ /\A(?:Carp
|ExtUtils::CBuilder
# (which it has to deal with, as cpan/foo/bar creates
# lib/auto/foo/bar, but the EU::MM rule will only
# rmdir lib/auto/foo/bar, leaving lib/auto/foo
- _unlink("../../$_")
+ _unlink($_)
foreach sort values %pm;
}
}
AV which is @_. Other entries are storage for variables and op targets.
Iterating over the PADNAMELIST iterates over all possible pad
-items. Pad slots for targets (SVs_PADTMP) and GVs end up having &PL_sv_no
+items. Pad slots for targets (SVs_PADTMP)
+and GVs end up having &PL_sv_undef
"names", while slots for constants have &PL_sv_no "names" (see
pad_alloc()). That &PL_sv_no is used is an implementation detail subject
to change. To test for it, use C<PadnamePV(name) && !PadnameLEN(name)>.
=for apidoc m|SV *|PAD_SETSV |PADOFFSET po|SV* sv
Set the slot at offset C<po> in the current pad to C<sv>
-=for apidoc m|void|PAD_SV |PADOFFSET po
+=for apidoc m|SV *|PAD_SV |PADOFFSET po
Get the value at offset C<po> in the current pad
=for apidoc m|SV *|PAD_SVl |PADOFFSET po
--- /dev/null
+=encoding utf8
+
+=head1 NAME
+
+perl5184delta - what is new for perl v5.18.4
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.18.4 release and the 5.18.2
+release. B<Please note:> This document ignores perl 5.18.3, a broken release
+which existed for a few hours only.
+
+If you are upgrading from an earlier release such as 5.18.1, first read
+L<perl5182delta>, which describes differences between 5.18.1 and 5.18.2.
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<Digest::SHA> has been upgraded from 5.84_01 to 5.84_02.
+
+=item *
+
+L<perl5db.pl> has been upgraded from version 1.39_10 to 1.39_11.
+
+This fixes a crash in tab completion, where available. [perl #120827] Also,
+filehandle information is properly reset after a pager is run. [perl #121456]
+
+=back
+
+=head1 Platform Support
+
+=head2 Platform-Specific Notes
+
+=over 4
+
+=item Win32
+
+=over 4
+
+=item *
+
+Introduced by
+L<perl #113536|https://rt.perl.org/Public/Bug/Display.html?id=113536>, a memory
+leak on every call to C<system> and backticks (C< `` >), on most Win32 Perls
+starting from 5.18.0 has been fixed. The memory leak only occurred if you
+enabled psuedo-fork in your build of Win32 Perl, and were running that build on
+Server 2003 R2 or newer OS. The leak does not appear on WinXP SP3.
+[L<perl #121676|https://rt.perl.org/Public/Bug/Display.html?id=121676>]
+
+=back
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+The debugger now properly resets filehandles as needed. [perl #121456]
+
+=item *
+
+A segfault in Digest::SHA has been addressed. [perl #121421]
+
+=item *
+
+perl can again be built with USE_64_BIT_INT, with Visual C 2003, 32 bit.
+[perl #120925]
+
+=item *
+
+A leading { (brace) in formats is properly parsed again. [perl #119973]
+
+=item *
+
+Copy the values used to perturb hash iteration when cloning an
+interpreter. This was fairly harmless but caused C<valgrind> to
+complain. [perl #121336]
+
+=item *
+
+In Perl v5.18 C<undef *_; goto &sub> and C<local *_; goto &sub> started
+crashing. This has been fixed. [perl #119949]
+
+=back
+
+=head1 Acknowledgements
+
+Perl 5.18.4 represents approximately 9 months of development since Perl 5.18.2
+and contains approximately 2,000 lines of changes across 53 files from 13
+authors.
+
+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.18.4:
+
+Daniel Dragan, David Mitchell, Doug Bell, Father Chrysostomos, Hiroo Hayashi,
+James E Keenan, Karl Williamson, Mark Shelor, Ricardo Signes, Shlomi Fish,
+Smylers, Steve Hay, Tony Cook.
+
+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
+the (very much appreciated) contributors who reported issues to the Perl bug
+tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core. We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please see
+the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles recently
+posted to the comp.lang.perl.misc newsgroup and the perl bug database at
+http://rt.perl.org/perlbug/ . There may also be information at
+http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release. Be sure to trim your bug down to a tiny but
+sufficient test case. Your bug report, along with the output of C<perl -V>,
+will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications, which make it
+inappropriate to send to a publicly archived mailing list, then please send it
+to perl5-security-report@perl.org. This points to a closed subscription
+unarchived mailing list, which includes all the core committers, who will be
+able to help assess the impact of issues, figure out a resolution, and help
+co-ordinate the release of patches to mitigate or fix the problem across all
+platforms on which Perl is supported. Please only use this address for
+security issues in the Perl core, not for modules independently distributed on
+CPAN.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
+
--- /dev/null
+=encoding utf8
+
+=head1 NAME
+
+perl5201delta - what is new for perl v5.20.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.20.0 release and the 5.20.1
+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.
+
+=head1 Incompatible Changes
+
+There are no changes intentionally incompatible with 5.20.0. If any exist,
+they are bugs, and we request that you submit a report. See L</Reporting Bugs>
+below.
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+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>
+
+=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>
+
+=back
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<Config::Perl::V> has been upgraded from version 0.20 to 0.22.
+
+The list of Perl versions covered has been updated and some flaws in the
+parsing have been fixed.
+
+=item *
+
+L<Exporter> has been upgraded from version 5.70 to 5.71.
+
+Illegal POD syntax in the documentation has been corrected.
+
+=item *
+
+L<ExtUtils::CBuilder> has been upgraded from version 0.280216 to 0.280217.
+
+Android builds now link to both B<-lperl> and C<$Config::Config{perllibs}>.
+
+=item *
+
+L<File::Copy> has been upgraded from version 2.29 to 2.30.
+
+The documentation now notes that C<copy> will not overwrite read-only files.
+
+=item *
+
+L<Module::CoreList> has been upgraded from version 3.11 to 5.020001.
+
+The list of Perl versions covered has been updated.
+
+=item *
+
+The PathTools module collection has been upgraded from version 3.47 to 3.48.
+
+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>
+
+=item *
+
+L<PerlIO::via> has been upgraded from version 0.14 to 0.15.
+
+A minor portability improvement has been made to the XS implementation.
+
+=item *
+
+L<Unicode::UCD> has been upgraded from version 0.57 to 0.58.
+
+The documentation includes many clarifications and fixes.
+
+=item *
+
+L<utf8> has been upgraded from version 1.13 to 1.13_01.
+
+The documentation has some minor formatting improvements.
+
+=item *
+
+L<version> has been upgraded from version 0.9908 to 0.9909.
+
+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>
+
+=back
+
+=head1 Documentation
+
+=head2 Changes to Existing Documentation
+
+=head3 L<perlapi>
+
+=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>
+
+=item *
+
+Note that C<SvSetSV> doesn't do set magic.
+
+=item *
+
+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>
+
+=item *
+
+Clarify where C<NUL> may be embedded or is required to terminate a string.
+
+=back
+
+=head3 L<perlfunc>
+
+=over 4
+
+=item *
+
+Clarify the meaning of C<-B> and C<-T>.
+
+=item *
+
+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>
+
+=item *
+
+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>
+
+=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>
+
+=item *
+
+Clarify the meaning of C<our>.
+L<[perl #122132]|https://rt.perl.org/Ticket/Display.html?id=122132>
+
+=back
+
+=head3 L<perlguts>
+
+=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>
+
+=back
+
+=head3 L<perlpolicy>
+
+=over 4
+
+=item *
+
+We now have a code of conduct for the I<< p5p >> mailing list, as documented in
+L<< perlpolicy/STANDARDS OF CONDUCT >>.
+
+=back
+
+=head3 L<perlre>
+
+=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
+
+=head3 L<perlsyn>
+
+=over 4
+
+=item *
+
+Mention the use of empty conditionals in C<for>/C<while> loops for infinite
+loops.
+
+=back
+
+=head3 L<perlxs>
+
+=over 4
+
+=item *
+
+Added a discussion of locale issues in XS code.
+
+=back
+
+=head1 Diagnostics
+
+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
+
+=over 4
+
+=item *
+
+L<Variable length lookbehind not implemented in regex mE<sol>%sE<sol>|perldiag/"Variable length lookbehind not implemented in regex m/%s/">
+
+Information about Unicode behaviour has been added.
+
+=back
+
+=head1 Configuration and Compilation
+
+=over 4
+
+=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>
+
+=back
+
+=head1 Platform Support
+
+=head2 Platform-Specific Notes
+
+=over 4
+
+=item Android
+
+Build support has been improved for cross-compiling in general and for Android
+in particular.
+
+=item OpenBSD
+
+Corrected architectures and version numbers used in configuration hints when
+building Perl.
+
+=item Solaris
+
+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.
+
+=item VMS
+
+An old bug in feature checking, mainly affecting pre-7.3 systems, has been
+fixed.
+
+=item Windows
+
+C<%I64d> is now being used instead of C<%lld> for MinGW.
+
+=back
+
+=head1 Internal Changes
+
+=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.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=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.
+
+=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
+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.
+
+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 list above is almost certainly incomplete as it is automatically generated
+from version control history. In particular, it does not include the names of
+the (very much appreciated) contributors who reported issues to the Perl bug
+tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core. We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please see
+the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles recently
+posted to the comp.lang.perl.misc newsgroup and the perl bug database at
+https://rt.perl.org/ . There may also be information at http://www.perl.org/ ,
+the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release. Be sure to trim your bug down to a tiny but
+sufficient test case. Your bug report, along with the output of C<perl -V>,
+will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications, which make it
+inappropriate to send to a publicly archived mailing list, then please send it
+to perl5-security-report@perl.org. This points to a closed subscription
+unarchived mailing list, which includes all the core committers, who will be
+able to help assess the impact of issues, figure out a resolution, and help
+co-ordinate the release of patches to mitigate or fix the problem across all
+platforms on which Perl is supported. Please only use this address for
+security issues in the Perl core, not for modules independently distributed on
+CPAN.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Introduced in Perl 5.18
+=item Subroutine signatures
+
+Introduced in Perl 5.20.0
+
+Using this feature triggers warnings in the category
+C<experimental::signatures>.
+
+The ticket for this feature is
+L<[perl #121481]|https://rt.perl.org/Ticket/Display.html?id=121481>.
+
=item Postfix dereference syntax
Introduced in Perl 5.20.0
after their pseudo-children have exited.
Starting with Perl 5.14 a parent will not wait() automatically
-for any child that has been signalled with C<sig('TERM', ...)>
+for any child that has been signalled with C<kill('TERM', ...)>
to avoid a deadlock in case the child is blocking on I/O and
never receives the signal.
BEGIN block. For example, consider the following code:
BEGIN {
- fork and exit; # fork child and exit the parent
- print "inner\n";
+ fork and exit; # fork child and exit the parent
+ print "inner\n";
}
print "outer\n";
On some operating systems, notably Solaris and Unixware, calling C<exit()>
from a child process will flush and close open filehandles in the parent,
thereby corrupting the filehandles. On these systems, calling C<_exit()>
-is suggested instead. C<_exit()> is available in Perl through the
+is suggested instead. C<_exit()> is available in Perl through the
C<POSIX> module. Please consult your system's manpages for more information
on this.
# simulate open(FOO, "|-")
sub pipe_to_fork ($) {
- my $parent = shift;
- pipe my $child, $parent or die;
- my $pid = fork();
- die "fork() failed: $!" unless defined $pid;
- if ($pid) {
- close $child;
- }
- else {
- close $parent;
- open(STDIN, "<&=" . fileno($child)) or die;
- }
- $pid;
+ my $parent = shift;
+ pipe my $child, $parent or die;
+ my $pid = fork();
+ die "fork() failed: $!" unless defined $pid;
+ if ($pid) {
+ close $child;
+ }
+ else {
+ close $parent;
+ open(STDIN, "<&=" . fileno($child)) or die;
+ }
+ $pid;
}
if (pipe_to_fork('FOO')) {
- # parent
- print FOO "pipe_to_fork\n";
- close FOO;
+ # parent
+ print FOO "pipe_to_fork\n";
+ close FOO;
}
else {
- # child
- while (<STDIN>) { print; }
- exit(0);
+ # child
+ while (<STDIN>) { print; }
+ exit(0);
}
And this one reads from the child:
# simulate open(FOO, "-|")
sub pipe_from_fork ($) {
- my $parent = shift;
- pipe $parent, my $child or die;
- my $pid = fork();
- die "fork() failed: $!" unless defined $pid;
- if ($pid) {
- close $child;
- }
- else {
- close $parent;
- open(STDOUT, ">&=" . fileno($child)) or die;
- }
- $pid;
+ my $parent = shift;
+ pipe $parent, my $child or die;
+ my $pid = fork();
+ die "fork() failed: $!" unless defined $pid;
+ if ($pid) {
+ close $child;
+ }
+ else {
+ close $parent;
+ open(STDOUT, ">&=" . fileno($child)) or die;
+ }
+ $pid;
}
if (pipe_from_fork('BAR')) {
- # parent
- while (<BAR>) { print; }
- close BAR;
+ # parent
+ while (<BAR>) { print; }
+ close BAR;
}
else {
- # child
- print "pipe_from_fork\n";
- exit(0);
+ # child
+ print "pipe_from_fork\n";
+ exit(0);
}
Forking pipe open() constructs will be supported in future.
-=item Global state maintained by XSUBs
+=item Global state maintained by XSUBs
External subroutines (XSUBs) that maintain their own global state may
not work correctly. Such XSUBs will either need to maintain locks to
Now you should create a patch file for all your local changes:
- % git format-patch -M origin..
+ % git format-patch -M blead..
0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
Or for a lot of changes, e.g. from a topic branch:
- % git format-patch --stdout -M origin.. > topic-branch-changes.patch
+ % git format-patch --stdout -M blead.. > topic-branch-changes.patch
You should now send an email to
L<perlbug@perl.org|mailto:perlbug@perl.org> with a description of your
L<perl5-porters@perl.org|mailto:perl5-porters@perl.org> directly if the
patch is not ready to be applied, but intended for discussion.
-See the next section for how to configure and use git to send these
-emails for you.
+Please do not use git-send-email(1) to send your patch. See L<Sending
+patch emails|/Sending patch emails> for more information.
If you want to delete your temporary branch, you may do so with:
After you've generated your patch you should sent it
to perlbug@perl.org (as discussed L<in the previous
-section|/"Patch workflow"> with a normal mail client as an
+section|/"Patch workflow">) with a normal mail client as an
attachment, along with a description of the patch.
You B<must not> use git-send-email(1) to send patches generated with
"porters".
A searchable archive of the list is available at
-L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/>. There is
-also another archive at
+L<http://markmail.org/search/?q=perl5-porters>. There is also an archive at
L<http://archive.develooper.com/perl5-porters@perl.org/>.
=head2 perl-changes mailing list
{
PerlIOl * next; /* Lower layer */
PerlIO_funcs * tab; /* Functions for this layer */
- IV flags; /* Various flags for state */
+ U32 flags; /* Various flags for state */
};
A C<PerlIOl *> is a pointer to the struct, and the I<application>
good reason.
Good places to look for pre-existing modules include
-http://search.cpan.org/ and asking on modules@perl.org
+L<http://search.cpan.org/> and L<https://metacpan.org>
+and asking on C<module-authors@perl.org>
+(L<http://lists.perl.org/list/module-authors.html>).
If an existing module B<almost> does what you want, consider writing a
patch, writing a subclass, or otherwise extending the existing module
=item Parameter passing
-Use named parameters. It's easier to use a hash like this:
+Use named parameters. It's easier to use a hash like this:
$obj->do_something(
name => "wibble",
giving pointers to further information (website, author email).
An INSTALL file should be included, and should contain simple installation
-instructions. When using ExtUtils::MakeMaker this will usually be:
+instructions. When using ExtUtils::MakeMaker this will usually be:
=over 4
1.00, 1.10, 1.11, 1.20, 1.30, 1.31, 1.32
A correct CPAN version number is a floating point number with at least
-2 digits after the decimal. You can test whether it conforms to CPAN by
+2 digits after the decimal. You can test whether it conforms to CPAN by
using
perl -MExtUtils::MakeMaker -le 'print MM->parse_version(shift)' 'Foo.pm'
If you want to release a 'beta' or 'alpha' version of a module but
don't want CPAN.pm to list it as most recent use an '_' after the
-regular version number followed by at least 2 digits, eg. 1.20_01. If
+regular version number followed by at least 2 digits, eg. 1.20_01. If
you do this, the following idiom is recommended:
- $VERSION = "1.12_01";
- $XS_VERSION = $VERSION; # only needed if you have XS code
- $VERSION = eval $VERSION;
+ our $VERSION = "1.12_01"; # so CPAN distribution will have
+ # right filename
+ our $XS_VERSION = $VERSION; # only needed if you have XS code
+ $VERSION = eval $VERSION; # so "use Module 0.002" won't warn on
+ # underscore
With that trick MakeMaker will only read the first line and thus read
the underscore, while the perl interpreter will evaluate the $VERSION
-and convert the string into a number. Later operations that treat
+and convert the string into a number. Later operations that treat
$VERSION as a number will then be able to do so without provoking a
warning about $VERSION not being a number.
incrementing the number. Even a one-word documentation patch should
result in a change in version at the sub-minor level.
+Once picked, it is important to stick to your version scheme, without
+reducing the number of digits. This is because "downstream" packagers,
+such as the FreeBSD ports system, interpret the version numbers in
+various ways. If you change the number of digits in your version scheme,
+you can confuse these systems so they get the versions of your module
+out of order, which is obviously bad.
+
=head2 Pre-requisites
Module authors should carefully consider whether to rely on other
pre-requisites in your Makefile.PL or Build.PL.
Be sure to specify Perl version requirements both in Makefile.PL or
-Build.PL and with C<require 5.6.1> or similar. See the section on
+Build.PL and with C<require 5.6.1> or similar. See the section on
C<use VERSION> of L<perlfunc/require> for details.
=head2 Testing
For Module::Build you would use the C<make test> equivalent C<perl Build test>.
The importance of these tests is proportional to the alleged stability of a
-module. A module which purports to be stable or which hopes to achieve wide
+module. A module which purports to be
+stable or which hopes to achieve wide
use should adhere to as strict a testing regime as possible.
Useful modules to help you write tests (with minimum impact on your
more platform independent Module::Build, allowing modules to be installed in a
consistent manner.
When using ExtUtils::MakeMaker, you can use "make dist" to create your
-package. Tools exist to help you to build your module in a MakeMaker-friendly
-style. These include ExtUtils::ModuleMaker and h2xs. See also L<perlnewmod>.
+package. Tools exist to help you to build your module in a
+MakeMaker-friendly style. These include ExtUtils::ModuleMaker and h2xs.
+See also L<perlnewmod>.
=head2 Licensing
packaging up the solution into a module and uploading it to CPAN so that
others can benefit.
+You should also take a look at L<perlmodstyle> for best practices in
+making a module.
+
=head2 Warning
We're going to primarily concentrate on Perl-only modules here, rather
=item *
-We "officially" support the two most recent stable release series. 5.12.x
-and earlier are now out of support. As of the release of 5.18.0, we will
-"officially" end support for Perl 5.14.x, other than providing security
+We "officially" support the two most recent stable release series. 5.14.x
+and earlier are now out of support. As of the release of 5.20.0, we will
+"officially" end support for Perl 5.16.x, other than providing security
updates as described below.
=item *
features, you should contact the perl5-porters mailinglist if you find
an experimental feature useful and want to help shape its future.
+Experimental features must be experimental in two stable releases before being
+marked non-experimental. Experimental features will only have their
+experimental status revoked when they no longer have any design-changing bugs
+open against them and when they have remained unchanged in behavior for the
+entire length of a development cycle. In other words, a feature present in
+v5.20.0 may be marked no longer experimental in v5.22.0 if and only if its
+behavior is unchanged throughout all of v5.21.
+
=item deprecated
If something in the Perl core is marked as B<deprecated>, we may remove it
=item *
-Patches that fix crashing bugs that do not otherwise change Perl's
+Patches that fix crashing bugs, assertion failures and
+memory corruption that do not otherwise change Perl's
functionality or negatively impact performance are acceptable.
=item *
is not acceptable.
Unacceptable behavior will result in a public and clearly identified warning.
-Repeated unacceptable behavior will result in removal from the mailing list.
-The first removal is for one month. Subsequent removals will double in length.
-After six months with no warning, a user's ban length is reset. Removals, like
-warnings, are public.
+Repeated unacceptable behavior will result in removal from the mailing list and
+revocation of rights to update rt.perl.org. The first removal is for one
+month. Subsequent removals will double in length. After six months with no
+warning, a user's ban length is reset. Removals, like warnings, are public.
The list of moderators will be public knowledge. At present, it is:
Aaron Crane, Andy Dougherty, Ricardo Signes, Steffen Müller.
platforms, may not be available in the same location, might accept
different arguments, can behave differently, and often present their
results in a platform-dependent way. Thus, you should seldom depend
-on them to produce consistent results. (Then again, if you're calling
+on them to produce consistent results. (Then again, if you're calling
I<netstat -a>, you probably don't expect it to run on both Unix and CP/M.)
One especially common bit of Perl code is opening a pipe to B<sendmail>:
- open(MAIL, '|/usr/lib/sendmail -t')
+ open(MAIL, '|/usr/lib/sendmail -t')
or die "cannot fork sendmail: $!";
This is fine for systems programming when sendmail is known to be
platforms; two, to provide users with information about whether
a given module works on a given platform.
-Also see:
+Also see:
=over 4
BSD/OS bsdos i386-bsdos
Darwin darwin darwin
DYNIX/ptx dynixptx i386-dynixptx
- FreeBSD freebsd freebsd-i386
+ FreeBSD freebsd freebsd-i386
Haiku haiku BePC-haiku
Linux linux arm-linux
Linux linux armv5tel-linux
OS $^O $Config{archname} ID Version
--------------------------------------------------------
- MS-DOS dos ?
- PC-DOS dos ?
+ MS-DOS dos ?
+ PC-DOS dos ?
OS/2 os2 ?
Windows 3.1 ? ? 0 3 01
Windows 95 MSWin32 MSWin32-x86 1 4 00
Windows 7 MSWin32 MSWin32-x64 2 6 01
Windows 2008 MSWin32 MSWin32-x86 2 6 01
Windows 2008 MSWin32 MSWin32-x64 2 6 01
- Windows CE MSWin32 ? 3
+ Windows CE MSWin32 ? 3
Cygwin cygwin cygwin
The various MSWin32 Perl's can distinguish the OS they are running on
-via the value of the fifth element of the list returned from
+via the value of the fifth element of the list returned from
Win32::GetOSVersion(). For example:
if ($^O eq 'MSWin32') {
=item *
Build instructions for Win32 in L<perlwin32>, or under the Cygnus environment
-in L<perlcygwin>.
+in L<perlcygwin>.
=item *
=item *
-The Cygwin environment for Win32; F<README.cygwin> (installed
+The Cygwin environment for Win32; F<README.cygwin> (installed
as L<perlcygwin>), L<http://www.cygwin.com/>
=item *
see if VMS is in a case sensitive mode.
What C<\n> represents depends on the type of file opened. It usually
-represents C<\012> but it could also be C<\015>, C<\012>, C<\015\012>,
-C<\000>, C<\040>, or nothing depending on the file organization and
-record format. The VMS::Stdio module provides access to the
+represents C<\012> but it could also be C<\015>, C<\012>, C<\015\012>,
+C<\000>, C<\040>, or nothing depending on the file organization and
+record format. The VMS::Stdio module provides access to the
special fopen() requirements of files with unusual attributes on VMS.
TCP/IP stacks are optional on VMS, so socket routines might not be
the BS200 POSIX-BC system (BS2000 is supported in perl 5.6 and greater).
See L<perlos390> for details. Note that for OS/400 there is also a port of
Perl 5.8.1/5.10.0 or later to the PASE which is ASCII-based (as opposed to
-ILE which is EBCDIC-based), see L<perlos400>.
+ILE which is EBCDIC-based), see L<perlos400>.
As of R2.5 of USS for OS/390 and Version 2.3 of VM/ESA these Unix
sub-systems do not support the C<#!> shebang trick for script invocation.
=head2 Acorn RISC OS
Because Acorns use ASCII with newlines (C<\n>) in text files as C<\012> like
-Unix, and because Unix filename emulation is turned on by default,
+Unix, and because Unix filename emulation is turned on by default,
most simple scripts will probably work "out of the box". The native
filesystem is modular, and individual filesystems are free to be
case-sensitive or insensitive, and are usually case-preserving. Some
directory without affecting its parent (and everyone else for that
matter).
-Because native operating system filehandles are global and are currently
+Because native operating system filehandles are global and are currently
allocated down from 255, with 0 being a reserved value, the Unix emulation
library emulates Unix filehandles. Consequently, you can't rely on
passing C<STDIN>, C<STDOUT>, or C<STDERR> to your children.
results for C<atan2()> may vary depending on any combination of the above.
Perl attempts to conform to the Open Group/IEEE standards for the results
returned from C<atan2()>, but cannot force the issue if the system Perl is
-run on does not allow it. (Tru64, HP-UX 10.20)
+run on does not allow it. (Tru64, HP-UX 10.20)
-The current version of the standards for C<atan2()> is available at
+The current version of the standards for C<atan2()> is available at
L<http://www.opengroup.org/onlinepubs/009695399/functions/atan2.html>.
=item binmode
the C library _POSIX_EXIT macro so that it can be decoded by other
programs, particularly ones written in C, like the GNV package. (VMS)
-C<exit()> resets file pointers, which is a problem when called
-from a child process (created by C<fork()>) in C<BEGIN>.
+C<exit()> resets file pointers, which is a problem when called
+from a child process (created by C<fork()>) in C<BEGIN>.
A workaround is to use C<POSIX::_exit>. (Solaris)
exit unless $Config{archname} =~ /\bsolaris\b/;
The return value is POSIX-like (shifted up by 8 bits), which only allows
room for a made-up value derived from the severity bits of the native
-32-bit condition code (unless overridden by C<use vmsish 'status'>).
+32-bit condition code (unless overridden by C<use vmsish 'status'>).
If the native condition code is one that has a POSIX value encoded, the
POSIX value will be decoded to extract the expected exit value.
For more details see L<perlvms/$?>. (VMS)
=back
-=head1 EOL Platforms
+=head1 EOL Platforms
=head2 (Perl 5.20)
=item [6]
-C<\p{SpacePerl}> and C<\p{Space}> match identically starting with Perl
+C<\p{XPerlSpace}> and C<\p{Space}> match identically starting with Perl
v5.18. In earlier versions, these differ only in that in non-locale
-matching, C<\p{SpacePerl}> does not match the vertical tab, C<\cK>.
+matching, C<\p{XPerlSpace}> does not match the vertical tab, C<\cK>.
Same for the two ASCII-only range forms.
=back
--- /dev/null
+
+=encoding utf8
+
+=head1 NAME
+
+perlunicook - cookbookish examples of handling Unicode in Perl
+
+=head1 DESCRIPTION
+
+This manpage contains short recipes demonstrating how to handle common Unicode
+operations in Perl, plus one complete program at the end. Any undeclared
+variables in individual recipes are assumed to have a previous appropriate
+value in them.
+
+=head1 EXAMPLES
+
+=head2 ℞ 0: Standard preamble
+
+Unless otherwise notes, all examples below require this standard preamble
+to work correctly, with the C<#!> adjusted to work on your system:
+
+ #!/usr/bin/env perl
+
+ use utf8; # so literals and identifiers can be in UTF-8
+ use v5.12; # or later to get "unicode_strings" feature
+ use strict; # quote strings, declare variables
+ use warnings; # on by default
+ use warnings qw(FATAL utf8); # fatalize encoding glitches
+ use open qw(:std :utf8); # undeclared streams in UTF-8
+ use charnames qw(:full :short); # unneeded in v5.16
+
+This I<does> make even Unix programmers C<binmode> your binary streams,
+or open them with C<:raw>, but that's the only way to get at them
+portably anyway.
+
+B<WARNING>: C<use autoload> and C<use open> do not get along with each other.
+
+=head2 ℞ 1: Generic Unicode-savvy filter
+
+Always decompose on the way in, then recompose on the way out.
+
+ use Unicode::Normalize;
+
+ while (<>) {
+ $_ = NFD($_); # decompose + reorder canonically
+ ...
+ } continue {
+ print NFC($_); # recompose (where possible) + reorder canonically
+ }
+
+=head2 ℞ 2: Fine-tuning Unicode warnings
+
+As of v5.14, Perl distinguishes three subclasses of UTF‑8 warnings.
+
+ use v5.14; # subwarnings unavailable any earlier
+ no warnings "nonchar"; # the 66 forbidden non-characters
+ no warnings "surrogate"; # UTF-16/CESU-8 nonsense
+ no warnings "non_unicode"; # for codepoints over 0x10_FFFF
+
+=head2 ℞ 3: Declare source in utf8 for identifiers and literals
+
+Without the all-critical C<use utf8> declaration, putting UTF‑8 in your
+literals and identifiers won’t work right. If you used the standard
+preamble just given above, this already happened. If you did, you can
+do things like this:
+
+ use utf8;
+
+ my $measure = "Ångström";
+ my @μsoft = qw( cp852 cp1251 cp1252 );
+ my @ὑπέρμεγας = qw( ὑπέρ μεγας );
+ my @鯉 = qw( koi8-f koi8-u koi8-r );
+ my $motto = "👪 💗 🐪"; # FAMILY, GROWING HEART, DROMEDARY CAMEL
+
+If you forget C<use utf8>, high bytes will be misunderstood as
+separate characters, and nothing will work right.
+
+=head2 ℞ 4: Characters and their numbers
+
+The C<ord> and C<chr> functions work transparently on all codepoints,
+not just on ASCII alone — nor in fact, not even just on Unicode alone.
+
+ # ASCII characters
+ ord("A")
+ chr(65)
+
+ # characters from the Basic Multilingual Plane
+ ord("Σ")
+ chr(0x3A3)
+
+ # beyond the BMP
+ ord("𝑛") # MATHEMATICAL ITALIC SMALL N
+ chr(0x1D45B)
+
+ # beyond Unicode! (up to MAXINT)
+ ord("\x{20_0000}")
+ chr(0x20_0000)
+
+=head2 ℞ 5: Unicode literals by character number
+
+In an interpolated literal, whether a double-quoted string or a
+regex, you may specify a character by its number using the
+C<\x{I<HHHHHH>}> escape.
+
+ String: "\x{3a3}"
+ Regex: /\x{3a3}/
+
+ String: "\x{1d45b}"
+ Regex: /\x{1d45b}/
+
+ # even non-BMP ranges in regex work fine
+ /[\x{1D434}-\x{1D467}]/
+
+=head2 ℞ 6: Get character name by number
+
+ use charnames ();
+ my $name = charnames::viacode(0x03A3);
+
+=head2 ℞ 7: Get character number by name
+
+ use charnames ();
+ my $number = charnames::vianame("GREEK CAPITAL LETTER SIGMA");
+
+=head2 ℞ 8: Unicode named characters
+
+Use the C<< \N{I<charname>} >> notation to get the character
+by that name for use in interpolated literals (double-quoted
+strings and regexes). In v5.16, there is an implicit
+
+ use charnames qw(:full :short);
+
+But prior to v5.16, you must be explicit about which set of charnames you
+want. The C<:full> names are the official Unicode character name, alias, or
+sequence, which all share a namespace.
+
+ use charnames qw(:full :short latin greek);
+
+ "\N{MATHEMATICAL ITALIC SMALL N}" # :full
+ "\N{GREEK CAPITAL LETTER SIGMA}" # :full
+
+Anything else is a Perl-specific convenience abbreviation. Specify one or
+more scripts by names if you want short names that are script-specific.
+
+ "\N{Greek:Sigma}" # :short
+ "\N{ae}" # latin
+ "\N{epsilon}" # greek
+
+The v5.16 release also supports a C<:loose> import for loose matching of
+character names, which works just like loose matching of property names:
+that is, it disregards case, whitespace, and underscores:
+
+ "\N{euro sign}" # :loose (from v5.16)
+
+=head2 ℞ 9: Unicode named sequences
+
+These look just like character names but return multiple codepoints.
+Notice the C<%vx> vector-print functionality in C<printf>.
+
+ use charnames qw(:full);
+ my $seq = "\N{LATIN CAPITAL LETTER A WITH MACRON AND GRAVE}";
+ printf "U+%v04X\n", $seq;
+ U+0100.0300
+
+=head2 ℞ 10: Custom named characters
+
+Use C<:alias> to give your own lexically scoped nicknames to existing
+characters, or even to give unnamed private-use characters useful names.
+
+ use charnames ":full", ":alias" => {
+ ecute => "LATIN SMALL LETTER E WITH ACUTE",
+ "APPLE LOGO" => 0xF8FF, # private use character
+ };
+
+ "\N{ecute}"
+ "\N{APPLE LOGO}"
+
+=head2 ℞ 11: Names of CJK codepoints
+
+Sinograms like “東京” come back with character names of
+C<CJK UNIFIED IDEOGRAPH-6771> and C<CJK UNIFIED IDEOGRAPH-4EAC>,
+because their “names” vary. The CPAN C<Unicode::Unihan> module
+has a large database for decoding these (and a whole lot more), provided you
+know how to understand its output.
+
+ # cpan -i Unicode::Unihan
+ use Unicode::Unihan;
+ my $str = "東京";
+ my $unhan = new Unicode::Unihan;
+ for my $lang (qw(Mandarin Cantonese Korean JapaneseOn JapaneseKun)) {
+ printf "CJK $str in %-12s is ", $lang;
+ say $unhan->$lang($str);
+ }
+
+prints:
+
+ CJK 東京 in Mandarin is DONG1JING1
+ CJK 東京 in Cantonese is dung1ging1
+ CJK 東京 in Korean is TONGKYENG
+ CJK 東京 in JapaneseOn is TOUKYOU KEI KIN
+ CJK 東京 in JapaneseKun is HIGASHI AZUMAMIYAKO
+
+If you have a specific romanization scheme in mind,
+use the specific module:
+
+ # cpan -i Lingua::JA::Romanize::Japanese
+ use Lingua::JA::Romanize::Japanese;
+ my $k2r = new Lingua::JA::Romanize::Japanese;
+ my $str = "東京";
+ say "Japanese for $str is ", $k2r->chars($str);
+
+prints
+
+ Japanese for 東京 is toukyou
+
+=head2 ℞ 12: Explicit encode/decode
+
+On rare occasion, such as a database read, you may be
+given encoded text you need to decode.
+
+ use Encode qw(encode decode);
+
+ my $chars = decode("shiftjis", $bytes, 1);
+ # OR
+ my $bytes = encode("MIME-Header-ISO_2022_JP", $chars, 1);
+
+For streams all in the same encoding, don't use encode/decode; instead
+set the file encoding when you open the file or immediately after with
+C<binmode> as described later below.
+
+=head2 ℞ 13: Decode program arguments as utf8
+
+ $ perl -CA ...
+ or
+ $ export PERL_UNICODE=A
+ or
+ use Encode qw(decode_utf8);
+ @ARGV = map { decode_utf8($_, 1) } @ARGV;
+
+=head2 ℞ 14: Decode program arguments as locale encoding
+
+ # cpan -i Encode::Locale
+ use Encode qw(locale);
+ use Encode::Locale;
+
+ # use "locale" as an arg to encode/decode
+ @ARGV = map { decode(locale => $_, 1) } @ARGV;
+
+=head2 ℞ 15: Declare STD{IN,OUT,ERR} to be utf8
+
+Use a command-line option, an environment variable, or else
+call C<binmode> explicitly:
+
+ $ perl -CS ...
+ or
+ $ export PERL_UNICODE=S
+ or
+ use open qw(:std :utf8);
+ or
+ binmode(STDIN, ":utf8");
+ binmode(STDOUT, ":utf8");
+ binmode(STDERR, ":utf8");
+
+=head2 ℞ 16: Declare STD{IN,OUT,ERR} to be in locale encoding
+
+ # cpan -i Encode::Locale
+ use Encode;
+ use Encode::Locale;
+
+ # or as a stream for binmode or open
+ binmode STDIN, ":encoding(console_in)" if -t STDIN;
+ binmode STDOUT, ":encoding(console_out)" if -t STDOUT;
+ binmode STDERR, ":encoding(console_out)" if -t STDERR;
+
+=head2 ℞ 17: Make file I/O default to utf8
+
+Files opened without an encoding argument will be in UTF-8:
+
+ $ perl -CD ...
+ or
+ $ export PERL_UNICODE=D
+ or
+ use open qw(:utf8);
+
+=head2 ℞ 18: Make all I/O and args default to utf8
+
+ $ perl -CSDA ...
+ or
+ $ export PERL_UNICODE=SDA
+ or
+ use open qw(:std :utf8);
+ use Encode qw(decode_utf8);
+ @ARGV = map { decode_utf8($_, 1) } @ARGV;
+
+=head2 ℞ 19: Open file with specific encoding
+
+Specify stream encoding. This is the normal way
+to deal with encoded text, not by calling low-level
+functions.
+
+ # input file
+ open(my $in_file, "< :encoding(UTF-16)", "wintext");
+ OR
+ open(my $in_file, "<", "wintext");
+ binmode($in_file, ":encoding(UTF-16)");
+ THEN
+ my $line = <$in_file>;
+
+ # output file
+ open($out_file, "> :encoding(cp1252)", "wintext");
+ OR
+ open(my $out_file, ">", "wintext");
+ binmode($out_file, ":encoding(cp1252)");
+ THEN
+ print $out_file "some text\n";
+
+More layers than just the encoding can be specified here. For example,
+the incantation C<":raw :encoding(UTF-16LE) :crlf"> includes implicit
+CRLF handling.
+
+=head2 ℞ 20: Unicode casing
+
+Unicode casing is very different from ASCII casing.
+
+ uc("henry ⅷ") # "HENRY Ⅷ"
+ uc("tschüß") # "TSCHÜSS" notice ß => SS
+
+ # both are true:
+ "tschüß" =~ /TSCHÜSS/i # notice ß => SS
+ "Σίσυφος" =~ /ΣΊΣΥΦΟΣ/i # notice Σ,σ,ς sameness
+
+=head2 ℞ 21: Unicode case-insensitive comparisons
+
+Also available in the CPAN L<Unicode::CaseFold> module,
+the new C<fc> “foldcase” function from v5.16 grants
+access to the same Unicode casefolding as the C</i>
+pattern modifier has always used:
+
+ use feature "fc"; # fc() function is from v5.16
+
+ # sort case-insensitively
+ my @sorted = sort { fc($a) cmp fc($b) } @list;
+
+ # both are true:
+ fc("tschüß") eq fc("TSCHÜSS")
+ fc("Σίσυφος") eq fc("ΣΊΣΥΦΟΣ")
+
+=head2 ℞ 22: Match Unicode linebreak sequence in regex
+
+A Unicode linebreak matches the two-character CRLF
+grapheme or any of seven vertical whitespace characters.
+Good for dealing with textfiles coming from different
+operating systems.
+
+ \R
+
+ s/\R/\n/g; # normalize all linebreaks to \n
+
+=head2 ℞ 23: Get character category
+
+Find the general category of a numeric codepoint.
+
+ use Unicode::UCD qw(charinfo);
+ my $cat = charinfo(0x3A3)->{category}; # "Lu"
+
+=head2 ℞ 24: Disabling Unicode-awareness in builtin charclasses
+
+Disable C<\w>, C<\b>, C<\s>, C<\d>, and the POSIX
+classes from working correctly on Unicode either in this
+scope, or in just one regex.
+
+ use v5.14;
+ use re "/a";
+
+ # OR
+
+ my($num) = $str =~ /(\d+)/a;
+
+Or use specific un-Unicode properties, like C<\p{ahex}>
+and C<\p{POSIX_Digit>}. Properties still work normally
+no matter what charset modifiers (C</d /u /l /a /aa>)
+should be effect.
+
+=head2 ℞ 25: Match Unicode properties in regex with \p, \P
+
+These all match a single codepoint with the given
+property. Use C<\P> in place of C<\p> to match
+one codepoint lacking that property.
+
+ \pL, \pN, \pS, \pP, \pM, \pZ, \pC
+ \p{Sk}, \p{Ps}, \p{Lt}
+ \p{alpha}, \p{upper}, \p{lower}
+ \p{Latin}, \p{Greek}
+ \p{script=Latin}, \p{script=Greek}
+ \p{East_Asian_Width=Wide}, \p{EA=W}
+ \p{Line_Break=Hyphen}, \p{LB=HY}
+ \p{Numeric_Value=4}, \p{NV=4}
+
+=head2 ℞ 26: Custom character properties
+
+Define at compile-time your own custom character
+properties for use in regexes.
+
+ # using private-use characters
+ sub In_Tengwar { "E000\tE07F\n" }
+
+ if (/\p{In_Tengwar}/) { ... }
+
+ # blending existing properties
+ sub Is_GraecoRoman_Title {<<'END_OF_SET'}
+ +utf8::IsLatin
+ +utf8::IsGreek
+ &utf8::IsTitle
+ END_OF_SET
+
+ if (/\p{Is_GraecoRoman_Title}/ { ... }
+
+=head2 ℞ 27: Unicode normalization
+
+Typically render into NFD on input and NFC on output. Using NFKC or NFKD
+functions improves recall on searches, assuming you've already done to the
+same text to be searched. Note that this is about much more than just pre-
+combined compatibility glyphs; it also reorders marks according to their
+canonical combining classes and weeds out singletons.
+
+ use Unicode::Normalize;
+ my $nfd = NFD($orig);
+ my $nfc = NFC($orig);
+ my $nfkd = NFKD($orig);
+ my $nfkc = NFKC($orig);
+
+=head2 ℞ 28: Convert non-ASCII Unicode numerics
+
+Unless you’ve used C</a> or C</aa>, C<\d> matches more than
+ASCII digits only, but Perl’s implicit string-to-number
+conversion does not current recognize these. Here’s how to
+convert such strings manually.
+
+ use v5.14; # needed for num() function
+ use Unicode::UCD qw(num);
+ my $str = "got Ⅻ and ४५६७ and ⅞ and here";
+ my @nums = ();
+ while (/$str =~ (\d+|\N)/g) { # not just ASCII!
+ push @nums, num($1);
+ }
+ say "@nums"; # 12 4567 0.875
+
+ use charnames qw(:full);
+ my $nv = num("\N{RUMI DIGIT ONE}\N{RUMI DIGIT TWO}");
+
+=head2 ℞ 29: Match Unicode grapheme cluster in regex
+
+Programmer-visible “characters” are codepoints matched by C</./s>,
+but user-visible “characters” are graphemes matched by C</\X/>.
+
+ # Find vowel *plus* any combining diacritics,underlining,etc.
+ my $nfd = NFD($orig);
+ $nfd =~ / (?=[aeiou]) \X /xi
+
+=head2 ℞ 30: Extract by grapheme instead of by codepoint (regex)
+
+ # match and grab five first graphemes
+ my($first_five) = $str =~ /^ ( \X{5} ) /x;
+
+=head2 ℞ 31: Extract by grapheme instead of by codepoint (substr)
+
+ # cpan -i Unicode::GCString
+ use Unicode::GCString;
+ my $gcs = Unicode::GCString->new($str);
+ my $first_five = $gcs->substr(0, 5);
+
+=head2 ℞ 32: Reverse string by grapheme
+
+Reversing by codepoint messes up diacritics, mistakenly converting
+C<crème brûlée> into C<éel̂urb em̀erc> instead of into C<eélûrb emèrc>;
+so reverse by grapheme instead. Both these approaches work
+right no matter what normalization the string is in:
+
+ $str = join("", reverse $str =~ /\X/g);
+
+ # OR: cpan -i Unicode::GCString
+ use Unicode::GCString;
+ $str = reverse Unicode::GCString->new($str);
+
+=head2 ℞ 33: String length in graphemes
+
+The string C<brûlée> has six graphemes but up to eight codepoints.
+This counts by grapheme, not by codepoint:
+
+ my $str = "brûlée";
+ my $count = 0;
+ while ($str =~ /\X/g) { $count++ }
+
+ # OR: cpan -i Unicode::GCString
+ use Unicode::GCString;
+ my $gcs = Unicode::GCString->new($str);
+ my $count = $gcs->length;
+
+=head2 ℞ 34: Unicode column-width for printing
+
+Perl’s C<printf>, C<sprintf>, and C<format> think all
+codepoints take up 1 print column, but many take 0 or 2.
+Here to show that normalization makes no difference,
+we print out both forms:
+
+ use Unicode::GCString;
+ use Unicode::Normalize;
+
+ my @words = qw/crème brûlée/;
+ @words = map { NFC($_), NFD($_) } @words;
+
+ for my $str (@words) {
+ my $gcs = Unicode::GCString->new($str);
+ my $cols = $gcs->columns;
+ my $pad = " " x (10 - $cols);
+ say str, $pad, " |";
+ }
+
+generates this to show that it pads correctly no matter
+the normalization:
+
+ crème |
+ crème |
+ brûlée |
+ brûlée |
+
+=head2 ℞ 35: Unicode collation
+
+Text sorted by numeric codepoint follows no reasonable alphabetic order;
+use the UCA for sorting text.
+
+ use Unicode::Collate;
+ my $col = Unicode::Collate->new();
+ my @list = $col->sort(@old_list);
+
+See the I<ucsort> program from the L<Unicode::Tussle> CPAN module
+for a convenient command-line interface to this module.
+
+=head2 ℞ 36: Case- I<and> accent-insensitive Unicode sort
+
+Specify a collation strength of level 1 to ignore case and
+diacritics, only looking at the basic character.
+
+ use Unicode::Collate;
+ my $col = Unicode::Collate->new(level => 1);
+ my @list = $col->sort(@old_list);
+
+=head2 ℞ 37: Unicode locale collation
+
+Some locales have special sorting rules.
+
+ # either use v5.12, OR: cpan -i Unicode::Collate::Locale
+ use Unicode::Collate::Locale;
+ my $col = Unicode::Collate::Locale->new(locale => "de__phonebook");
+ my @list = $col->sort(@old_list);
+
+The I<ucsort> program mentioned above accepts a C<--locale> parameter.
+
+=head2 ℞ 38: Making C<cmp> work on text instead of codepoints
+
+Instead of this:
+
+ @srecs = sort {
+ $b->{AGE} <=> $a->{AGE}
+ ||
+ $a->{NAME} cmp $b->{NAME}
+ } @recs;
+
+Use this:
+
+ my $coll = Unicode::Collate->new();
+ for my $rec (@recs) {
+ $rec->{NAME_key} = $coll->getSortKey( $rec->{NAME} );
+ }
+ @srecs = sort {
+ $b->{AGE} <=> $a->{AGE}
+ ||
+ $a->{NAME_key} cmp $b->{NAME_key}
+ } @recs;
+
+=head2 ℞ 39: Case- I<and> accent-insensitive comparisons
+
+Use a collator object to compare Unicode text by character
+instead of by codepoint.
+
+ use Unicode::Collate;
+ my $es = Unicode::Collate->new(
+ level => 1,
+ normalization => undef
+ );
+
+ # now both are true:
+ $es->eq("García", "GARCIA" );
+ $es->eq("Márquez", "MARQUEZ");
+
+=head2 ℞ 40: Case- I<and> accent-insensitive locale comparisons
+
+Same, but in a specific locale.
+
+ my $de = Unicode::Collate::Locale->new(
+ locale => "de__phonebook",
+ );
+
+ # now this is true:
+ $de->eq("tschüß", "TSCHUESS"); # notice ü => UE, ß => SS
+
+=head2 ℞ 41: Unicode linebreaking
+
+Break up text into lines according to Unicode rules.
+
+ # cpan -i Unicode::LineBreak
+ use Unicode::LineBreak;
+ use charnames qw(:full);
+
+ my $para = "This is a super\N{HYPHEN}long string. " x 20;
+ my $fmt = new Unicode::LineBreak;
+ print $fmt->break($para), "\n";
+
+=head2 ℞ 42: Unicode text in DBM hashes, the tedious way
+
+Using a regular Perl string as a key or value for a DBM
+hash will trigger a wide character exception if any codepoints
+won’t fit into a byte. Here’s how to manually manage the translation:
+
+ use DB_File;
+ use Encode qw(encode decode);
+ tie %dbhash, "DB_File", "pathname";
+
+ # STORE
+
+ # assume $uni_key and $uni_value are abstract Unicode strings
+ my $enc_key = encode("UTF-8", $uni_key, 1);
+ my $enc_value = encode("UTF-8", $uni_value, 1);
+ $dbhash{$enc_key} = $enc_value;
+
+ # FETCH
+
+ # assume $uni_key holds a normal Perl string (abstract Unicode)
+ my $enc_key = encode("UTF-8", $uni_key, 1);
+ my $enc_value = $dbhash{$enc_key};
+ my $uni_value = decode("UTF-8", $enc_key, 1);
+
+=head2 ℞ 43: Unicode text in DBM hashes, the easy way
+
+Here’s how to implicitly manage the translation; all encoding
+and decoding is done automatically, just as with streams that
+have a particular encoding attached to them:
+
+ use DB_File;
+ use DBM_Filter;
+
+ my $dbobj = tie %dbhash, "DB_File", "pathname";
+ $dbobj->Filter_Value("utf8"); # this is the magic bit
+
+ # STORE
+
+ # assume $uni_key and $uni_value are abstract Unicode strings
+ $dbhash{$uni_key} = $uni_value;
+
+ # FETCH
+
+ # $uni_key holds a normal Perl string (abstract Unicode)
+ my $uni_value = $dbhash{$uni_key};
+
+=head2 ℞ 44: PROGRAM: Demo of Unicode collation and printing
+
+Here’s a full program showing how to make use of locale-sensitive
+sorting, Unicode casing, and managing print widths when some of the
+characters take up zero or two columns, not just one column each time.
+When run, the following program produces this nicely aligned output:
+
+ Crème Brûlée....... €2.00
+ Éclair............. €1.60
+ Fideuà............. €4.20
+ Hamburger.......... €6.00
+ Jamón Serrano...... €4.45
+ Linguiça........... €7.00
+ Pâté............... €4.15
+ Pears.............. €2.00
+ Pêches............. €2.25
+ Smørbrød........... €5.75
+ Spätzle............ €5.50
+ Xoriço............. €3.00
+ Γύρος.............. €6.50
+ 막걸리............. €4.00
+ おもち............. €2.65
+ お好み焼き......... €8.00
+ シュークリーム..... €1.85
+ 寿司............... €9.99
+ 包子............... €7.50
+
+Here's that program; tested on v5.14.
+
+ #!/usr/bin/env perl
+ # umenu - demo sorting and printing of Unicode food
+ #
+ # (obligatory and increasingly long preamble)
+ #
+ use utf8;
+ use v5.14; # for locale sorting
+ use strict;
+ use warnings;
+ use warnings qw(FATAL utf8); # fatalize encoding faults
+ use open qw(:std :utf8); # undeclared streams in UTF-8
+ use charnames qw(:full :short); # unneeded in v5.16
+
+ # std modules
+ use Unicode::Normalize; # std perl distro as of v5.8
+ use List::Util qw(max); # std perl distro as of v5.10
+ use Unicode::Collate::Locale; # std perl distro as of v5.14
+
+ # cpan modules
+ use Unicode::GCString; # from CPAN
+
+ # forward defs
+ sub pad($$$);
+ sub colwidth(_);
+ sub entitle(_);
+
+ my %price = (
+ "γύρος" => 6.50, # gyros
+ "pears" => 2.00, # like um, pears
+ "linguiça" => 7.00, # spicy sausage, Portuguese
+ "xoriço" => 3.00, # chorizo sausage, Catalan
+ "hamburger" => 6.00, # burgermeister meisterburger
+ "éclair" => 1.60, # dessert, French
+ "smørbrød" => 5.75, # sandwiches, Norwegian
+ "spätzle" => 5.50, # Bayerisch noodles, little sparrows
+ "包子" => 7.50, # bao1 zi5, steamed pork buns, Mandarin
+ "jamón serrano" => 4.45, # country ham, Spanish
+ "pêches" => 2.25, # peaches, French
+ "シュークリーム" => 1.85, # cream-filled pastry like eclair
+ "막걸리" => 4.00, # makgeolli, Korean rice wine
+ "寿司" => 9.99, # sushi, Japanese
+ "おもち" => 2.65, # omochi, rice cakes, Japanese
+ "crème brûlée" => 2.00, # crema catalana
+ "fideuà" => 4.20, # more noodles, Valencian
+ # (Catalan=fideuada)
+ "pâté" => 4.15, # gooseliver paste, French
+ "お好み焼き" => 8.00, # okonomiyaki, Japanese
+ );
+
+ my $width = 5 + max map { colwidth } keys %price;
+
+ # So the Asian stuff comes out in an order that someone
+ # who reads those scripts won't freak out over; the
+ # CJK stuff will be in JIS X 0208 order that way.
+ my $coll = new Unicode::Collate::Locale locale => "ja";
+
+ for my $item ($coll->sort(keys %price)) {
+ print pad(entitle($item), $width, ".");
+ printf " €%.2f\n", $price{$item};
+ }
+
+ sub pad($$$) {
+ my($str, $width, $padchar) = @_;
+ return $str . ($padchar x ($width - colwidth($str)));
+ }
+
+ sub colwidth(_) {
+ my($str) = @_;
+ return Unicode::GCString->new($str)->columns;
+ }
+
+ sub entitle(_) {
+ my($str) = @_;
+ $str =~ s{ (?=\pL)(\S) (\S*) }
+ { ucfirst($1) . lc($2) }xge;
+ return $str;
+ }
+
+=head1 SEE ALSO
+
+See these manpages, some of which are CPAN modules:
+L<perlunicode>, L<perluniprops>,
+L<perlre>, L<perlrecharclass>,
+L<perluniintro>, L<perlunitut>, L<perlunifaq>,
+L<PerlIO>, L<DB_File>, L<DBM_Filter>, L<DBM_Filter::utf8>,
+L<Encode>, L<Encode::Locale>,
+L<Unicode::UCD>,
+L<Unicode::Normalize>,
+L<Unicode::GCString>, L<Unicode::LineBreak>,
+L<Unicode::Collate>, L<Unicode::Collate::Locale>,
+L<Unicode::Unihan>,
+L<Unicode::CaseFold>,
+L<Unicode::Tussle>,
+L<Lingua::JA::Romanize::Japanese>,
+L<Lingua::ZH::Romanize::Pinyin>,
+L<Lingua::KO::Romanize::Hangul>.
+
+The L<Unicode::Tussle> CPAN module includes many programs
+to help with working with Unicode, including
+these programs to fully or partly replace standard utilities:
+I<tcgrep> instead of I<egrep>,
+I<uniquote> instead of I<cat -v> or I<hexdump>,
+I<uniwc> instead of I<wc>,
+I<unilook> instead of I<look>,
+I<unifmt> instead of I<fmt>,
+and
+I<ucsort> instead of I<sort>.
+For exploring Unicode character names and character properties,
+see its I<uniprops>, I<unichars>, and I<uninames> programs.
+It also supplies these programs, all of which are general filters that do Unicode-y things:
+I<unititle> and I<unicaps>;
+I<uniwide> and I<uninarrow>;
+I<unisupers> and I<unisubs>;
+I<nfd>, I<nfc>, I<nfkd>, and I<nfkc>;
+and I<uc>, I<lc>, and I<tc>.
+
+Finally, see the published Unicode Standard (page numbers are from version
+6.0.0), including these specific annexes and technical reports:
+
+=over
+
+=item §3.13 Default Case Algorithms, page 113;
+§4.2 Case, pages 120–122;
+Case Mappings, page 166–172, especially Caseless Matching starting on page 170.
+
+=item UAX #44: Unicode Character Database
+
+=item UTS #18: Unicode Regular Expressions
+
+=item UAX #15: Unicode Normalization Forms
+
+=item UTS #10: Unicode Collation Algorithm
+
+=item UAX #29: Unicode Text Segmentation
+
+=item UAX #14: Unicode Line Breaking Algorithm
+
+=item UAX #11: East Asian Width
+
+=back
+
+=head1 AUTHOR
+
+Tom Christiansen E<lt>tchrist@perl.comE<gt> wrote this, with occasional
+kibbitzing from Larry Wall and Jeffrey Friedl in the background.
+
+=head1 COPYRIGHT AND LICENCE
+
+Copyright © 2012 Tom Christiansen.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Most of these examples taken from the current edition of the “Camel Book”;
+that is, from the 4ᵗʰ Edition of I<Programming Perl>, Copyright © 2012 Tom
+Christiansen <et al.>, 2012-02-13 by O’Reilly Media. The code itself is
+freely redistributable, and you are encouraged to transplant, fold,
+spindle, and mutilate any of the examples in this manpage however you please
+for inclusion into your own programs without any encumbrance whatsoever.
+Acknowledgement via code comment is polite but not required.
+
+=head1 REVISION HISTORY
+
+v1.0.0 – first public release, 2012-02-27
+
displayed as C<\x..>, and the rest of the characters as themselves:
sub nice_string {
- join("",
- map { $_ > 255 ? # if wide character...
- sprintf("\\x{%04X}", $_) : # \x{...}
- chr($_) =~ /[[:cntrl:]]/ ? # else if control character...
- sprintf("\\x%02X", $_) : # \x..
- quotemeta(chr($_)) # else quoted or as themselves
- } unpack("W*", $_[0])); # unpack Unicode characters
+ join("",
+ map { $_ > 255 # if wide character...
+ ? sprintf("\\x{%04X}", $_) # \x{...}
+ : chr($_) =~ /[[:cntrl:]]/ # else if control character...
+ ? sprintf("\\x%02X", $_) # \x..
+ : quotemeta(chr($_)) # else quoted or as themselves
+ } unpack("W*", $_[0])); # unpack Unicode characters
}
For example,
__END__
package feature;
-our $VERSION = '1.36';
+our $VERSION = '1.36_01';
FEATURES
This feature is available from Perl 5.18 onwards.
+=head2 The 'postderef' and 'postderef_qq' features
+
+B<WARNING>: This feature is still experimental and the implementation may
+change in future versions of Perl. For this reason, Perl will
+warn when you use the feature, unless you have explicitly disabled the
+warning:
+
+ no warnings "experimental::postderef";
+
+The 'postderef' feature allows the use of L<postfix dereference
+syntax|perlref/Postfix Dereference Syntax>. For example, it will make the
+following two statements equivalent:
+
+ my @x = @{ $h->{a} };
+ my @x = $h->{a}->@*;
+
+The 'postderef_qq' feature extends this, for array and scalar dereference, to
+working inside of double-quotish interpolations.
+
+This feature is available from Perl 5.20 onwards.
+
=head2 The 'signatures' feature
B<WARNING>: This feature is still experimental and the implementation may
# ng: 'Missing $ on loop variable'
like $@, "^No such class a1b at ", 'TYPE of my of for statement';
+# Used to crash [perl #123542]
+eval 's /${<>{}) //';
+
# Add new tests HERE (above this line)
# bug #74022: Loop on characters in \p{OtherIDContinue}
ok(!$st, 'read/die: read status');
ok(close($in), 'read/die: close status');
+# This used to be 1_000_000, but on Linux/ppc64 (POWER7) this kept
+# consistently failing. At exactly 0x100000 it started passing
+# again. We're hoping this number is bigger than any pipe buffer.
+my $surely_this_arbitrary_number_is_fine = 0x100000;
+
# close during print
fresh_io;
$SIG{ALRM} = sub { $sigst = close($out) ? "ok" : "nok" };
-$buf = "a" x 1_000_000 . "\n"; # bigger than any pipe buffer hopefully
+$buf = "a" x $surely_this_arbitrary_number_is_fine . "\n";
select $out; $| = 1; select STDOUT;
alarm(1);
$st = print $out $buf;
fresh_io;
$SIG{ALRM} = sub { die };
-$buf = "a" x 1_000_000 . "\n"; # bigger than any pipe buffer hopefully
+$buf = "a" x $surely_this_arbitrary_number_is_fine . "\n";
select $out; $| = 1; select STDOUT;
alarm(1);
$st = eval { print $out $buf };
Non-string passed as bitmask [pp_sselect]
+ %s too large [pp_gmtime]
+
+ %s failed [pp_gmtime]
+
__END__
# pp_sys.c [pp_untie]
use warnings 'untie' ;
seekdir() attempted on invalid dirhandle $foo at - line 21.
rewinddir() attempted on invalid dirhandle $foo at - line 22.
closedir() attempted on invalid dirhandle $foo at - line 23.
+########
+# pp_sys.c [pp_gmtime]
+BEGIN {
+ print <<EOM;
+SKIPPED
+# NaN values not produced consistently in 5.20.x
+EOM
+ exit;
+}
+gmtime("NaN");
+localtime("NaN");
+use warnings "overflow";
+gmtime("NaN");
+localtime("NaN");
+
+EXPECT
+gmtime(NaN) too large at - line 6.
+gmtime(NaN) failed at - line 6.
+localtime(NaN) too large at - line 7.
+localtime(NaN) failed at - line 7.
*bar::is = *is;
*bar::like = *like;
}
-plan 120;
+plan 126;
# -------------------- Errors with feature disabled -------------------- #
),
qr/syntax error/,
'referencing a state sub after a syntax error does not crash';
+{
+ state $stuff;
+ package A {
+ state sub foo{ $stuff .= our $AUTOLOAD }
+ *A::AUTOLOAD = \&foo;
+ }
+ A::bar();
+ is $stuff, 'A::bar', 'state sub assigned to *AUTOLOAD can autoload';
+}
+{
+ state sub quire{qr "quires"}
+ package o { use overload qr => \&quire }
+ ok "quires" =~ bless([], o::), 'state sub used as overload method';
+}
+{
+ local $ENV{PERL5DB} = 'sub DB::DB{}';
+ is(
+ runperl(
+ switches => [ '-d' ],
+ progs => [ split "\n",
+ 'use feature qw - lexical_subs state -;
+ no warnings q-experimental::lexical_subs-;
+ sub DB::sub{ print qq|4\n|; goto $DB::sub }
+ state sub foo {print qq|2\n|}
+ foo();
+ '
+ ],
+ stderr => 1
+ ),
+ "4\n2\n",
+ 'state subs and DB::sub under -d'
+ );
+}
# -------------------- my -------------------- #
),
qr/syntax error/,
'referencing a my sub after a syntax error does not crash';
+{
+ state $stuff;
+ package A {
+ my sub foo{ $stuff .= our $AUTOLOAD }
+ *A::AUTOLOAD = \&foo;
+ }
+ A::bar();
+ is $stuff, 'A::bar', 'my sub assigned to *AUTOLOAD can autoload';
+}
+{
+ my sub quire{qr "quires"}
+ package mo { use overload qr => \&quire }
+ ok "quires" =~ bless([], mo::), 'my sub used as overload method';
+}
+
+{
+ local $ENV{PERL5DB} = 'sub DB::DB{}';
+ is(
+ runperl(
+ switches => [ '-d' ],
+ progs => [ split "\n",
+ 'use feature qw - lexical_subs state -;
+ no warnings q-experimental::lexical_subs-;
+ sub DB::sub{ print qq|4\n|; goto $DB::sub }
+ my sub foo {print qq|2\n|}
+ foo();
+ '
+ ],
+ stderr => 1
+ ),
+ "4\n2\n",
+ 'my subs and DB::sub under -d'
+ );
+}
# -------------------- Interactions (and misc tests) -------------------- #
use strict;
-plan tests => 136;
+plan tests => 137;
# Before loading feature.pm, test it with CORE::
ok eval 'CORE::state $x = 1;', 'CORE::state outside of feature.pm scope';
thing2(6);
}
+# [perl #123029] regression in "state" under PERL_NO_COW
+sub rt_123029 {
+ state $s;
+ $s = 'foo'x500;
+ my $c = $s;
+ return defined $s;
+}
+ok(rt_123029(), "state variables don't surprisingly disappear when accessed");
__DATA__
state ($a) = 1;
use Config;
-plan tests => 127;
+plan tests => 128;
# run some code N times. If the number of SVs at the end of loop N is
# greater than (N-1)*delta at the end of loop 1, we've got a leak
eleak(2,0,'/[[:ascii:]]/');
eleak(2,0,'/[[.zog.]]/');
eleak(2,0,'/[.zog.]/');
+eleak(2,0,'/|\W/', '/|\W/ [perl #123198]');
eleak(2,0,'no warnings; /(?[])/');
eleak(2,0,'no warnings; /(?[[a]+[b]])/');
eleak(2,0,'no warnings; /(?[[a]-[b]])/');
use strict;
-plan 5;
+plan 9;
-my $err = "Unimplemented at $0 line " . ( __LINE__ + 2 ) . ".\n";
+my $err;
+my $err1 = "Unimplemented at $0 line ";
+my $err2 = ".\n";
+$err = $err1 . ( __LINE__ + 1 ) . $err2;
eval { ... };
+is $@, $err, "Execution of ellipsis statement reported 'Unimplemented' code";
+$@ = '';
-is $@, $err;
+note("RT #122661: Semicolon before ellipsis statement disambiguates to indicate block rather than hash reference");
+my @input = (3..5);
+my @transformed;
+$err = $err1 . ( __LINE__ + 1 ) . $err2;
+eval { @transformed = map {; ... } @input; };
+is $@, $err, "Disambiguation case 1";
+$@ = '';
+$err = $err1 . ( __LINE__ + 1 ) . $err2;
+eval { @transformed = map {;...} @input; };
+is $@, $err, "Disambiguation case 2";
+$@ = '';
+
+$err = $err1 . ( __LINE__ + 1 ) . $err2;
+eval { @transformed = map {; ...} @input; };
+is $@, $err, "Disambiguation case 3";
+$@ = '';
+
+$err = $err1 . ( __LINE__ + 1 ) . $err2;
+eval { @transformed = map {;... } @input; };
+is $@, $err, "Disambiguation case 4";
+$@ = '';
#
# Regression tests, making sure ... is still parsable as an operator.
require 't/test.pl';
-plan(tests => 5);
+plan(tests => 6);
use_ok('Module::CoreList');
use_ok('Module::CoreList::Utils');
+use_ok('Module::CoreList::TieHashDelta');
{
no warnings 'once';
Can't get short module name from a handle
Can't load DLL `%s', possible problematic module `%s'
Can't locate %s: %s
-Can't locate object method "%s" via package "%s" (perhaps you forgot to load "%s"?)
Can't pipe "%s": %s
Can't set type on DOS
Can't spawn: %s
kill(3)
langinfo(3)
LaTeX::Encode
+Lingua::JA::Romanize::Japanese
Lingua::KO::Hangul::Util
+Lingua::KO::Romanize::Hangul
+Lingua::ZH::Romanize::Pinyin
List::Gather
local::lib
Log::Message
Tk
Tk::Pod
tty(1)
+Unicode::CaseFold
Unicode::Casing
+Unicode::GCString
Unicode::LineBreak
Unicode::Regex::Set
Unicode::Semantics
+Unicode::Tussle
Unicode::Unihan
unzip(1)
Version::Requirements
print "1..0 # Not all files are available during cross-compilation\n";
exit 0;
}
+ if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit 0;
+ }
require '../regen/regen_lib.pl';
}
if ( $^O eq "VMS" ) {
skip_all( "- regen.pl needs porting." );
}
+if ($^O eq 'dec_osf') {
+ skip_all("$^O cannot handle this test");
+}
use Config;
if ( $Config{usecrosscompile} ) {
skip_all( "Not all files are available during cross-compilation" );
require './test.pl';
require Config; import Config;
skip_all_if_miniperl("no dynamic loading on miniperl, no Encode nor POSIX");
+ if ($^O eq 'dec_osf') {
+ skip_all("$^O cannot handle this test");
+ }
require './loc_tools.pl';
}
chdir 't' if -d 't';
@INC = ('../lib','.');
require './test.pl';
+ if ($^O eq 'dec_osf') {
+ skip_all("$^O cannot handle this test");
+ }
}
skip_all('$PERL_SKIP_PSYCHO_TEST set') if $ENV{PERL_SKIP_PSYCHO_TEST};
+
plan tests => 15; # Update this when adding/deleting tests.
run_tests() unless caller;
[bcd].{2,3}aaaa Xb\x{100}aaaaa y - -
'\Awibble\z'm wibble y - -
/(alias|status)es$/i Statuses y $1 Status # [perl #121778]
+(.)(?{$~=$^N}) \x{100} y $~ \x{100} # [perl #123135]
# Keep these lines at the end of the file
# vim: softtabstop=0 noexpandtab
--- /dev/null
+#!./perl
+use strict;
+use warnings;
+
+$| = 1;
+
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = ('../lib','.','../ext/re');
+ require './test.pl';
+}
+
+plan tests => 3;
+use strict;
+
+my(@body) = (
+ "<mailto:xxxx.xxxx\@outlook.com>",
+ "A\x{B9}ker\x{E8}eva xxxx.xxxx\@outlook.com \x{201D}",
+);
+
+for (@body) {
+ s{ <? (?<!mailto:) \b ( [a-z0-9.]+ \@ \S+ ) \b
+ (?: > | \s{1,10} (?!phone) [a-z]{2,11} : ) }{ }xgi;
+ my $got= $1;
+ is( $got, '.xxxx@outlook.com' );
+}
+ok("got to the end without dieing (note without DEBUGGING passing this test means nothing)");
+
require './test.pl';
}
-plan tests => 40;
+plan tests => 42;
$^R = undef;
like( 'a', qr/^a(?{1})(?:b(?{2}))?/, 'a =~ ab?' );
# [perl #78194] $_ in code block aliasing op return values
"$_" =~ /(?{ is \$_, \$_,
'[perl #78194] \$_ == \$_ when $_ aliases "$x"' })/;
+
+@a = 1..3;
+like eval { qr/@a(?{})/ }, qr/1 2 3\(\?\{\}\)/, 'qr/@a(?{})/';
+
+# Not a code block, but looks a bit like one. (Failed an assertion from
+# 5.17.1 to 5.21.6.)
+ok "(?{" =~ qr/\Q(?{/, 'qr/\Q(?{/';
use warnings;
no warnings 'once';
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
# This is a wrapper for a generated file. Assumes being run from 't'
# directory.
# This test depends on t/lib/Devel/switchd*.pm.
-plan(tests => 18);
+plan(tests => 19);
my $r;
"42\n",
'UTF8 length caches on $DB::sub are flushed'
);
+
+# [perl #122771] -d conflicting with sort optimisations
+is(
+ runperl(
+ switches => [ '-Ilib', '-d:switchd_empty' ],
+ prog => 'BEGIN { $^P &= ~0x4 } sort { $$b <=> $$a } (); print qq-42\n-',
+ ),
+ "42\n",
+ '-d does not conflict with sort optimisations'
+);
SV*
Perl__core_swash_init(pTHX_ const char* pkg, const char* name, SV *listsv, I32 minbits, I32 none, SV* invlist, U8* const flags_p)
{
+
+ /*NOTE NOTE NOTE - If you want to use "return" in this routine you MUST
+ * use the following define */
+
+#define CORE_SWASH_INIT_RETURN(x) \
+ PL_curpm= old_PL_curpm; \
+ return x
+
/* Initialize and return a swash, creating it if necessary. It does this
* by calling utf8_heavy.pl in the general case. The returned value may be
* the swash's inversion list instead if the input parameters allow it.
* <invlist> is only valid for binary properties */
dVAR;
+ PMOP *old_PL_curpm= PL_curpm; /* save away the old PL_curpm */
+
SV* retval = &PL_sv_undef;
HV* swash_hv = NULL;
const int invlist_swash_boundary =
assert(listsv != &PL_sv_undef || strNE(name, "") || invlist);
assert(! invlist || minbits == 1);
+ PL_curpm= NULL; /* reset PL_curpm so that we dont get confused between the regex
+ that triggered the swash init and the swash init perl logic itself.
+ See perl #122747 */
+
/* If data was passed in to go out to utf8_heavy to find the swash of, do
* so */
if (listsv != &PL_sv_undef || strNE(name, "")) {
/* If caller wants to handle missing properties, let them */
if (flags_p && *flags_p & _CORE_SWASH_INIT_RETURN_IF_UNDEF) {
- return NULL;
+ CORE_SWASH_INIT_RETURN(NULL);
}
Perl_croak(aTHX_
"Can't find Unicode property definition \"%"SVf"\"",
}
}
- return retval;
+ CORE_SWASH_INIT_RETURN(retval);
+#undef CORE_SWASH_INIT_RETURN
}
extra.pods : miniperl
@ @extra_pods.com
-PERLDELTA_CURRENT = [.pod]perl5201delta.pod
+PERLDELTA_CURRENT = [.pod]perl5202delta.pod
$(PERLDELTA_CURRENT) : [.pod]perldelta.pod
Copy/NoConfirm/Log $(MMS$SOURCE) $(PERLDELTA_CURRENT)
* This symbol, if defined, indicates that the localeconv routine is
* available for numeric and monetary formatting conventions.
*/
-#define HAS_LOCALECONV /**/
+/*#define HAS_LOCALECONV /**/
/* HAS_LOCKF:
* This symbol, if defined, indicates that the lockf routine is