<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dagolden &#187; p5p</title>
	<atom:link href="http://www.dagolden.com/index.php/tag/p5p/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dagolden.com</link>
	<description>Whatever comes to mind</description>
	<lastBuildDate>Mon, 23 Jan 2012 03:43:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Visualizing the Perl 5 support policy</title>
		<link>http://www.dagolden.com/index.php/1605/visualizing-the-perl-5-support-policy/</link>
		<comments>http://www.dagolden.com/index.php/1605/visualizing-the-perl-5-support-policy/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 03:43:33 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[p5p]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ironman]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl programming]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1605</guid>
		<description><![CDATA[My last post showed historical Perl 5 release cycles, but comments I got on and off the blog suggested that my vaguely positive sentiments about the official support policy were misunderstood. This post expands and clarifies my view. I have redone my Perl 5 release cycle graph again with a few changes. First, for the [...]]]></description>
			<content:encoded><![CDATA[<p>My <a href="http://www.dagolden.com/index.php/1587/visualizing-perl-5-release-cycles/" target="_blank">last post</a> showed historical Perl 5 release cycles, but comments I got on and off the blog suggested that my vaguely positive sentiments about the <a href="http://perldoc.perl.org/perlpolicy.html" target="_blank">official support policy</a> were misunderstood.  This post expands and clarifies my view.</p>
<p>I have redone my Perl 5 release cycle graph again with a few changes.  First, for the v5.4 through v5.8 series, I have broken the line to the final release, which I consider to be "outliers".  <strong>I think the Perl community was lucky to get those releases</strong> — was lucky that someone stepped up and made them — and that they don't reflect a "normal development" or support cycle.</p>
<p>Second, I have <strong>projected an estimated lifecycle under the official support policy</strong> for v5.12, v5.14 and the not-yet-released v5.16. This represents an expectation for the normal support lifetime of these releases and I think shows a better contrast of expectations resulting from the support policy introduced with v5.14 compared to historical releases.</p>
<p><a href="http://www.dagolden.com/wp-content/uploads/2012/01/perl5-release-timeline-2.png"><img src="http://www.dagolden.com/wp-content/uploads/2012/01/perl5-release-timeline-2-300x214.png" alt="Perl 5 Release Timeline (Amended)" title="perl5-release-timeline-2" width="300" height="214" class="aligncenter size-medium wp-image-1606" /></a></p>
<p class="aligncenter"><em>click for larger view</em></p>
<p>My observations (ignoring outliers):</p>
<ul>
<li><strong>Prior to v5.14, there was a (sometimes lengthy) gap between the end of one stable series and the start of the next.</strong></li>
<li>The actively maintained periods of v5.4, v5.5 and v5.6 were shorter than the proposed support windows under the new policy</li>
<li>v5.8 had two different support paradigms.  Between v5.8.0 and v5.8.1 was a long gap similar to the v5.6 series.  v5.8.1 to v5.8.8 had a more regularly-spaced series of support releases.</li>
<li>v5.10 had the longest gap between initial release (v5.10.0) and the subsequent support release (v5.10.1)</li>
<li>v5.12 has had the most consistent pattern of support releases after the initial release, and is the only stable Perl 5 to have a (regular, not outlier) support release after the release of the next stable version</li>
<li>v5.14 was the first stable Perl 5 released under the new annual-release cycle</li>
</ul>
<p><strong>The new support policy most resembles a return to the best support period seen historically</strong> (v5.8.1 to v5.8.8), but without the subsequent gap to the next stable release.  </p>
<p>Why do I think this new policy is a positive step forward? Here are some reasons:</p>
<ul>
<li>The support policy is <strong>actually written down</strong>.  What expectations did anyone have prior?  I don't know.  But if I'm using Perl 5, I'd rather know what to expect that have to guess and hope for the best.</li>
<li><strong>The new policy offers a support window longer in practice than any Perl 5 except v5.8</strong> and more regular than any period except between v5.8.1 and v5.8.8</li>
<li>The new stable Perl 5 is available for migration testing mid-way through the support window of the prior stable release.  If there are issues with migration, users can be confident of support for their existing version for an additional year (and emergency security support for a year after that).</li>
<li>The annual release cycle means the change between one stable release and the next will be smaller, lowering migration risk</li>
</ul>
<p><strong>The new policy does cut off the "long tail" of expectations for an outlier release</strong>.  I can understand that for some companies or OS packagers, a two-year support window (three for security) might feel too short, even if that is longer than was typically seen historically.</p>
<p>Here is where the annual stable release cycle and monthly development release cycle offer a huge side benefit: there is now a well-documented, frequently-used, regularly-updated <a href="http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/release_managers_guide.pod" title="Release Manager's Guide" target="_blank">release manager's guide</a> for Perl 5.  Now, <strong>the release process is so easy that a moderately-skilled Perl software engineer without much prior exposure to the Perl source repository can make a Perl 5 release tarball in about a day</strong>.</p>
<p>This means that even if the core Perl 5 development team isn't supporting, say, v5.12 anymore, a motivated company or community group could do the work necessary to prepare their own "outlier" release and either petition the Perl 5 core team to release it or could release their own stable "micro-fork" for others with long-term support needs.  (There might even be a profitable business opportunity selling support for Perl versions past the official support window.)</p>
<p><strong>Previously, Perl 5 development used to be bursty, with long delays between stable releases and with unclear expectations for support.  Now, Perl 5 development happens like clockwork, and has a clear, written support policy.</strong></p>
<p><small><em>[Note: this post represents my individual opinion and was not reviewed by the Perl 5 Porters core development team; it may or may not represent the views of other core developers; it is certainly not an "official" statement of the Perl 5 Porters in any way]</em></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1605/visualizing-the-perl-5-support-policy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visualizing Perl 5 release cycles</title>
		<link>http://www.dagolden.com/index.php/1587/visualizing-perl-5-release-cycles/</link>
		<comments>http://www.dagolden.com/index.php/1587/visualizing-perl-5-release-cycles/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 17:06:39 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[p5p]]></category>
		<category><![CDATA[ironman]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl programming]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1587</guid>
		<description><![CDATA[Beginning with Perl 5, version 12, the Perl 5 language began an annual release cycle, with a new stable release around May of each year. Beginning with version 14, the Perl 5 maintainers also announced a formal support policy and ended support for version 10. This is a significant change from the history of Perl, [...]]]></description>
			<content:encoded><![CDATA[<p>Beginning with Perl 5, version 12, the Perl 5 language began an annual release cycle, with a new stable release around May of each year.  Beginning with version 14, the Perl 5 maintainers also announced a <a href="http://perldoc.perl.org/perlpolicy.html" title="perlpolicy" target="_blank">formal support policy</a> and ended support for version 10.</p>
<p>This is a significant change from the history of Perl, so I though it would be interesting to see how recent release cycles have compared to historic ones.  The chart below shows releases over time since Perl 5, version 4 when releases were more officially split between "stable" and intermediate releases.</p>
<p><a href="http://www.dagolden.com/wp-content/uploads/2012/01/perl5-release-timeline.png"><img src="http://www.dagolden.com/wp-content/uploads/2012/01/perl5-release-timeline-300x214.png" alt="" title="Perl 5 Release Timeline" width="300" height="214" class="aligncenter size-medium wp-image-1588" /></a></p>
<p class="aligncenter"><em>click for larger view</em></p>
<p>(Note: Starting with version 7, odd numbered versions were reserved for development releases and are omitted above.  Versions 13 and 15 moved to a monthly release cycle for easier community testing of incremental development.)</p>
<p>I think the overall change to a shorter development cycle will benefit both users and maintainers of Perl 5.  For users, each new release will be a smaller change from the previous, lowering upgrade risk, plus they can have confidence in an ongoing process of improvement.  For maintainers, it avoids taking away effort from mainline development to retro-fit patches into a Perl that is many years old and might have substantially different guts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1587/visualizing-perl-5-release-cycles/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Counterfactual Perl 6</title>
		<link>http://www.dagolden.com/index.php/1492/counterfactual-perl/</link>
		<comments>http://www.dagolden.com/index.php/1492/counterfactual-perl/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 03:19:34 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[ironman]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1492</guid>
		<description><![CDATA[Several recent posts (more here and here) discuss whether Perl 6 is an impediment for progress of Perl 5 and debate remedies involving changing the name of one or the other. The problem I have with these debates is that they sideline the realities of the current situation in favor of romanticizing a counterfactual. The [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://j.mp/mQj6Et">Several</a> <a href="http://j.mp/koCnP0">recent</a> <a href="http://j.mp/jqxfRT">posts</a> (more <a href="http://j.mp/mxhLan">here</a> and <a href="http://j.mp/k5iE5S">here</a>) discuss whether Perl 6 is an impediment for progress of Perl 5 and debate remedies involving changing the name of one or the other.  <strong>The problem I have with these debates is that they sideline the realities of the current situation in favor of romanticizing a counterfactual</strong>.</p>
<p>The counterfactual is this: <strong><em>"If Perl 6 never existed, then Perl 5 could bump itself to Perl 6 NOW in order to signal a backwards-incompatible break from the past."</em></strong></p>
<p>If the counterfactual were true, I believe this could happen, even with the limitations of the Perl 5 development process we have today.  Perl 6 (as it actually does exist today) is revolutionary design, not evolutionary design, but that doesn't preclude an evolution of Perl 5 that significantly breaks backwards compatibility.</p>
<p>Without recommending any particular change,<strong> here are some examples of things that I think could be possible</strong>, just to give a sense of what evolutionary (rather than revolutionary) changes could attempt:</p>
<ul>
<li>Replacing <code>eval BLOCK</code> syntax with <code>try BLOCK</code></li>
<li>Removing of Unix-specific user/group functions and similar cruft</li>
<li>Eliminating of indirect syntax</li>
<li>Replacing method call arrow <code>-></code> with the shorter (and more widely recognized) dot/period character (and finding a new concatenation operator)</li>
<li>Eliminating version objects and v-strings</li>
<li>Replacing (frequently misunderstood) function prototypes with function signatures</li>
</ul>
<p>Those are just ideas off the top of my head, but I hope it's easy to see than a<strong>ny of those break enough existing code as to make them very difficult to envision being added to any future release of Perl 5</strong>.  However, if the counterfactual were true, then there would always be the option of making a clean break to "Perl 6", ensuring that there is no automatic expectation of backwards compatibility.</p>
<p><strong>Even if the counterfactual were true, making such evolutionary changes would not necessarily be easy.</strong>  It would require a Pumpking (other than Larry Wall) to play language designer for Perl 5 and to push the Perl core developer community into a rough consensus.  But hard does not mean impossible.</p>
<p>However, with the reality of Perl 6 as it stands, even a name change by Perl 6 ("Camelia" was one suggestion) doesn't help Perl 5's evolution.  Given the expectations that have been set for Perl 5, it seems unlikely to me that there would be broad community support for Perl 5 evolving into Perl 6 if Perl 6 were renamed.  <strong>"Hi, we promised you Perl 6 ten years ago, but it's not ready for production, so we're going to call this other thing Perl 6 instead."</strong>  I don't think that's great for external perceptions, either.  What then?  Jump over Perl 6 straight to Perl 7?  I don't think that would be well received, either.</p>
<p>For Perl 5 to evolve in ways that are significantly backwards-incompatible, I see only two realistic options:</p>
<ul>
<li><strong>Rename Perl 5 to something else</strong>, with all the associated branding and marketplace traction issues that would cause, but with the ability to make a major version number bump to manage compatibility expectations.</li>
<li><strong>Increase the speed of mutation of Perl 5</strong> so that Versions 16, 18, 20, etc. become bigger departures cumulatively than we ever saw with Versions 6, 8, 10, etc., and become much more ruthless about setting future compatibility expectations.</li>
</ul>
<p><em>(I suppose an interesting variation on the first way would be for Perl 5 <em>and</em> Perl 6 to be renamed simultaneously.  I could see that having some positive opportunities for branding and marketing.)</em></p>
<p><strong>The status quo alternative is for Perl 5 and Perl 6 to continue as they have been, slowly chugging along on their respective tracks</strong>.  Perl 5 will continue to put backwards compatibility over evolution and won't see substantial new features added or old mis-features cleaned up.  Perl 6 will continue to push towards some sort of production readiness.  </p>
<p>For some (perhaps many), the status quo is ideal.  For me, I would find it rather boring to be a part of.</p>
<p>So -- let <strong>that</strong> be the real debate in the Perl 5 community: <strong>compatibility</strong> or <strong>evolution</strong>?  Names and version numbers are just the means to an end. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1492/counterfactual-perl/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Coming soon in Perl: CPAN local::lib bootstrap</title>
		<link>http://www.dagolden.com/index.php/1245/coming-soon-in-perl-cpan-locallib-bootstrap/</link>
		<comments>http://www.dagolden.com/index.php/1245/coming-soon-in-perl-cpan-locallib-bootstrap/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 03:40:05 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1245</guid>
		<description><![CDATA[I've written about my efforts to get CPAN.pm to bootstrap local::lib and about a new HTTP client for CPAN.pm. I'm pleased to say that both have been merged into the development branch of the Perl core. Barring any show-stopping bugs, the forthcoming Perl 5.13.9 will let a non-privileged user bootstrap access to CPAN, even if [...]]]></description>
			<content:encoded><![CDATA[<p>I've written about my efforts to <a href="http://www.dagolden.com/index.php/1186/locallib-for-cpan-pm/">get CPAN.pm to bootstrap local::lib</a> and about a <a href="http://www.dagolden.com/index.php/1212/why-httptiny/">new HTTP client for CPAN.pm</a>.  I'm pleased to say that <strong>both have been merged into the development branch of the Perl core</strong>.</p>
<p>Barring any show-stopping bugs, the forthcoming Perl 5.13.9 will let a non-privileged user bootstrap access to CPAN, even if FTP is blocked and they have no command line HTTP clients installed.  That means that <strong>if you can run perl, and you can use port 80, then you can use CPAN</strong>.</p>
<p>Imagine someday when Perl 5.14 becomes standard in linux distributions.  Log-in to a new machine (or perhaps a shared host), type "cpan", and start installing stuff from CPAN.  Easy!</p>
<p>To show you how it works, I installed a snapshot of Perl from the git repository and then switched to a clean, unprivileged user account to try installing something.  All I typed at the keyboard was this:</p>
<pre class="brush: plain; title: ; notranslate">
/opt/perl/fromgit/bin/cpan5.13.8[ENTER]
[ENTER]
[ENTER]
[ENTER]
[ENTER]
install File::Marker[ENTER]
</pre>
<p>The log below is long and verbose (the way <a href="http://p3rl.org/CPAN">CPAN.pm</a> just is, unfortunately) but you can see how it uses <a href="http://p3rl.org/HTTP::Tiny">HTTP::Tiny</a>, bootstraps <a href="http://p3rl.org/local::lib">local::lib</a>, updates my <code>.bashrc</code>, installs File::Marker in the local library and even <strong>reminds me to restart my shell</strong>.  Isn't that user-friendly?</p>
<pre class="brush: plain; title: ; notranslate">
$ /opt/perl/fromgit/bin/cpan5.13.8 

CPAN is the world-wide archive of perl resources. It consists of about
300 sites that all replicate the same contents around the globe. Many
countries have at least one CPAN site already. The resources found on
CPAN are easily accessible with the CPAN.pm module. If you want to use
CPAN.pm, lots of things have to be configured. Fortunately, most of
them can be determined automatically. If you prefer the automatic
configuration, answer 'yes' below.

If you prefer to enter a dialog instead, you can answer 'no' to this
question and I'll let you configure in small steps one thing after the
other. (Note: you can revisit this dialog anytime later by typing 'o
conf init' at the cpan prompt.)

Would you like me to configure as much as possible automatically? [yes] 

 &lt;install_help&gt;

Warning: You do not have write permission for Perl library directories.

To install modules, you need to configure a local Perl library directory or
escalate your privileges.  CPAN can help you by bootstrapping the local::lib
module or by configuring itself to use 'sudo' (if available).  You may also
resolve this problem manually if you need to customize your setup.

What approach do you want?  (Choose 'local::lib', 'sudo' or 'manual')
 [local::lib] 

Autoconfigured everything but 'urllist'.

Now you need to choose your CPAN mirror sites.  You can let me
pick mirrors for you, you can select them from a list or you
can enter them by hand.

Would you like me to automatically choose some CPAN mirror
sites for you? (This means connecting to the Internet) [yes] 

Trying to fetch a mirror list from the Internet
Fetching with HTTP::Tiny:
http://www.perl.org/CPAN/MIRRORED.BY

Looking for CPAN mirrors near you (please be patient)
..............................................................
..............................................................
..............................................................
..................................... done!

New urllist
  http://cpan.erlbaum.net/
  http://cpan.mirror.clemson.edu/
  http://mirrors.servercentral.net/CPAN/

Autoconfiguration complete.

Attempting to bootstrap local::lib...

Writing /home/cleanroom/.cpan/CPAN/MyConfig.pm for bootstrap...
commit: wrote '/home/cleanroom/.cpan/CPAN/MyConfig.pm'
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/01mailrc.txt.gz
Going to read '/home/cleanroom/.cpan/sources/authors/01mailrc.txt.gz'
............................................................................DONE
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/modules/02packages.details.txt.gz
Going to read '/home/cleanroom/.cpan/sources/modules/02packages.details.txt.gz'
  Database was generated on Sat, 15 Jan 2011 20:57:19 GMT
  HTTP::Date not available
............................................................................DONE
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/modules/03modlist.data.gz
Going to read '/home/cleanroom/.cpan/sources/modules/03modlist.data.gz'
............................................................................DONE
Going to write /home/cleanroom/.cpan/Metadata
Running make for A/AP/APEIRON/local-lib-1.008001.tar.gz
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/id/A/AP/APEIRON/local-lib-1.008001.tar.gz
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/id/A/AP/APEIRON/CHECKSUMS
Checksum for /home/cleanroom/.cpan/sources/authors/id/A/AP/APEIRON/local-lib-1.008001.tar.gz ok

  CPAN.pm: Going to build A/AP/APEIRON/local-lib-1.008001.tar.gz

Attempting to create directory /home/cleanroom/perl5

*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
*** Since we're running under CPAN, I'll just let it take care
    of the dependency's installation later.
[Core Features]
- ExtUtils::MakeMaker ...loaded. (6.57_05 &gt;= 6.31)
- ExtUtils::Install   ...loaded. (1.55 &gt;= 1.43)
- Module::Build       ...loaded. (0.3607 &gt;= 0.36)
- CPAN                ...loaded. (1.9463 &gt;= 1.82)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for local::lib
Writing MYMETA.yml
cp lib/POD2/PT_BR/local/lib.pod blib/lib/POD2/PT_BR/local/lib.pod
cp lib/lib/core/only.pm blib/lib/lib/core/only.pm
cp lib/local/lib.pm blib/lib/local/lib.pm
cp lib/POD2/DE/local/lib.pod blib/lib/POD2/DE/local/lib.pod
Manifying blib/man3/POD2::PT_BR::local::lib.3
Manifying blib/man3/lib::core::only.3
Manifying blib/man3/local::lib.3
Manifying blib/man3/POD2::DE::local::lib.3
  APEIRON/local-lib-1.008001.tar.gz
  /usr/bin/make -- OK
'YAML' not installed, will not store persistent state
Running make test
PERL_DL_NONLAZY=1 /opt/perl/fromgit/bin/perl5.13.8 -I/home/cleanroom/perl5/lib/perl5/x86_64-linux-thread-multi -I/home/cleanroom/perl5/lib/perl5 &quot;-MExtUtils::Command::MM&quot; &quot;-e&quot; &quot;test_harness(0, 'inc', 'blib/lib', 'blib/arch')&quot; t/classmethod.t t/coderefs_in_inc.t t/de-dup.t t/install.t t/lib-core-only.t t/pipeline.t
t/classmethod.t ...... Name &quot;File::Spec::rel2abs&quot; used only once: possible typo at t/classmethod.t line 20.
t/classmethod.t ...... 1/? Attempting to create directory t/var/splat
t/classmethod.t ...... ok
t/coderefs_in_inc.t .. ok
t/de-dup.t ........... ok
t/install.t .......... skipped: Install Capture::Tiny to test installation
t/lib-core-only.t .... ok
t/pipeline.t ......... ok
All tests successful.
Files=6, Tests=10,  1 wallclock secs ( 0.04 usr  0.01 sys +  0.19 cusr  0.01 csys =  0.25 CPU)
Result: PASS
  APEIRON/local-lib-1.008001.tar.gz
  /usr/bin/make test -- OK
Running make install
Manifying blib/man3/POD2::PT_BR::local::lib.3
Manifying blib/man3/lib::core::only.3
Manifying blib/man3/local::lib.3
Manifying blib/man3/POD2::DE::local::lib.3
Installing /home/cleanroom/perl5/lib/perl5/local/lib.pm
Installing /home/cleanroom/perl5/lib/perl5/POD2/PT_BR/local/lib.pod
Installing /home/cleanroom/perl5/lib/perl5/POD2/DE/local/lib.pod
Installing /home/cleanroom/perl5/lib/perl5/lib/core/only.pm
Installing /home/cleanroom/perl5/man/man3/POD2::PT_BR::local::lib.3
Installing /home/cleanroom/perl5/man/man3/lib::core::only.3
Installing /home/cleanroom/perl5/man/man3/local::lib.3
Installing /home/cleanroom/perl5/man/man3/POD2::DE::local::lib.3
Appending installation info to /home/cleanroom/perl5/lib/perl5/x86_64-linux-thread-multi/perllocal.pod
  APEIRON/local-lib-1.008001.tar.gz
  /usr/bin/make install  -- OK

local::lib is installed. You must now add the following environment variables
to your shell configuration files (or registry, if you are on Windows) and
then restart your command line shell and CPAN before installing modules:

export PERL_LOCAL_LIB_ROOT=&quot;/home/cleanroom/perl5&quot;
export PERL_MB_OPT=&quot;--install_base /home/cleanroom/perl5&quot;
export PERL_MM_OPT=&quot;INSTALL_BASE=/home/cleanroom/perl5&quot;
export PERL5LIB=&quot;/home/cleanroom/perl5/lib/perl5/x86_64-linux-thread-multi:/home/cleanroom/perl5/lib/perl5:$PERL5LIB&quot;
export PATH=&quot;/home/cleanroom/perl5/bin:$PATH&quot;

Would you like me to append that to /home/cleanroom/.bashrc now? [yes] 

commit: wrote '/home/cleanroom/.cpan/CPAN/MyConfig.pm'
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.9463)
Enter 'h' for help.

cpan[1]&gt; install File::Marker
Running install for module 'File::Marker'
Running make for D/DA/DAGOLDEN/File-Marker-0.13.tar.gz
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/id/D/DA/DAGOLDEN/File-Marker-0.13.tar.gz
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/id/D/DA/DAGOLDEN/CHECKSUMS
Checksum for /home/cleanroom/.cpan/sources/authors/id/D/DA/DAGOLDEN/File-Marker-0.13.tar.gz ok

  CPAN.pm: Going to build D/DA/DAGOLDEN/File-Marker-0.13.tar.gz

Creating new 'MYMETA.yml' with configuration results
Creating new 'Build' script for 'File-Marker' version '0.13'
Building File-Marker
  DAGOLDEN/File-Marker-0.13.tar.gz
  ./Build -- OK
Running Build test
t/01_File_Marker.t ... ok
t/02_fork.t .......... ok
t/03_thread.t ........ ok
t/04_save_load.t ..... ok
t/98_pod.t ........... skipped: Skipping author tests
t/99_pod_coverage.t .. skipped: Skipping author tests
All tests successful.
Files=6, Tests=58,  1 wallclock secs ( 0.04 usr  0.02 sys +  0.22 cusr  0.02 csys =  0.30 CPU)
Result: PASS
  DAGOLDEN/File-Marker-0.13.tar.gz
  ./Build test -- OK
Running Build install
Building File-Marker
Installing /home/cleanroom/perl5/lib/perl5/File/Marker.pm
Installing /home/cleanroom/perl5/man/man3/File::Marker.3
  DAGOLDEN/File-Marker-0.13.tar.gz
  ./Build install  -- OK

cpan[2]&gt; q
Terminal does not support GetHistory.
Lockfile removed.

*** Remember to restart your shell before running cpan again ***
</pre>
<p>I want to thank Andreas Koenig (CPAN.pm) and Chris Nehren (local::lib) for quickly turning around new releases of their modules to make this work.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1245/coming-soon-in-perl-cpan-locallib-bootstrap/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Patching the Perl core for lazy file handle objects</title>
		<link>http://www.dagolden.com/index.php/1167/patching-the-perl-core-for-lazy-file-handle-objects/</link>
		<comments>http://www.dagolden.com/index.php/1167/patching-the-perl-core-for-lazy-file-handle-objects/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 02:17:04 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1167</guid>
		<description><![CDATA[Last night I was inspired to patch the Perl core to load IO::File on demand when calling a method on a file handle would otherwise die. This effectively makes file handles actual "lazy" IO::File objects. If you want to use file handles procedurally, you never need IO::File. But if you try to treat handles as [...]]]></description>
			<content:encoded><![CDATA[<p>Last night I was inspired to patch the Perl core to load <a href="http://p3rl.org/IO::File">IO::File</a> on demand when calling a method on a file handle would otherwise die.  This effectively makes file handles actual "lazy" IO::File objects.  If you want to use file handles procedurally, you never need IO::File.  But if you try to treat handles as objects and call methods on them, IO::File gets loaded when you need it.</p>
<p>Here's how it works.  As of Perl 5.12, internally, Perl 5 file handles are represented as IO::File objects:</p>
<pre class="brush: plain; title: ; notranslate">
$ perl -E 'say(ref(*STDERR{IO}))'
IO::File
$ perl -E 'open my $fh, &quot;&gt;&quot;, &quot;/dev/null&quot;; say(ref(*{$fh}{IO}))'
IO::File
$ perl -E 'my $str; open my $fh, &quot;&gt;&quot;, \$str ; say(ref(*{$fh}{IO}))'
IO::File
</pre>
<p>However, trying to call methods on them fails if you haven't loaded IO::File (or a parent class like IO::Handle):</p>
<pre class="brush: plain; title: ; notranslate">
$ perl -E 'STDOUT-&gt;binmode(&quot;:utf8&quot;); say &quot;\x{263a}&quot;'
Can't locate object method &quot;binmode&quot; via package &quot;IO::File&quot; at -e line 1.
</pre>
<p>With the <a href="http://perl5.git.perl.org/perl.git/commitdiff/15e6cdd91beb4cefae4b65e855d68cf64766965d">patch I wrote</a>, just before such a method call would die, if the call is on an IO::File object and <code>$INC{'IO/File.pm'}</code> doesn't exist, Perl attempts to load IO::File and tries to resolve the method again:</p>
<pre class="brush: plain; title: ; notranslate">
$ bleadperl -E 'STDOUT-&gt;binmode(&quot;:utf8&quot;); say &quot;\x{263a}&quot;'
☺
</pre>
<p>This has zero performance impact on code that doesn't call methods on file handles or that loads IO::File (or a parent class) before calling a method on a file handle.  It only kicks in when Perl would otherwise die on you.</p>
<p>Barring any issues emerging, this feature will be available in the development release of Perl 5.13.8 on or around December 20, just in time for Christmas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1167/patching-the-perl-core-for-lazy-file-handle-objects/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>What&#039;s New in Perl 5, Version 13 (updated)</title>
		<link>http://www.dagolden.com/index.php/1161/whats-new-in-perl-5-13-7/</link>
		<comments>http://www.dagolden.com/index.php/1161/whats-new-in-perl-5-13-7/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 02:39:51 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1161</guid>
		<description><![CDATA[I've updated my Perl 5, Version 13 talk to include the latest new features from 5.13.6 and 5.13.7. Some of the highlights: New regex modifiers to force unicode or locale-specific semantics (5.13.6) Regular expression retain original semantics when interpolated later (5.13.6) Array and hash functions (push, pop, keys, etc.) work on array and hash references [...]]]></description>
			<content:encoded><![CDATA[<p>I've updated my <a href="http://www.dagolden.com/wp-content/uploads/2010/07/Perl-5-Version-13.pdf">Perl 5, Version 13 talk</a> to include the latest new features from 5.13.6 and 5.13.7.</p>
<p>Some of the highlights:</p>
<ul>
<li>New regex modifiers to force unicode or locale-specific semantics (5.13.6)</li>
<li>Regular expression retain original semantics when interpolated later (5.13.6)</li>
<li>Array and hash functions (push, pop, keys, etc.) work on array and hash references (5.13.7)</li>
<li>Set default regular expression modifiers in a lexical scope (5.13.7)</li>
<li>Non-destructive transliteration (y///r) just like substitution (s///r) (5.13.7)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1161/whats-new-in-perl-5-13-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bootstrapping CPAN.pm using HTTP::Lite</title>
		<link>http://www.dagolden.com/index.php/1148/bootstrapping-cpan-pm-using-httplite/</link>
		<comments>http://www.dagolden.com/index.php/1148/bootstrapping-cpan-pm-using-httplite/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 16:25:33 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1148</guid>
		<description><![CDATA[One of my goals for Perl 5.14 that I've discussed with Jesse Vincent and Andreas Koenig is getting CPAN.pm to be able to bootstrap itself in a fresh perl installation without relying on external command line tools or FTP. LWP is too big a distribution to bundle into the core, but HTTP::Lite is a focused [...]]]></description>
			<content:encoded><![CDATA[<p>One of my goals for Perl 5.14 that I've discussed with Jesse Vincent and Andreas Koenig is getting <a href="http://p3rl.org/CPAN">CPAN.pm</a> to be able to bootstrap itself in a fresh perl installation without relying on external command line tools or FTP.  <a href="http://p3rl.org/LWP">LWP </a>is too big a distribution to bundle into the core, but <a href="http://p3rl.org/HTTP::Lite">HTTP::Lite</a> is a focused little module that provides everything needed.  (cpanm bundles HTTP::Lite already)</p>
<p>I've just finished some work to add HTTP::Lite support to CPAN.pm and Andreas has merged it into the master branch.  The next step will be to test it out in a development release.  If all goes well, the plan is to merge the latest CPAN.pm into the Perl core and bring in HTTP::Lite as well.  Then, finally, a mere 20 years after the invention of HTTP, Perl 5.14 will be able to speak HTTP out of the box and bootstrap access to all of CPAN.</p>
<p>Keep your fingers crossed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1148/bootstrapping-cpan-pm-using-httplite/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>New prototype accepted; next patch almost done</title>
		<link>http://www.dagolden.com/index.php/1133/new-prototype-accepted-next-patch-almost-done/</link>
		<comments>http://www.dagolden.com/index.php/1133/new-prototype-accepted-next-patch-almost-done/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 03:01:23 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1133</guid>
		<description><![CDATA[My patch for a new perl prototype was accepted and should be in Perl 5.13.7 in November. From the change log: Add single-term prototype The C prototype is a special alternative to C that will act like C when given a literal array or hash variable, but will otherwise force scalar context on the argument. [...]]]></description>
			<content:encoded><![CDATA[<p>My patch for a new perl prototype was accepted and should be in Perl 5.13.7 in November.  From the change log:</p>
<blockquote><p>
Add single-term prototype</p>
<p>The C<+> prototype is a special alternative to C<$> that will act like<br />
C<\[@%]> when given a literal array or hash variable, but will otherwise<br />
force scalar context on the argument.  This is useful for functions which<br />
should accept either a literal array or an array reference as the argument
</p></blockquote>
<p>I've finished most of the hard work on my next patch, which would allow push/pop/keys/values/etc to act directly on references of an appropriate type.  Now, I'm drafting the email that explains the change and the rationale and hope to submit it to the p5p list later this week.  </p>
<p>If you liked what I was proposing in some of my recent posts on the topic, keep your fingers crossed that any debate on it is mild and constructive and we'll have some new, cool features in Perl for either Thanksgiving or Christmas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1133/new-prototype-accepted-next-patch-almost-done/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why I want a new prototype in the perl core</title>
		<link>http://www.dagolden.com/index.php/1112/why-i-want-a-new-prototype-in-the-perl-core/</link>
		<comments>http://www.dagolden.com/index.php/1112/why-i-want-a-new-prototype-in-the-perl-core/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 16:37:44 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1112</guid>
		<description><![CDATA[Most of the time, you shouldn't use Perl's function prototypes. They aren't function signatures the way you expect. Instead, they mostly help the parser understand how to interpret arguments using the right context. Here is a simple example: The '$' prototype says that foo takes a single argument in scalar context. Consider this: If your [...]]]></description>
			<content:encoded><![CDATA[<p>Most of the time, you shouldn't use Perl's function prototypes.  They aren't function signatures the way you expect.  Instead, they mostly help the parser understand how to interpret arguments using the right context.</p>
<p>Here is a simple example:</p>
<pre class="brush: plain; title: ; notranslate">
sub foo($) { say shift }
</pre>
<p>The '$' prototype says that <code>foo</code> takes a single argument in <strong>scalar context</strong>.  Consider this:</p>
<pre class="brush: plain; title: ; notranslate">
$ perl -wE 'sub foo($){say shift} @array=(&quot;a&quot;..&quot;z&quot;); foo(@array)'
26
</pre>
<p>If your reaction is, <em>"What?!?"</em>, you need to remember than an array in scalar context is the length of the array.  And just to drive home the point that prototypes can be surprising, consider these two:</p>
<pre class="brush: plain; title: ; notranslate">
$ perl -wE 'sub foo($){say shift} foo(&quot;a&quot;,&quot;b&quot;,&quot;c&quot;)'
Too many arguments for main::foo at -e line 1, near &quot;&quot;c&quot;)&quot;
Execution of -e aborted due to compilation errors.

$ perl -wE 'sub foo($){say shift} foo(qw/a b c/)'
Useless use of a constant (a) in void context at -e line 1.
Useless use of a constant (b) in void context at -e line 1.
c
</pre>
<p>In the former case, the error is clear.  In the latter case, the <code>qw/a b c/</code> is equivalent to a <em>parenthesized</em> expression <code>("a", "b", "c")</code> which <em>in scalar context</em> evaluates throws away the left values and returns the right-most argument.  (See documentation for the <a href="http://perldoc.perl.org/perlop.html#Comma-Operator">Comma Operator</a>.)</p>
<p>These kinds of unexpected errors are why you generally shouldn't use prototypes. However, they are absolutely necessary to override or mimic the effect of a built-in keyword.</p>
<p>For my work on <a href="http://www.dagolden.com/index.php/1014/hacking-the-perl-core-to-push-and-pop-to-references/">push()</a> and <a href="http://www.dagolden.com/index.php/1029/hacking-the-perl-core-for-faster-keys-values-and-each/">keys()</a>, I want to be able to represent a prototype that takes an array or an array reference or a hash or a hash reference.  You <em>can</em> get perl to pass a reference to an array instead of the array itself using the <code>\@</code> prototype like this:</p>
<pre class="brush: plain; title: ; notranslate">
$ perl -wE 'sub foo(\@){say shift} @array=(&quot;a&quot;..&quot;z&quot;); foo(@array)'
ARRAY(0x1156588)
</pre>
<p>But that doesn't let you use an array reference as an argument -- only a literal array variable can be used, even though a reference is what is passed to the function when called as <code>foo(@array)</code>.</p>
<pre class="brush: plain; title: ; notranslate">
$ perl -wE 'sub foo(\@){say shift} @array=(&quot;a&quot;..&quot;z&quot;); foo(\@array)'
Type of arg 1 to main::foo must be array (not reference constructor) at -e line 1 ...

$ perl -wE 'sub foo(\@){say shift} foo([&quot;a&quot;..&quot;z&quot;])'
Type of arg 1 to main::foo must be array (not anonymous list ([])) at -e line 1 ...
</pre>
<p>Since the prototype I want doesn't exist, I've started working on a patch that would allow something like this to work:</p>
<pre class="brush: plain; title: ; notranslate">
sub foo(+) { say shift }

foo( @array );   # passed as \@array
foo( %hash );    # passed as \%hash
foo( $arrayref );
foo( $hashref );
foo( bar() );    # bar() called in scalar context
</pre>
<p>The "+" prototype passes literal array or hash variables using a reference, but passes any other argument in scalar context.  I call it a "<strong>single term</strong>" prototype.  With luck and favorable reviews, I hope it will make it into the November development release of Perl.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1112/why-i-want-a-new-prototype-in-the-perl-core/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ETOOMANYPROJECTS</title>
		<link>http://www.dagolden.com/index.php/642/etoomanyprojects/</link>
		<comments>http://www.dagolden.com/index.php/642/etoomanyprojects/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 19:52:15 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan-meta-spec]]></category>
		<category><![CDATA[cpan-testers]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[ironman]]></category>
		<category><![CDATA[p5p]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=642</guid>
		<description><![CDATA[When it rains it pours. As much as I'd like to keep my projects a FIFO queue, it's operating a bit like a stack these days. Here's what's keeping me busy (when I'm not busy enough with paying work and family life): Reviewing and finalizing 'package NAME VERSION' patches for the Perl core (hopefully before [...]]]></description>
			<content:encoded><![CDATA[<p>When it rains it pours.  As much as I'd like to keep my projects a FIFO queue, it's operating a bit like a stack these days.  Here's what's keeping me busy (when I'm not busy enough with paying work and family life):</p>
<ul>
<li><a href="http://www.nntp.perl.org/group/perl.perl5.porters/2010/01/msg155337.html">Reviewing</a> and finalizing 'package NAME VERSION' patches for the Perl core (hopefully before the <a href="http://www.nntp.perl.org/group/perl.perl5.porters/2010/01/msg155374.html">code freeze</a>)</li>
<li><a href="http://www.dagolden.com/index.php/614/project-plan-for-cpan-testers-2-0-migration/">CPAN Testers 2.0 migration project</a> -- volunteers are jumping in, which is good since I've barely had time to do anything but answer questions and help give people direction.  I haven't even had a chance to blog about first week progress</li>
<li>CPAN Meta Spec 2.0 -- <a href="http://www.dagolden.com/index.php/561/extending-the-timeline-for-cpan-meta-spec-revisions/">delayed once</a> and will be delayed again.  This is really, really close to done, but just doesn't have the urgency of everything else</li>
<li>Assorted bug reports and module patches -- and only if they take a few minutes or less</li>
</ul>
<p>That's my <a href="http://ironman.enlightenedperl.org/">Iron Man</a> post for the week.  Stay tuned next week for actual progress reports, I hope.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/642/etoomanyprojects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

