<?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>SIMOTRONE WEB PAGE &#187; Perl</title>
	<atom:link href="http://www.simotrone.it/tag/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.simotrone.it</link>
	<description>Simotrone is back!</description>
	<lastBuildDate>Fri, 30 Jul 2010 05:47:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Perl in futuro per Conway</title>
		<link>http://www.simotrone.it/2010/05/27/perl-in-futuro-per-conway/</link>
		<comments>http://www.simotrone.it/2010/05/27/perl-in-futuro-per-conway/#comments</comments>
		<pubDate>Thu, 27 May 2010 05:12:48 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[Knowledge is that which, next to virtue, truly raises one person above another.]]></category>
		<category><![CDATA[Damian Conway]]></category>
		<category><![CDATA[libri]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2868</guid>
		<description><![CDATA[Spesso escono articoli su vari argomenti, tenuti da personaggi &#8220;importanti&#8221; che ne sparano un po&#8217; di tutti i generi.
Ovviamente, ci si può esaltare o meno alla lettura delle prossime X features della versione Y.ZZ^2 ecc., ma di solito io non faccio parte del gruppo.
La cosa invece che mi è parsa carina di questa intervista a [...]]]></description>
			<content:encoded><![CDATA[<p>Spesso escono articoli su vari argomenti, tenuti da personaggi &#8220;importanti&#8221; che ne sparano un po&#8217; di tutti i generi.<br />
Ovviamente, ci si può esaltare o meno alla lettura delle prossime X features della versione Y.ZZ^2 ecc., ma di solito io non faccio parte del gruppo.</p>
<p>La cosa invece che mi è parsa carina di <a href="http://www.oreillygmt.co.uk/2010/05/damian-conway-on-perl-and-its-future.html">questa intervista</a> a Damian Conway sul futuro del perl (si parla sempre della fantomatica versione 6 del linguaggio, in gestazione da 10 anni), è questo paragrafo:</p>
<blockquote><p><strong>Greg: What non-computing books would you recommend programmers to read?</strong></p>
<p><strong>DC:</strong> Programming is an intrinsically creative task, so it&#8217;s critically important to feed your creativity from outside the discipline. My own interest has always been in new models and metaphors for computation and better ideas for interfaces, so I try and read as widely as I can in the hard sciences (especially physics and mathematics) and in the literature of general design. But that&#8217;s me, and most people wouldn&#8217;t find inspiration in those same places.</p>
<p>So the general answer, I think is that you need to find books that stretch your brain in unexpected ways, that break you out of your habitual ways of thinking and of viewing the world, that challenge your assumptions and your certainties. Some great example of such books are &#8220;The Design of Everyday Things&#8221; by Donald Norman, &#8220;Freakonomics&#8221; by Stephen Dubner and Steven Levitt, &#8220;Guns, Germs, and Steel&#8221; by Jared Diamond, &#8220;The Prince&#8221; by Machiavelli, &#8220;Catch Me If You Can&#8221;, by Frank Abignale, &#8220;Lost in the Cosmos&#8221; by Walker Percy, or just about anything that Douglas Hofstader has written (sadly, most people seem to stop at &#8220;Godel, Escher, Bach&#8221;).</p>
<p><em>Now, I don&#8217;t say that I agree with every idea or theory in those particular books, or even with most of them, but I do think that every one of them issues a direct challenge to our entrenched expectations and beliefs. And I think that&#8217;s the critical thing.</em></p>
<p>So much of everyday programming is monotone. You need to transcend that sameness if you want to become a better programmer. And learning to think outside the box (and even just that there&#8217;s a box to think outside of!) is essential to that growth.</p>
<p>I think that&#8217;s also why so many programmers naturally gravitate to science fiction. Really good SF takes you outside your assumptions in exactly the same way.</p></blockquote>
<p> <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/05/27/perl-in-futuro-per-conway/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recuperare stringhe in un file</title>
		<link>http://www.simotrone.it/2010/02/25/recuperare-stringhe-in-un-file/</link>
		<comments>http://www.simotrone.it/2010/02/25/recuperare-stringhe-in-un-file/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 17:46:04 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2712</guid>
		<description><![CDATA[Oggi nel canale perl ci si è chiesto come individuare stringhe arbitrarie ricorrenti in un file (ie: query SQL in un file php).
La risposta di per se sarebbe semplice: si fa una regex che inizia con SELECT e finisce con qualcosa (ie:   e si è a cavallo.
Il grado di difficoltà però aumenta se [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi nel canale perl ci si è chiesto come individuare stringhe arbitrarie ricorrenti in un file (ie: query SQL in un file php).<br />
La risposta di per se sarebbe semplice: si fa una regex che inizia con SELECT e finisce con qualcosa (ie: <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  e si è a cavallo.<br />
Il grado di difficoltà però aumenta se le stringhe sono su più righe&#8230;</p>
<p>Avendo trovato una soluzione che non richiede nemmeno un ciclo, la scrivo poichè ne sono orgoglioso e mi è valsa un <strong>++</strong>. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1">#!/usr/bin/perl -w</span><br />
<span class="kw2">use</span> strict;<br />
<span class="kw2">use</span> File::<span class="me2">Slurp</span>;<br />
<span class="kw1">my</span> <span class="re0">$text</span> = read_file<span class="br0">&#40;</span><span class="st0">&#8216;file.php&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">@queries</span> = <span class="re0">$text</span> =~ /<span class="br0">&#40;</span><span class="st0">&quot;SELECT.*?&quot;</span><span class="br0">&#41;</span>;/msg</div>
</div>
<p>Ogni valore di @queries conterrà uno dei SELECT nel file, siano essi su più righe o meno.</p>
<p>Più breve di così&#8230;</p>
<p>Segnalo anche un paio di letture sulle regex che potrebbero venire comode per capire i modificatori /m e /s, che si usano pochino.<br />
Regexp Power by Simon Cozens (<a href="http://www.perl.com/pub/a/2003/06/06/regexps.html">1</a> e <a href="http://www.perl.com/pub/a/2003/07/01/regexps.html">2</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/02/25/recuperare-stringhe-in-un-file/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conversione rapida</title>
		<link>http://www.simotrone.it/2010/02/16/conversione-rapida/</link>
		<comments>http://www.simotrone.it/2010/02/16/conversione-rapida/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 06:56:04 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[conversione]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[tabelle]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2675</guid>
		<description><![CDATA[Dovevo trasferire rapidamente i dati da una singola tabella in un db MySQL a quattro distinte &#8211; in modo da normalizzare un po&#8217; i dati.
Con perl e DBI la cosa viene facile.

#!/usr/bin/perl
use strict;
use DBI;
&#91;&#8230;&#93;
my $dsn = &#34;dbi:mysql:database=$db_name&#34;;
my $dbh = DBI-&#62;connect&#40; $dsn, $username, $password &#41; or die $DBI::errstr;
my $sth = $dbh-&#62;prepare&#40;
&#160; &#160; &#8216;SELECT name, surname, birth, [...]]]></description>
			<content:encoded><![CDATA[<p>Dovevo trasferire rapidamente i dati da una singola tabella in un db MySQL a quattro distinte &#8211; in modo da <a href="http://en.wikipedia.org/wiki/Database_normalization">normalizzare</a> un po&#8217; i dati.</p>
<p>Con perl e DBI la cosa viene facile.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1">#!/usr/bin/perl</span></p>
<p><span class="kw2">use</span> strict;<br />
<span class="kw2">use</span> DBI;<br />
<span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span><br />
<span class="kw1">my</span> <span class="re0">$dsn</span> = <span class="st0">&quot;dbi:mysql:database=$db_name&quot;</span>;<br />
<span class="kw1">my</span> <span class="re0">$dbh</span> = DBI-&gt;<span class="me1">connect</span><span class="br0">&#40;</span> <span class="re0">$dsn</span>, <span class="re0">$username</span>, <span class="re0">$password</span> <span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="re0">$DBI</span>::<span class="me2">errstr</span>;</p>
<p><span class="kw1">my</span> <span class="re0">$sth</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">&#8216;SELECT name, surname, birth, address, cap, city, country, phone, email, notes FROM rubrica&#8217;</span><br />
<span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="re0">$dbh</span>-&gt;<span class="me1">errstr</span>;<br />
<span class="re0">$sth</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p><span class="kw1">my</span> <span class="re0">$ins0</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">&#8216;INSERT INTO persone (nome,cognome) VALUES (?,?)&#8217;</span><br />
<span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="re0">$dbh</span>-&gt;<span class="me1">errstr</span>;<br />
<span class="kw1">my</span> <span class="re0">$ins1</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">&#8216;INSERT INTO indirizzi (id,via,cap,citta,paese) VALUES (?,?,?,?,?)&#8217;</span><br />
<span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="re0">$dbh</span>-&gt;<span class="me1">errstr</span>;<br />
<span class="br0">&#91;</span>&#8230; ecc, seguono altri statement insert &#8230;<span class="br0">&#93;</span></p>
<p><span class="kw1">while</span> <span class="br0">&#40;</span> <span class="kw1">my</span> <span class="re0">$row</span> = <span class="re0">$sth</span>-&gt;<span class="me1">fetchrow_hashref</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$ins0</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span> <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>name<span class="br0">&#125;</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>surname<span class="br0">&#125;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$rv</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">last_insert_id</span><span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/undef.html"><span class="kw3">undef</span></a>, <a href="http://perldoc.perl.org/functions/undef.html"><span class="kw3">undef</span></a>, <span class="st0">&#8216;persone&#8217;</span>, <span class="st0">&#8216;id&#8217;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$ins1</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span> <span class="re0">$rv</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>address<span class="br0">&#125;</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>cap<span class="br0">&#125;</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>city<span class="br0">&#125;</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>country<span class="br0">&#125;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span><br />
&nbsp;<span class="br0">&#125;</span></div>
</div>
<p>La cosa interessante sta in quel <a href="http://search.cpan.org/~timb/DBI-1.609/DBI.pm#last_insert_id">last_insert_id</a> che raccatta l&#8217;ultimo valore auto incrementato e lo mette in uno scalare, riutilizzabile poi in altri insert per avere le foreign key allineate.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/02/16/conversione-rapida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Da data a timestamp</title>
		<link>http://www.simotrone.it/2010/01/24/da-data-a-timestamp/</link>
		<comments>http://www.simotrone.it/2010/01/24/da-data-a-timestamp/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 06:31:47 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Time::Local]]></category>
		<category><![CDATA[timestamp]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2608</guid>
		<description><![CDATA[Per convertire una data in timestamp in perl:

$ perl -MTime::Local -e &#8216;print timelocal(0,0,0,28,01,2009).&#34;\n&#34;&#8217;
1235775600

Attenzione, la data inserita è il 28 febbraio 2009, a mezzanotte.
Il modulo Time::Local fornisce funzioni che sono l&#8217;opposto di quelle built-in di perl localtime() e gmtime().
Attenzione ai mesi che vanno da 0 a 11 (gen .. dic).
]]></description>
			<content:encoded><![CDATA[<p>Per convertire una data in timestamp in perl:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">$ <span class="kw2">perl</span> -MTime::Local -e <span class="st0">&#8216;print timelocal(0,0,0,28,01,2009).&quot;<span class="es0">\n</span>&quot;&#8217;</span><br />
<span class="nu0">1235775600</span></div>
</div>
<p>Attenzione, la data inserita è il 28 febbraio 2009, a mezzanotte.</p>
<p>Il modulo <strong>Time::Local</strong> fornisce funzioni che sono l&#8217;opposto di quelle built-in di perl <strong>localtime()</strong> e <strong>gmtime()</strong>.</p>
<p>Attenzione ai mesi che vanno da 0 a 11 (gen .. dic).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/01/24/da-data-a-timestamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML::Tidy</title>
		<link>http://www.simotrone.it/2010/01/19/xmltidy/</link>
		<comments>http://www.simotrone.it/2010/01/19/xmltidy/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 06:30:30 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Tidy]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XML::Tidy]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2616</guid>
		<description><![CDATA[Mi è capitato troppe volte di trovarmi file XML assolutamente illeggibili per le mani.
Una soluzione, come al solito, arriva da CPAN: XML::Tidy! 
Ridi e scherza, questo modulino è in realtà un sacco di codice che parsa alla perfezione i file xml e li riordina ad-hoc.

simone@katrina:~$ cat xml-tidy.pl 
#!/usr/bin/perl
use strict;
use warnings;
use XML::Tidy;
my $VERSION = 0.02;
my $file_in [...]]]></description>
			<content:encoded><![CDATA[<p>Mi è capitato troppe volte di trovarmi file XML assolutamente illeggibili per le mani.<br />
Una soluzione, come al solito, arriva da CPAN: <strong>XML::Tidy</strong>! </p>
<p>Ridi e scherza, questo modulino è in realtà un sacco di codice che parsa alla perfezione i file xml e li riordina ad-hoc.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">simone<span class="re0">@katrina</span>:~$ cat xml-tidy.pl <br />
<span class="co1">#!/usr/bin/perl</span></p>
<p><span class="kw2">use</span> strict;<br />
<span class="kw2">use</span> warnings;<br />
<span class="kw2">use</span> XML::<span class="me2">Tidy</span>;</p>
<p><span class="kw1">my</span> <span class="re0">$VERSION</span> = <span class="nu0">0.02</span>;<br />
<span class="kw1">my</span> <span class="re0">$file_in</span> = <span class="re0">$ARGV</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> || <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;Usage:<span class="es0">\t</span>$0 &lt;input.xml&gt; &lt;output.xml&gt;<span class="es0">\n</span>&quot;</span>;<br />
<span class="kw1">my</span> <span class="re0">$file_out</span> = <span class="re0">$ARGV</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> || <span class="st0">&#8216;output.xml&#8217;</span>;</p>
<p><span class="kw1">my</span> <span class="re0">$tidy_obj</span> = XML::<span class="me2">Tidy</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&#8216;filename&#8217;</span> =&gt; <span class="re0">$file_in</span><span class="br0">&#41;</span>;<br />
<span class="re0">$tidy_obj</span>-&gt;<span class="me1">tidy</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="re0">$tidy_obj</span>-&gt;<span class="me1">write</span><span class="br0">&#40;</span><span class="re0">$file_out</span><span class="br0">&#41;</span>;</div>
</div>
<p>Il mio semplice script prende un file in input da cmdl e sputa fuori un output.xml &#8220;raddrizato&#8221; (2 <em>whitespace</em> di default come indentazione, se si vuole modificare bisogna dare un arogomento al metodo <strong>->tidy()</strong>).</p>
<p>Per <a href="http://search.cpan.org/~pip/XML-Tidy-1.2.54HJnFa/Tidy.pm">ulteriori info</a>.</p>
<p>Nota: La libreria perl sta anche in un pacchetto debian (libxml-tidy-perl) che guarda caso fornisce uno scriptino (/usr/bin/xmltidy) molto simile (quasi identico) al mio. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/01/19/xmltidy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DBIx::Class e Schema::Loader</title>
		<link>http://www.simotrone.it/2010/01/11/dbixclass-e-schemaloader/</link>
		<comments>http://www.simotrone.it/2010/01/11/dbixclass-e-schemaloader/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 06:29:00 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[DBIx::Class]]></category>
		<category><![CDATA[DBIx::Class::Schema::Loader]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2614</guid>
		<description><![CDATA[A forza di spaccarsi la testa sulle cose, ogni tanto se ne esce.
Avendo un database su PostgreSQL, e volendo manipolarlo con strumenti ORM in perl si può usare DBIx::Class (DBIC per gli amici).
DBIC si appoggia a &#8220;schemi&#8221; di tabelle nel database che gli permettono di interagire col db-server in maniera corretta (e ottimizzata).
Gli schemi sono [...]]]></description>
			<content:encoded><![CDATA[<p>A forza di spaccarsi la testa sulle cose, ogni tanto se ne esce.<br />
Avendo un database su PostgreSQL, e volendo manipolarlo con strumenti <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> in perl si può usare <a href="http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual/Intro.pod">DBIx::Class</a> (DBIC per gli amici).</p>
<p>DBIC si appoggia a &#8220;schemi&#8221; di tabelle nel database che gli permettono di interagire col db-server in maniera corretta (e ottimizzata).<br />
Gli schemi sono un po&#8217; pallosi da estrarre, ma a tutto c&#8217;è soluzione:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">$ <span class="kw2">perl</span> -MDBIx::Class::Schema::<span class="re2">Loader=</span>make_schema_at,dump_to_dir:. -e <span class="st0">&#8216;make_schema_at(&quot;Sim::Prova&quot;, {debug=&gt;1}, [ &quot;dbi:Pg:dbname=XXX&quot;,&quot;YYY_user&quot;,&quot;ZZZ_passwd&quot; ])&#8217;</span></div>
</div>
<p>Dopo questo comando nella directory Sim ci sarà un pacchetto Prova.pm (lo schema) che caricherà le classi che rappresentano le tabelle del database XXX (nella dir Sim/Prova/tabella_*.pm).</p>
<p>Le rappresentazioni delle tabelle sono interessanti da guardare. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Da questo momento sarà possibile scrivere script che usino lo schema (<strong>Sim::Prova</strong>), si connettano attraverso di esso (metodo <strong>connect</strong>) ed agiscano sui dati del database XXX.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1">#!/usr/bin/perl</span><br />
<span class="kw2">use</span> Sim::<span class="me2">Prova</span>;<br />
<span class="kw1">my</span> <span class="re0">$schema</span> = Sim::<span class="me2">Prova</span>-&gt;<span class="me1">connect</span><span class="br0">&#40;</span><span class="st0">&#8216;dbi:Pg:dbname=XXX&#8217;</span>, <span class="st0">&#8216;YYY_user&#8217;</span>, <span class="st0">&#8216;ZZZ_passwd&#8217;</span>, <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</p>
<p><span class="kw1">my</span> <span class="re0">@all_authors</span> = <span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&#8216;Authors&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">all</span>;<br />
<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">@all_authors</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">$_</span>-&gt;<span class="me1">name</span> .<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
<span class="br0">&#125;</span></div>
</div>
<p>L&#8217;oggetto <strong>$schema</strong> porta la connessione, tramite <strong>->resultset(&#8216;table&#8217;)</strong> capisce com&#8217;è organizzata la tabella nel db e poi accetta i metodi utili per fare qualcosa (CRUD: Create, Retrieve, Update, Delete).</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1"># C</span><br />
<span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&#8216;tabella&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">create</span><span class="br0">&#40;</span> <span class="br0">&#123;</span>id =&gt; <span class="nu0">1</span>, name =&gt; <span class="st0">&#8216;Simone&#8217;</span><span class="br0">&#125;</span> <span class="br0">&#41;</span>;</p>
<p><span class="co1"># R</span><br />
<span class="kw1">my</span> <span class="re0">@rows</span> = <span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&#8216;tabella&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">all</span>;<br />
<span class="kw1">foreach</span> <span class="re0">$row</span> <span class="br0">&#40;</span><span class="re0">@rows</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">$_</span>-&gt;<span class="me1">id</span> .<span class="st0">&quot; | &quot;</span>. <span class="re0">$_</span>-&gt;<span class="me1">name</span> .<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
<span class="br0">&#125;</span> </p>
<p><span class="co1"># U</span><br />
<span class="kw1">my</span> <span class="re0">$author</span> = <span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&#8216;tabella&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;<br />
<span class="co1"># dentro $author c&#8217;è il nostro record.</span><br />
<span class="re0">$author</span>-&gt;<span class="me1">name</span><span class="br0">&#40;</span><span class="st0">&#8216;Mario Rossi&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="co1"># rimpiazza l&#8217;attributo &quot;name&quot; di $author con qualcosa di diverso.</span><br />
<span class="co1"># A questo punto il database ha ancora il record non cambiato, ma</span><br />
<span class="co1"># $author contiene un record differente.</span><br />
<span class="re0">$author</span>-&gt;<span class="me1">update</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="co1"># così aggiorno i dati sul db.</span></p>
<p><span class="co1"># D</span><br />
<span class="co1"># Come update, si identifica il record giusto e&#8230;</span><br />
<span class="re0">$author</span>-&gt;<span class="me1">delete</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</div>
<p>Un po&#8217; di <a href="http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual/Intro.pod#Basic_usage"><em>basic usage</em></a> e di <a href="http://search.cpan.org/~frew/DBIx-Class-0.08115/lib/DBIx/Class/Manual/DocMap.pod">manualistica</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/01/11/dbixclass-e-schemaloader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Database drivers</title>
		<link>http://www.simotrone.it/2009/12/03/database-drivers/</link>
		<comments>http://www.simotrone.it/2009/12/03/database-drivers/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 06:31:22 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[DBI]]></category>
		<category><![CDATA[drivers]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2494</guid>
		<description><![CDATA[E&#8217; un periodo in cui sto lavorando molto con perl e database differenti.
Ho già parlato del modulo DBI, e di quanto esso mi gusti.
Se per caso servisse sapere quali driver DBI mette a disposizione, ecco l&#8217;elenco dei database a cui è possibile collegarsi.  

sim@idrogeno:~$ perl -MDBI -e &#8216;@drivers = DBI-&#62;available_drivers; map { print &#34;$_\n&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>E&#8217; un periodo in cui sto lavorando molto con perl e database differenti.<br />
Ho già parlato del modulo <a href="http://www.simotrone.it/?s=DBI">DBI</a>, e di quanto esso mi gusti.</p>
<p>Se per caso servisse sapere quali driver DBI mette a disposizione, ecco l&#8217;elenco dei database a cui è possibile collegarsi. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim<span class="re0">@idrogeno</span>:~$ perl -MDBI -e <span class="st0">&#8216;@drivers = DBI-&gt;available_drivers; map { print &quot;$_\n&quot; } @drivers&#8217;</span><br />
AnyData<br />
CSV<br />
DBM<br />
ExampleP<br />
File<br />
Gofer<br />
Pg<br />
Proxy<br />
SQLite<br />
Sponge<br />
mysql</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/12/03/database-drivers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl hash sorting</title>
		<link>http://www.simotrone.it/2009/12/01/perl-hash-sorting/</link>
		<comments>http://www.simotrone.it/2009/12/01/perl-hash-sorting/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 06:48:40 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[ordine]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[splice]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2445</guid>
		<description><![CDATA[Come si sa (almeno per chi programma in perl), gli hash non hanno un ordine proprio, ma gestiscono solo le coppie chiave-valore.
Di recente ho dovuto inserire in un hash un elenco di chiavi (stringhe) con un conteggio come valore (interi), in pratica una tipica classifica estratta con un while parsando file di testo con una [...]]]></description>
			<content:encoded><![CDATA[<p>Come si sa (almeno per chi programma in perl), gli hash non hanno un ordine proprio, ma gestiscono solo le coppie chiave-valore.</p>
<p>Di recente ho dovuto inserire in un hash un elenco di chiavi (stringhe) con un conteggio come valore (interi), in pratica una tipica classifica estratta con un while parsando file di testo con una regex.<br />
L&#8217;input dei dati è quello tipico:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">my</span> <span class="re0">%hash</span>;<br />
<span class="kw1">while</span><span class="br0">&#40;</span>&lt;&gt;<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$parsato</span> = /^regex$/;<br />
&nbsp; &nbsp; <span class="co1"># &#8230;</span><br />
&nbsp; &nbsp; <span class="re0">$hash</span><span class="br0">&#123;</span><span class="re0">$parsato</span><span class="br0">&#125;</span>++;<br />
<span class="br0">&#125;</span></div>
</div>
<p>per ritrovarci con un hash che contiene chiavi (il testo regex&#8217;ato) e valori (numerici).<br />
Per riordinarli ho deciso di estrarre un elenco di chiavi secondo un certo criterio (i valori numerici dal più alto al più basso), e poi tagliare i primi X valori che mi interessavano.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1"># Estraggo una lista di chiavi ordinate per valori in modo inverso</span><br />
<span class="kw1">my</span> <span class="re0">@chiavi</span> = <a href="http://perldoc.perl.org/functions/sort.html"><span class="kw3">sort</span></a> <span class="br0">&#123;</span> <span class="re0">$hash</span><span class="br0">&#123;</span><span class="re0">$b</span><span class="br0">&#125;</span> &lt;=&gt; <span class="re0">$hash</span><span class="br0">&#123;</span><span class="re0">$a</span><span class="br0">&#125;</span> <span class="br0">&#125;</span> <a href="http://perldoc.perl.org/functions/keys.html"><span class="kw3">keys</span></a> <span class="re0">%hash</span>;<br />
<span class="co1"># taglio i valori oltre l&#8217;$OFFSET dall&#8217;array</span><br />
<a href="http://perldoc.perl.org/functions/splice.html"><span class="kw3">splice</span></a> <span class="re0">@chiavi</span>,<span class="re0">$OFFSET</span>;<br />
<span class="co1"># mostro le mie $OFFSET chiavi con rispettivi valori</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">@chiavi</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;$hash{$_} : $_ <span class="es0">\n</span>&quot;</span>;<br />
<span class="br0">&#125;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/12/01/perl-hash-sorting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CalendarMonth.pm</title>
		<link>http://www.simotrone.it/2009/11/17/calendarmonth-pm/</link>
		<comments>http://www.simotrone.it/2009/11/17/calendarmonth-pm/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 06:11:27 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2392</guid>
		<description><![CDATA[Guardicchiando per un progetto mi sono imbattuto in HTML::CalendarMonth, un modulo perl interessante per la generazione di calendarietti in html.
Il tutto si basa sui moduli HTML::Element che creano degli oggetti per la gestione dei singoli elementi della pagina html. Segue un esempio particolarmente brutto, ma utile ai fini di capire la logica.
Il punto della questione [...]]]></description>
			<content:encoded><![CDATA[<p>Guardicchiando per un progetto mi sono imbattuto in <strong>HTML::CalendarMonth</strong>, un modulo perl interessante per la generazione di calendarietti in html.</p>
<p>Il tutto si basa sui moduli <strong>HTML::Element</strong> che creano degli oggetti per la gestione dei singoli elementi della pagina html. Segue un esempio particolarmente brutto, ma utile ai fini di capire la logica.<br />
Il punto della questione è definire gli elementi HTML con l&#8217;apposito costruttore new(&#8216;tag&#8217;, eventuale_attributo =&gt; &#8216;come hash&#8217;); gli elementi possono poi essere gestiti con una struttura <em>parent-child</em> attraverso il metodo <strong>push_content</strong> che ordina in un array gli elementi che lo compongono.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">use</span> HTML::<span class="me2">Element</span>;</p>
<p><span class="co1"># HTML::Element crea oggetti con nomi/tag e attributi.</span><br />
<span class="kw1">my</span> <span class="re0">$html</span> &nbsp;= HTML::<span class="me2">Element</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&#8216;html&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">$head</span> &nbsp;= HTML::<span class="me2">Element</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&#8216;head&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">$title</span> = HTML::<span class="me2">Element</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&#8216;title&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp;<span class="re0">$title</span>-&gt;<span class="me1">push_content</span><span class="br0">&#40;</span><span class="st0">&#8216;Titolo della pagina&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">$body</span> &nbsp;= HTML::<span class="me2">Element</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&#8216;body&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">$h1</span> &nbsp; &nbsp;= HTML::<span class="me2">Element</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&#8216;h1&#8242;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp;<span class="re0">$h1</span>-&gt;<span class="me1">push_content</span><span class="br0">&#40;</span><span class="st0">&#8216;Header nel body&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">$hlink</span> = HTML::<span class="me2">Element</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&#8216;a&#8217;</span>, href =&gt; <span class="st0">&#8216;http://www.simotrone.it&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp;<span class="re0">$hlink</span>-&gt;<span class="me1">push_content</span><span class="br0">&#40;</span><span class="st0">&#8216;il mio sito&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">$p</span> &nbsp; &nbsp; = HTML::<span class="me2">Element</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&#8216;p&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp;<span class="re0">$p</span>-&gt;<span class="me1">push_content</span><span class="br0">&#40;</span><span class="st0">&#8216;Questo paragrafo ha un link: &#8216;</span>, <span class="re0">$hlink</span>, <span class="st0">&#8216;.&#8217;</span><span class="br0">&#41;</span>;</p>
<p><span class="re0">$head</span>-&gt;<span class="me1">push_content</span><span class="br0">&#40;</span><span class="re0">$title</span><span class="br0">&#41;</span>;<br />
<span class="re0">$body</span>-&gt;<span class="me1">push_content</span><span class="br0">&#40;</span><span class="re0">$h1</span>, <span class="re0">$p</span><span class="br0">&#41;</span>;</p>
<p><span class="re0">$html</span>-&gt;<span class="me1">push_content</span><span class="br0">&#40;</span><span class="re0">$head</span>, <span class="re0">$body</span><span class="br0">&#41;</span>;</p>
<p><a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">$html</span>-&gt;<span class="me1">as_HTML</span>;</div>
</div>
<p>Per ottenere:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="sc2"><a href="http://december.com/html/4/element/html.html"><span class="kw2">&lt;html&gt;</span></a></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><a href="http://december.com/html/4/element/head.html"><span class="kw2">&lt;head&gt;</span></a></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><a href="http://december.com/html/4/element/title.html"><span class="kw2">&lt;title&gt;</span></a></span>Titolo della pagina<span class="sc2"><span class="kw2">&lt;/title&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/head&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><a href="http://december.com/html/4/element/body.html"><span class="kw2">&lt;body&gt;</span></a></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><a href="http://december.com/html/4/element/h1.html"><span class="kw2">&lt;h1&gt;</span></a></span>Header nel body<span class="sc2"><span class="kw2">&lt;/h1&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><a href="http://december.com/html/4/element/p.html"><span class="kw2">&lt;p&gt;</span></a></span>Questo paragrafo ha un link: <span class="sc2"><a href="http://december.com/html/4/element/a.html"><span class="kw2">&lt;a</span></a> <span class="kw3">href</span>=<span class="st0">&quot;http://www.simotrone.it&quot;</span><span class="kw2">&gt;</span></span>il mio sito<span class="sc2"><span class="kw2">&lt;/a&gt;</span></span>.<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/body&gt;</span></span><br />
<span class="sc2"><span class="kw2">&lt;/html&gt;</span></span></div>
</div>
<p>Ok, fin qui sembra una pompa, 150 righe per ottenerne 5. Non molto economico.</p>
<p>Comunque il punto della questione era far vedere HTML::CalendarMonth, che sfruttando i moduli suddetti ritorna cose interessanti con poco codice. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Con queste poche righe&#8230;</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">use</span> HTML::<span class="me2">AsSubs</span>;<br />
<span class="kw2">use</span> HTML::<span class="me2">CalendarMonth</span>;</p>
<p><span class="kw1">my</span> <span class="re0">$cal</span> = HTML::<span class="me2">CalendarMonth</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span> month =&gt; <span class="nu0">10</span>, year =&gt; <span class="nu0">2009</span> <span class="br0">&#41;</span>;<br />
<span class="re0">$cal</span>-&gt;<span class="me1">item</span><span class="br0">&#40;</span><span class="re0">$cal</span>-&gt;<span class="me1">year</span>, <span class="re0">$cal</span>-&gt;<span class="me1">month</span><span class="br0">&#41;</span>-&gt;<span class="me1">attr</span><span class="br0">&#40;</span>style =&gt; <span class="st0">&#8216;background-color: wheat; font-size: 150%;&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="re0">$cal</span>-&gt;<span class="me1">col</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>-&gt;<span class="me1">attr</span><span class="br0">&#40;</span>style =&gt; <span class="st0">&#8216;font-weight: bold&#8217;</span><span class="br0">&#41;</span>;<br />
<a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">$cal</span>-&gt;<span class="me1">as_HTML</span>;</div>
</div>
<p>possiamo ottenere questo:</p>
<table bgcolor="white" border="1" cellpadding="0" cellspacing="0">
<tr align="center">
<td align="left" colspan="5" style="font-weight: bold">October</td>
<td align="center" colspan="2" style="background-color: wheat; font-size: 150%;">2009</td>
</tr>
<tr align="center">
<td align="center" style="font-weight: bold">Sun</td>
<td align="center">Mon</td>
<td align="center">Tue</td>
<td align="center">Wed</td>
<td align="center">Thu</td>
<td align="center">Fri</td>
<td align="center">Sat</td>
</tr>
<tr align="center">
<td align="center" style="font-weight: bold">&nbsp; </td>
<td align="center">&nbsp; </td>
<td align="center">&nbsp; </td>
<td align="center">&nbsp; </td>
<td align="center">1</td>
<td align="center">2</td>
<td align="center">3</td>
</tr>
<tr align="center">
<td align="center" style="font-weight: bold">4</td>
<td align="center">5</td>
<td align="center">6</td>
<td align="center">7</td>
<td align="center">8</td>
<td align="center">9</td>
<td align="center">10</td>
</tr>
<tr align="center">
<td align="center" style="font-weight: bold">11</td>
<td align="center">12</td>
<td align="center">13</td>
<td align="center">14</td>
<td align="center">15</td>
<td align="center">16</td>
<td align="center">17</td>
</tr>
<tr align="center">
<td align="center" style="font-weight: bold">18</td>
<td align="center">19</td>
<td align="center">20</td>
<td align="center">21</td>
<td align="center">22</td>
<td align="center">23</td>
<td align="center">24</td>
</tr>
<tr align="center">
<td align="center" style="font-weight: bold">25</td>
<td align="center">26</td>
<td align="center">27</td>
<td align="center">28</td>
<td align="center">29</td>
<td align="center">30</td>
<td align="center">31</td>
</tr>
</table>
<p>E con la semplice aggiunta di un ciclo for che genera i mesi e di una sub possiamo ottenere un calendario molto flessibile.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">sub</span> mensile <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$mm</span>,<span class="re0">$yyyy</span><span class="br0">&#41;</span> = <span class="re0">@_</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$cal</span> = HTML::<span class="me2">CalendarMonth</span>-&gt;<span class="me1">new</span><span class="br0">&#40;</span> month =&gt; <span class="re0">$mm</span>, year =&gt; <span class="re0">$yyyy</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$cal</span>-&gt;<span class="me1">item</span><span class="br0">&#40;</span><span class="re0">$cal</span>-&gt;<span class="me1">year</span>, <span class="re0">$cal</span>-&gt;<span class="me1">month</span><span class="br0">&#41;</span>-&gt;<span class="me1">attr</span><span class="br0">&#40;</span>style =&gt; <span class="st0">&#8216;background-color: wheat; font-size: 150%;&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$cal</span>-&gt;<span class="me1">col</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>-&gt;<span class="me1">attr</span><span class="br0">&#40;</span>style =&gt; <span class="st0">&#8216;font-weight: bold&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">$cal</span>-&gt;<span class="me1">as_HTML</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw1">for</span> <span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mensile<span class="br0">&#40;</span><span class="re0">$_</span>,<span class="nu0">1979</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
</div>
<p>Su Debian i pacchetti sono questi qua:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">idrogeno:~<span class="re3"># dpkg -l libhtml-calendarmonth-<span class="kw2">perl</span> libhtml-element-extended-<span class="kw2">perl</span> libhtml-tableextract-perl</span><br />
<span class="re2">Desired=</span>Unknown/Install/Remove/Purge/Hold<br />
| <span class="re2">Status=</span>Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend<br />
|/ Err?=<span class="br0">&#40;</span>none<span class="br0">&#41;</span>/Reinst-required <span class="br0">&#40;</span>Status,Err: <span class="re2">uppercase=</span>bad<span class="br0">&#41;</span><br />
||/ Name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Version &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Description<br />
+++-=================-=================-=======================<br />
ii &nbsp;libhtml-calendarm <span class="nu0">1.19</span><span class="nu0">-1</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generate and manipulate <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; calandar months <span class="kw1">in</span> HTML<br />
ii &nbsp;libhtml-element-e <span class="nu0">1.17</span><span class="nu0">-3</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;extended HTML::Element<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; classes<br />
ii &nbsp;libhtml-tableextr <span class="nu0">2.10</span><span class="nu0">-3</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;module <span class="kw1">for</span> extracting <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the content contained <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">in</span> tab</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/11/17/calendarmonth-pm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian e CPAN</title>
		<link>http://www.simotrone.it/2009/11/10/debian-e-cpan/</link>
		<comments>http://www.simotrone.it/2009/11/10/debian-e-cpan/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 06:30:51 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[Catalyst]]></category>
		<category><![CDATA[Catalyst::Restarter]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2370</guid>
		<description><![CDATA[CPAN è l&#8217;archivio online di tutta la robaccia che i vari perlisti si inventano. C&#8217;è bisogno di qualche modulo per puffare qualcosa di puffoso? Vallo a cercare su CPAN!
cpan è anche un programma che permette di interagire via linea di comando con l&#8217;archivio online di CPAN per scaricare e gestire i moduli perl che potrebbero [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cpan.org/">CPAN</a> è l&#8217;archivio online di tutta la robaccia che i vari perlisti si inventano. C&#8217;è bisogno di qualche modulo per <em>puffare</em> qualcosa di <em>puffoso</em>? <a href="http://search.cpan.org/">Vallo a cercare</a> su CPAN!</p>
<p><strong>cpan</strong> è anche un programma che permette di interagire via linea di comando con l&#8217;archivio online di CPAN per scaricare e gestire i moduli perl che potrebbero risultare utili. Nel caso ce ne sia bisogno, si puo&#8217; lanciare con un:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="re3"># cpan</span></div>
</div>
<p>o (in maniera più perlica, poichè CPAN è infine anche un modulo)</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="re3"># <span class="kw2">perl</span> -MCPAN -e </span><span class="st0">&#8217;shell&#8217;</span></div>
</div>
<p><strong>cpan</strong> ha un file di configurazione che indica dove  e come agire quando si scaricano i moduli. Queste informazioni (che di solito stanno in un qualcosa di simile a CPAN/Config.pm) su debian sono nel file <strong>/etc/perl/CPAN/Config.pm</strong>; la configurazione è un semplice hash gestibile dalla shell di cpan con il comando <strong>&gt; o conf</strong>.</p>
<p>Ovviamente, come per tutti i linguaggi, i file-librerie (moduli) che si usano per &#8220;aggiornare&#8221; il perl vanno messi in percorsi specifici che in questo caso sono dentro l&#8217;array @INC; lanciando un programma perl il compilatore va a cercare le lib incluse.<br />
In Debian:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1"># Directory per lib perl in Debian</span></p>
<p>perl -e <span class="st0">&#8216;for (@INC) { if (-d $_) { print &quot;esiste &nbsp; &nbsp;: $_&quot;; } else { print &quot;non esiste: $_&quot;}; print &quot;\n&quot; }&#8217;</span><br />
esiste &nbsp; &nbsp;: /etc/perl<br />
non esiste: /usr/<a href="http://perldoc.perl.org/functions/local.html"><span class="kw3">local</span></a>/lib/perl/<span class="nu0">5.10</span><span class="nu0">.1</span><br />
non esiste: /usr/<a href="http://perldoc.perl.org/functions/local.html"><span class="kw3">local</span></a>/share/perl/<span class="nu0">5.10</span><span class="nu0">.1</span><br />
esiste &nbsp; &nbsp;: /usr/lib/perl5<br />
esiste &nbsp; &nbsp;: /usr/share/perl5<br />
esiste &nbsp; &nbsp;: /usr/lib/perl/<span class="nu0">5.10</span> &nbsp; <span class="co1">#link a 5.10.1</span><br />
esiste &nbsp; &nbsp;: /usr/share/perl/<span class="nu0">5.10</span> <span class="co1">#link a 5.10.1</span><br />
non esiste: /usr/<a href="http://perldoc.perl.org/functions/local.html"><span class="kw3">local</span></a>/lib/site_perl<br />
esiste &nbsp; &nbsp;: .</div>
</div>
<p>Ohibò.<br />
Gli <strong>/usr/local</strong> non esistono. WTF?</p>
<p>Di recente (settembre mi pare) perl è passato alla versione 5.10.1, e mentre Debian si è aggiornata serenamente in modalità semi-automatica, la parte /usr/local/ che viene gestita attraverso il modulo CPAN non e&#8217; stata upgradata (son fesso, <em>I know</em>).</p>
<p>Dovendo cercare un modulo perl e auspicando che più controlli siano meglio, tanto vale affidarsi ai manutentori di Debian &#8211; cpan potrebbe essere più esotico e volatile; come sistemisti avere una base più solida può essere ritenuto generalmente migliore, anche se si rimane indietro di un paio di sottoversioni della lib voluta.<br />
<strong>apt</strong> di norma ha tutti i pacchetti che si potrebbero volere, <u>basta trovarli</u>, e li si può a ragione ritenere stabili.<br />
Le ricerche sui pacchetti di Debian possono essere completate <a href="http://www.debian.org/distrib/packages">nei due form a questa pagina</a>; il <a href="http://www.debian.org/distrib/packages#search_contents">secondo</a> ricerca esattamente i pacchetti che contengono il file nominato, il che puo&#8217; essere utile quando si ricerca un modulo specifico visto su CPAN.<br />
(Es: <a href="http://packages.debian.org/search?searchon=contents&#038;keywords=Restarter.pm&#038;mode=exactfilename&#038;suite=unstable&#038;arch=any">Ricercando il modulo Restarter.pm si ottiene questo</a>.)</p>
<hr/>
<p>Nota: le installazioni di cpan dipendono dal Makefile del modulo (vedere qui: <strong>/root/.cpan/build/</strong> ), mentre quelle di Debian dai pacchetti (<strong># dpkg -L nome_pacchetto</strong>).</p>
<p>Nota2: Se si è su Slackware o Gentoo, probabilmente tutte le lib perl stanno in un percorso sotto /usr/lib/perl divise per versione, site_perl e vendor_perl a seconda di come sono state installate.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/11/10/debian-e-cpan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
