<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10germanfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">
    <title>Perl HowTo</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/" />
    
    <id>tag:perl-howto.de,2008-04-29://1</id>
    <updated>2012-03-28T20:14:54Z</updated>
    <subtitle>Getting Things Done with Perl. Tipps, Tricks und Anleitungen. </subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.38</generator>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/PerlHowto" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="perlhowto" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/content?lg=de&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://us.i1.yimg.com/us.yimg.com/i/de/my/addtomyyahoo4.gif">Subscribe with Mein Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/PerlHowto" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FPerlHowto" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><entry>
    <title>Net::NTP - Antwortpakete eines NTP-Servers einfach dekodieren</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2012/03/netntp-antwortpakete-eines-ntpservers-einfach-dekodieren.html" />
    <id>tag:perl-howto.de,2012://1.227</id>

    <published>2012-03-22T19:15:00Z</published>
    <updated>2012-03-28T20:14:54Z</updated>

    <summary><![CDATA[ "Das Network Time Protocol (NTP) ist ein Standard zur Synchronisierung von Uhren in Computersystemen &uuml;ber paketbasierte Kommunikationsnetze. NTP verwendet das verbindungslose Transportprotokoll UDP. NTP wurde speziell entwickelt, um eine zuverl&auml;ssige Zeitgabe &uuml;ber Netzwerke mit variabler Paketlaufzeit zu erm&ouml;glichen." Quelle:...]]></summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="Net" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sysadmin" label="sysadmin" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
"Das &lt;a href="http://de.wikipedia.org/wiki/Network_Time_Protocol"&gt;Network Time Protocol&lt;/a&gt; (NTP) ist ein Standard zur Synchronisierung von Uhren in Computersystemen &amp;uuml;ber paketbasierte Kommunikationsnetze. NTP verwendet das verbindungslose Transportprotokoll &lt;a href="http://de.wikipedia.org/wiki/User_Datagram_Protocol"&gt;UDP&lt;/a&gt;. NTP wurde speziell entwickelt, um eine zuverl&amp;auml;ssige Zeitgabe &amp;uuml;ber Netzwerke mit variabler Paketlaufzeit zu erm&amp;ouml;glichen." &lt;small&gt;Quelle: &lt;a href="http://de.wikipedia.org/wiki/Network_Time_Protocol"&gt;Wikipedia: Network Time Protocol&lt;/a&gt;&lt;/small&gt;.
&lt;/p&gt;
&lt;p&gt;
NTP-Server versenden Antworten im &lt;a href="http://www.faqs.org/rfcs/rfc2030.html"&gt;NTP Message Format&lt;/a&gt;, die sich mit
&lt;a href="http://search.cpan.org/perldoc?Net::NTP"&gt;Net::NTP - Perl extension for decoding NTP server responses&lt;/a&gt; von &lt;a href="http://search.cpan.org/~abh/"&gt;Ask Bj&amp;oslash;rn Hansen&lt;/a&gt; einfach dekodieren lassen.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;


&lt;h2&gt;Beispiel:&lt;/h2&gt;
&lt;p&gt;
Net::NTP exportiert eine einzige Funktion, &lt;i&gt;get_ntp_response()&lt;/i&gt;, die als optionalen Parameter auch die Adresse eines NTP-Server annimmt und liefert einen Hash zur&amp;uuml;ck, dessen Schl&amp;uuml;ssel die einzelnen Abschnitte des NTP Antwort Pakets enth&amp;auml;lt.
&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/perl
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;Net::NTP&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;qw(get_ntp_response)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$ntp_server&lt;/span&gt; = &lt;span style="color: #8B008B; font-weight:bold;"&gt;shift&lt;/span&gt; ||  &lt;span style="color: #CD5555;"&gt;&amp;#39;ptbtime1.ptb.de&amp;#39;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;%response&lt;/span&gt; = &lt;span style="color: #00688B;"&gt;get_ntp_response&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$ntp_server&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@response_keys&lt;/span&gt; = &lt;span style="color: #8B008B; font-weight:bold;"&gt;sort&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;keys&lt;/span&gt; &lt;span style="color: #00688B;"&gt;%response&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;foreach&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$response_key&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@response_keys&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
	&lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;$response_key: $response{ $response_key }\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Das Programm liefert folgende Ausgabe:
&lt;/p&gt;
&lt;pre&gt;
Leap Indicator: 0
Mode: 4
Originate Timestamp: 1332443226.50195
Poll Interval: 0.0000
Precision: -21
Receive Timestamp: 1332443226.90883
Reference Clock Identifier: PTB
Reference Timestamp: 1332443217.35515
Root Delay: 0
Root Dispersion: 0.0000
Stratum: 1
Transmit Timestamp: 1332443226.90883
Version Number: 3
&lt;/pre&gt;
&lt;p&gt;
Die Schl&amp;uuml;ssel des &lt;span style="color: #00688B;"&gt;%response&lt;/span&gt; ensprechen den einzelnen Feldern des NTP Antwortpakets:
&lt;/p&gt;
&lt;pre&gt;
                           1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |LI | VN  |Mode |    Stratum    |     Poll      |   Precision   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          Root Delay                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                       Root Dispersion                         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Reference Identifier                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      |                   Reference Timestamp (64)                    |
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      |                   Originate Timestamp (64)                    |
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      |                    Receive Timestamp (64)                     |
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      |                    Transmit Timestamp (64)                    |
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                 Key Identifier (optional) (32)                |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      |                                                               |
      |                 Message Digest (optional) (128)               |
      |                                                               |
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
&lt;/pre&gt;
&lt;p&gt;
&lt;small&gt;Quelle:&lt;a href="http://www.faqs.org/rfcs/rfc2030.html"&gt; RFC 2030&lt;/a&gt;&lt;/small&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;


&lt;h2&gt;Siehe auch&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CPAN: &lt;a href="http://search.cpan.org/perldoc?Net::NTP"&gt;Net::NTP - Perl extension for decoding NTP server responses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CPAN: &lt;a href="http://search.cpan.org/perldoc?POE::Component::Client::NTP"&gt;POE::Component::Client::NTP - A POE Component to query NTP servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ntp.org/"&gt;NTP: The Network Time Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ptb.de/de/org/q/q4/q42/_ntp_main.htm"&gt;PTB: Zeitsynchronisation von Rechnern mit Hilfe des "Network Time Protocol" (NTP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pool.ntp.org/zone/de"&gt;Germany - de.pool.ntp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.faqs.org/rfcs/rfc1305.html"&gt;RFC 1305&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.faqs.org/rfcs/rfc2030.html"&gt;RFC 2030&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wikipedia: &lt;a href="http://de.wikipedia.org/wiki/Zeitserver"&gt;Zeitserver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wikipedia: &lt;a href="http://de.wikipedia.org/wiki/Network_Time_Protocol"&gt;Network Time Protocol&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/p9UyorvNfS4" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Perl Advent(ures) 2011</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/12/perl-adventures-2011.html" />
    <id>tag:perl-howto.de,2011://1.226</id>

    <published>2011-12-01T17:15:00Z</published>
    <updated>2011-12-01T19:40:37Z</updated>

    <summary> Es ist wieder so weit - Perl Adventskalender 2011 sind online: Dancer Advent Calendar - the Dancer web framework's calendar Perl Advent Calendar (perladvent.org) Catalyst Advent Calendar - the Catalyst web framework's calendar Perl6 Advent Calendar Via: PreshBlog: Perl...</summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="101" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="catalyst" label="catalyst" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dancer" label="dancer" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl6" label="perl6" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
Es ist wieder so weit - Perl Adventskalender 2011 sind online: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://advent.perldancer.org/"&gt;Dancer Advent Calendar - the Dancer web framework's calendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perladvent.org/2011/"&gt;Perl Advent Calendar (perladvent.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.catalystframework.org/calendar"&gt;Catalyst Advent Calendar - the Catalyst web framework's calendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl6advent.wordpress.com/"&gt;Perl6 Advent Calendar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Via:&lt;/h2&gt;

&lt;p&gt;
PreshBlog:  &lt;a href="http://www.preshweb.co.uk/2011/12/perl-advent-calendars-for-2011/"&gt;Perl Advent Calendars for 2011&lt;/a&gt;
&lt;/p&gt;
        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/EbwlwKuFNiQ" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Perl in the Cloud - OpenShift Express by Red Hat - Installation, Initialisierung und Konfiguration</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/11/perl-in-the-cloud-openshift-express-by-red-hat-installation-initialisierung-und-konfiguration.html" />
    <id>tag:perl-howto.de,2011://1.225</id>

    <published>2011-11-24T11:22:45Z</published>
    <updated>2011-11-26T18:56:08Z</updated>

    <summary><![CDATA[ OpenShift by Red Hat soll die Entwicklung von Open-Source-Anwendungen f&uuml;r die Cloud vereinfachen. Dieser Plattform-as-a-Service stellt eine Infrastruktur f&uuml;r verschiedene Programmiersprachen und Web-Frameworks zur Verf&uuml;gung. Red Hat unterscheidet zwischen den Produktvarianten Express, Flex und Power. Die kostenlose Express Variante...]]></summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="Cloud" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="https://openshift.redhat.com/app/"&gt;OpenShift by Red Hat&lt;/a&gt; soll die Entwicklung von Open-Source-Anwendungen f&amp;uuml;r die Cloud vereinfachen.
 Dieser &lt;a href="http://de.wikipedia.org/wiki/Platform_as_a_Service"&gt;Plattform-as-a-Service&lt;/a&gt; stellt eine Infrastruktur f&amp;uuml;r verschiedene Programmiersprachen und Web-Frameworks zur Verf&amp;uuml;gung. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.de.redhat.com/"&gt;Red Hat&lt;/a&gt; unterscheidet zwischen den Produktvarianten &lt;a href="https://openshift.redhat.com/app/express"&gt;Express&lt;/a&gt;, &lt;a href="https://openshift.redhat.com/app/flex"&gt;Flex&lt;/a&gt; und &lt;a href="https://openshift.redhat.com/app/power"&gt;Power&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Die kostenlose Express Variante (&lt;a href="https://openshift.redhat.com/app/login"&gt;Registrierung erforderlich&lt;/a&gt;) erlaubt u.a. die Verwendung der dynamischen Programmiersprache &lt;a href="http://www.perl.org"&gt;Perl&lt;/a&gt; in Version 5.10.1, der Datenbanken &lt;a href="http://dev.mysql.com/"&gt;MySQL&lt;/a&gt; in Version 5.1 oder &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt; in Version 3 und (ganz wichtig) die Installation von &lt;a href="http://www.cpan.org/"&gt;CPAN&lt;/a&gt;-&lt;a href="http://search.cpan.org/"&gt;Modulen&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Die bekannten und beliebten Perl Web-Frameworks &lt;a href="http://perldancer.org/"&gt;Dancer&lt;/a&gt;, &lt;a href="http://mojolicio.us/"&gt;Mojolicious&lt;/a&gt; und &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt; k&amp;ouml;nnen verwendet werden.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Schritt f&amp;uuml;r Schritt&lt;/h2&gt;
&lt;p&gt;
Dieser Beitrag geht zuerst Schritt f&amp;uuml;r Schritt durch die Installation, Initialisierung und Konfiguration von OpenShift Express. Danach wird ein betont einfaches, aber n&amp;uuml;tzliches Perl-Programm erstellt und gezeigt, wie dieses in die Cloud ausgeliefert (deployed) wird. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Registrierung&lt;/h2&gt;
&lt;p&gt;
Zur Verwendung von OpenShift Express ist eine &lt;a href="https://openshift.redhat.com/app/login"&gt;Registrierung&lt;/a&gt; mit einer g&amp;uuml;ltigen E-Mail-Adresse erfoderlich. Alternativ kann auch ein bestehender &lt;a href="http://rhn.redhat.com/"&gt;RHN-Account&lt;/a&gt; verwendet werden.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Installation der Client-Tools&lt;/h2&gt;
&lt;p&gt;
OpenShift funktioniert unter &lt;a href="https://www.redhat.com/openshift/kb/kb-e1000/installing-openshift-express-client-tools-on-non-rpm-based-systems"&gt;Mac OSX, Linux und Windows&lt;/a&gt; - f&amp;uuml;r diesen Beitrag verwende ich &lt;a href="http://www.centos.org/"&gt;CentOS 6&lt;/a&gt; (64-Bit in einer eigenen virtuellen Maschine).
&lt;/p&gt;
&lt;p&gt;
F&amp;uuml;r die Client-Tools bietet RedHat eine eigenes YUM-Repository an, das &lt;a href="https://openshift.redhat.com/app/express#quickstart"&gt;wie folgt installiert&lt;/a&gt; wird.
&lt;/p&gt;
&lt;pre&gt;
# wget https://openshift.redhat.com/app/repo/openshift.repo
# mv openshift.repo /etc/yum.repos.d
&lt;/pre&gt;
&lt;p&gt;
Damit alle Paket-Abh&amp;auml;nigkeiten aufgel&amp;ouml;st werden, musste ich auch die &lt;a href="http://fedoraproject.org/wiki/EPEL"&gt;EPEL&lt;/a&gt;- und &lt;a href="http://wiki.centos.org/AdditionalResources/Repositories/RPMForge"&gt;RPMForge&lt;/a&gt;-Repositories &lt;a href="http://wiki.centos.org/AdditionalResources/Repositories"&gt;hinzuf&amp;uuml;gen&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Nun k&amp;ouml;nnen die Client-Tools installiert werden:
&lt;/p&gt;
&lt;pre&gt;
# yum install rhc
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Initialisierung&lt;/h2&gt;
&lt;p&gt;
Alle Apps eines Users werden in einen eigenen Namensraum (Domain) installiert. Apps sind dann nach dem Schema &lt;i&gt;http://$app-$domain.rhcloud.com&lt;/i&gt; &amp;ouml;ffentlich erreichbar. Dazu gleich mehr.
&lt;/p&gt;
&lt;p&gt;
Das Kommando &lt;i&gt;rhc-create-domain&lt;/i&gt; erzeugt einen neuen Namensraum, die Konfigurationsdatei &lt;i&gt;express.conf&lt;/i&gt; und &lt;a href="http://de.wikipedia.org/wiki/Secure_Shell"&gt;SSH-Schl&amp;uuml;ssel&lt;/a&gt; (&lt;i&gt;libra_id_rsa&lt;/i&gt;) zur &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;-Authentifizierung.
&lt;/p&gt;
&lt;pre&gt;
$ rhc-create-domain -n yourdomain -l user@example.com
Password: &amp;lt;user password&gt;

Generating Openshift Express ssh key to /home/UserName/.ssh/libra_id_rsa
Generating public/private RSA key pair.
Created directory '/home/UserName/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/UserName/.ssh/libra_id_rsa.
Your public key has been saved in /home/UserName/.ssh/libra_id_rsa.pub.
.
.
Contacting https://openshift.redhat.com
Adding rhlogin to /home/UserName/.openshift/express.conf
Creation successful

You may now create an application.  Please make note of your local config file
in /home/UserName/.openshift/express.conf which has been created and populated for
you.
&lt;/pre&gt;
&lt;p&gt;
Jetzt noch Git (minimal) konfigurieren
&lt;/p&gt;
&lt;pre&gt;
$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com
&lt;/pre&gt;
&lt;p&gt;
und dann kann endlich die erste App erstellt werden.
&lt;/p&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Appger&amp;uuml;st erzeugen&lt;/h2&gt;
&lt;p&gt;
Das Kommando &lt;i&gt;rhc-create-app &lt;/i&gt; erzeugt das Ger&amp;uuml;st der neuen App.  &amp;Uuml;ber die  Option &lt;i&gt;-a&lt;/i&gt; wird der Name der Applikation angegeben. Die Option &lt;i&gt;-t&lt;/i&gt; legt den Typ der Applikation, hier perl-5.10, fest. Typen werden in der &lt;a href="https://docs.redhat.com/docs/en-US/OpenShift_Express/1.0/html/User_Guide/index.html"&gt;Dokumentation&lt;/a&gt; auch gerne als &lt;i&gt;cartridge&lt;/i&gt; bezeichnet. 
&lt;/p&gt;
&lt;pre&gt;
$ rhc-create-app -a X1 -t perl-5.10 
Password: 

Attempting to create remote application space: X1
Now your new domain name is being propagated worldwide (this might take a minute)...
Pulling new repo down
Warning: Permanently added 'x1-thomasfahle.rhcloud.com,184.73.107.7' (RSA) to the list of known hosts.
Confirming application 'X1' is available
  Attempt # 1

Success!  Your application 'X1' is now published here:

      http://X1-thomasfahle.rhcloud.com/

The remote repository is located here:

    ssh://ce3eb6cc3b1942a2a61a76db6ff63274@X1-thomasfahle.rhcloud.com/~/git/X1.git/

To make changes to 'X1', commit to X1/.

Successfully created application: X1
&lt;/pre&gt;
&lt;p&gt;
Die neu erstellte Applikation mit dem Namen &lt;i&gt;X1&lt;/i&gt; innerhalb des Namensraumes &lt;i&gt;thomasfahle&lt;/i&gt; ist sofort unter der URL&lt;i&gt; http://x1-thomasfahle.rhcloud.com/&lt;/i&gt; erreichbar.
&lt;/p&gt;
&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Welcome-to-OpenShift-klein.png" src="http://perl-howto.de/assets/images/openshift/Welcome-to-OpenShift-klein.png" width="411" height="354" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;
&lt;p&gt;
Wer lieber seine eigene Domain verwenden m&amp;ouml;chte und &amp;uuml;ber einen eigenen Nameserver verf&amp;uuml;gt, kann einen &lt;a href="https://www.redhat.com/openshift/faq/i-have-deployed-my-app-but-i-don%E2%80%99t-like-telling-people-to-visit-myapp-myusernamerhcloudcom-how-c"&gt;DNS Alias einrichten&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Orientierung im Gel&amp;auml;nde&lt;/h2&gt;

&lt;p&gt;
Die neu erstellte Applikation befindet sich im Verzeichnis &lt;i&gt;$app&lt;/i&gt;, hier X1.
&lt;/p&gt;

&lt;pre&gt;
$ tree X1
X1
|-- deplist.txt
|-- libs
|-- misc
|-- perl
|   |-- health_check.pl
|   `-- index.pl
`-- README
&lt;/pre&gt;
&lt;p&gt;
Das Verzeichnis &lt;i&gt;perl&lt;/i&gt; ist die DocumentRoot der Webapp. Alle hier abgelegten Dateien sind &amp;ouml;ffentlich. Die Datei &lt;i&gt;index.pl&lt;/i&gt; dient als DirectoryIndex. 
&lt;/p&gt;
&lt;p&gt;
Die Datei &lt;i&gt;deplist.txt&lt;/i&gt; nimmt eine Liste der zu installierenden CPAN-Module auf, pro Zeile ein Modul ohne Versionsnummer.&lt;br /&gt;
&lt;a href="https://github.com/openshift/dancer-example/blob/master/deplist.txt"&gt;Beispiel&lt;/a&gt;: 
&lt;/p&gt;
&lt;pre&gt;
Test::Base
YAML
Dancer
Plack::Handler::Apache2
&lt;/pre&gt;
&lt;p&gt;
Das Verzeichnis &lt;i&gt;misc&lt;/i&gt; ist nicht &amp;ouml;ffentlich und kann f&amp;uuml;r eigene Zwecke genutzt werden.
&lt;/p&gt;
&lt;p&gt;
Das Verzeichnis &lt;i&gt;libs&lt;/i&gt; ist ebenfalls nicht &amp;ouml;ffentlich und dient als Speicherort f&amp;uuml;r eigene Module.
&lt;/p&gt;
&lt;p&gt;
Sinn und Zweck der Datei &lt;i&gt;health_check.pl&lt;/i&gt; ist mir nicht ganz klar geworden.  
&lt;/p&gt;
&lt;p&gt;
Weiterhin gibt es noch ein verstecktes Verzeichnis &lt;i&gt;.openshift&lt;/i&gt; zur Steuerung des Build-Prozesses. Dazu sp&amp;auml;ter mehr.
&lt;/p&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Das erste Programm: Umgebungsvariablen&lt;/h2&gt;
&lt;p&gt;
Einige Konfigurationseinstellungen, z.B. f&amp;uuml;r Datenbanken, sind als Umgebungsvariablen abgelegt.
&lt;/p&gt;
&lt;p&gt; Daher erstellen wir als erstes einfaches Beispiel keine Hallo-Welt-App, sondern eine n&amp;uuml;tzliche App, welche die Umgebungsvariablen anzeigt.
&lt;/p&gt;
&lt;p&gt;
Das Programm wird unter dem Namen &lt;i&gt;printenv.pl&lt;/i&gt; im Ordner &lt;i&gt;perl&lt;/i&gt; abgelegt.
&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/perl
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #228B22;"&gt;#  printenv -- demo CGI program which just prints its environment&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;Content-type: text/plain\n\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;foreach&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$key&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;sort&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;keys&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #00688B;"&gt;%ENV&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
    &lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$val&lt;/span&gt; = &lt;span style="color: #00688B;"&gt;$ENV&lt;/span&gt;{&lt;span style="color: #00688B;"&gt;$key&lt;/span&gt;}&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
    &lt;span style="color: #00688B;"&gt;$val&lt;/span&gt; =~ &lt;span style="color: #CD5555;"&gt;s|\n|\\n|g&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
    &lt;span style="color: #00688B;"&gt;$val&lt;/span&gt; =~ &lt;span style="color: #CD5555;"&gt;s|&amp;quot;|\\&amp;quot;|g&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
    &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;qq~$key = $val\n~&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;exit&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Zur Ver&amp;ouml;ffentlichung (Deployment) der App verwendet OpenShift &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;. Sobald die Datei hinzugef&amp;uuml;gt und commited wurde, kann diese per git push in die Cloud ausgeliefert werden.
&lt;/p&gt;
&lt;pre&gt;
$ git add printenv.pl
$ git commit -m 'Umgebungsvariablen App'
$ git push

Counting objects: 6, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 594 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Stopping application...
remote: Waiting for stop to finish
remote: Done
remote: Running .openshift/action_hooks/pre_build
remote: strict is up to date. (1.04)
remote: skipping F/FL/FLORA/perl-5.15.4.tar.gz
remote: Running .openshift/action_hooks/build
remote: Running .openshift/action_hooks/deploy
remote: Starting application...
remote: Done
remote: Running .openshift/action_hooks/post_deploy
To ssh://ce3eb6cc3b1942a2a61a76db6ff63274@X1-thomasfahle.rhcloud.com/~/git/X1.git/
   ee74341..e31f2ec  master -&gt; master
&lt;/pre&gt;
&lt;p&gt;
Das Programm ist nun unter der URL &lt;i&gt;http://x1-thomasfahle.rhcloud.com/printenv.pl&lt;/i&gt; erreichbar.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Hinweis:&lt;/b&gt; Alle Daten innerhalb des Git-Repositories werden dabei auf dem OpenShift Express Server zun&amp;auml;chst gel&amp;ouml;scht und dann neu eingespielt.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Hinweis:&lt;/b&gt; Da Umgebungsvariablen auch Benutzernamen und Passw&amp;ouml;rter enthalten k&amp;ouml;nnen, sollte dieses Programm &lt;b&gt;nicht&lt;/b&gt; auf dem Cloud-Server verbleiben.
&lt;/p&gt;
&lt;p&gt;
Zum Bau und zur Auslieferung der Applikation werden die Programme im Ordner &lt;i&gt;.openschift/action_hooks/&lt;/i&gt; ausgef&amp;uuml;hrt. Um sich die Umgebungsvariablen anzeigen zu lassen, gen&amp;uuml;gt es in die Datei &lt;i&gt;build&lt;/i&gt; die Anweisung &lt;i&gt;export&lt;/i&gt; einzuf&amp;uuml;gen. Dann werden die Umgebungsvariablen bei jedem push angezeigt. 
&lt;/p&gt;
&lt;pre&gt;
$ cat .openshift/action_hooks/build 
#!/bin/bash
# This is a simple build script and will be executed on your CI system if 
# available.  Otherwise it will execute while your application is stopped
# before the deploy step.  This script gets executed directly, so it
# could be python, php, ruby, etc.
export
&lt;/pre&gt;
&lt;p&gt;
Eigene Umgebungsvariablen k&amp;ouml;nnen derzeit nicht gesetzt werden.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Logfiles&lt;/h2&gt;
&lt;p&gt;
Das Kommando &lt;i&gt;rhc-tail-files&lt;/i&gt; erm&amp;ouml;glicht den Zugriff auf die Logdateien auf dem Cloud-Server. 
&lt;/p&gt;
&lt;pre&gt;
$ rhc-tail-files -a X1 
Password: 

Attempting to tail files: X1/logs/*
Use ctl + c to stop

==&gt; X1/logs/error_log-20111122-000000-EST &lt;==
[Tue Nov 22 16:43:18 2011] [notice] Apache/2.2.15 (Unix) mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations

==&gt; X1/logs/access_log-20111122-000000-EST &lt;==
xx.xxx.xxx.IP - - [22/Nov/2011:16:47:04 -0500] "GET /printenv.pl HTTP/1.0" 200 2323 "-" "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.24) Gecko/20111107 Ubuntu/10.04 (lucid) Firefox/3.6.24"
&lt;/pre&gt;
&lt;p&gt;
Der Zugriff auf die &lt;i&gt;error_log&lt;/i&gt; Dateien erleichert das Debuggen erheblich.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Snapshots&lt;/h2&gt;
&lt;p&gt;
Das Kommando &lt;i&gt;rhc-snapshot&lt;/i&gt; erstellt einen Snapshot der Applikation und liefert diesen als gezippte tar Datei zur&amp;uuml;: 
&lt;/p&gt;
&lt;pre&gt;
$ rhc-snapshot  -a X1 
Password: 

Pulling down a snapshot to X1.tar.gz

Stopping application...
Waiting for stop to finish
Done
Creating and sending tar.gz
Starting application...
Done
&lt;/pre&gt;
&lt;p&gt;
Wenn man die Datei X1.tar.gz auspackt, sieht man alle Verzeichnisse und Dateien der Applikation.
&lt;/p&gt;
&lt;pre&gt;
$ tar -xzvf X1.tar.gz
$ cd app-verzeichnis

$ tree
.
|-- git
|   `-- X1.git
|       |-- branches
|       |-- config
|       |-- description
|       |-- HEAD
|       |-- hooks
|       |   |-- applypatch-msg.sample
|       |   |-- commit-msg.sample
|       |   |-- post-commit.sample
|       |   |-- post-receive
|       |   |-- post-receive.sample
|       |   |-- post-update.sample
|       |   |-- pre-applypatch.sample
|       |   |-- pre-commit.sample
|       |   |-- prepare-commit-msg.sample
|       |   |-- pre-rebase.sample
|       |   |-- pre-receive
|       |   `-- update.sample
|       |-- info
|       |   |-- exclude
|       |   `-- refs
|       |-- objects
|       |   |-- 0a
|       |   |   `-- bed1546ab3d6aee5b42c68f57100f52949b4bf
|       |   |-- 10
|       |   |   `-- cd54466b8f66bb40d6c50ab5519bf7727e51dd
|       |   |-- 1d
|       |   |   `-- b60ffa4e6b41be6ed92a6a2b3343c70b301fb6
|       |   |-- 2f
|       |   |   `-- a0243ca6abb34233618e9ea809871be855a225
|       |   |-- 40
|       |   |   |-- 0b36608e5e4405636bf7394c546ec18de53252
|       |   |   `-- c24d558d8a1196d4170f56182b8f69fbe6741f
|       |   |-- 5e
|       |   |   `-- 1c48b299eb8c1fd204b69e520236d3a2a3217e
|       |   |-- 6a
|       |   |   `-- e37b40a1cd342e2661bdf06b65fc4731e1af1e
|       |   |-- 9b
|       |   |   `-- 594ba566f5036940fd00dfeca9cd38e51579a8
|       |   |-- a5
|       |   |   `-- 7d1f5806d714a998130b9517a4240de0c39fe3
|       |   |-- b5
|       |   |   `-- 3bde9fe6346b3d54d39b9d970308cc25080cbe
|       |   |-- c0
|       |   |   `-- df17bb0b3dbdb4da6c06ad6fe4e070e3061485
|       |   |-- c1
|       |   |   `-- d6344439cdc822df02c54bb39aabb5ccd4a7de
|       |   |-- d5
|       |   |   `-- 64d0bc3dd917926892c55e3706cc116d5b165e
|       |   |-- df
|       |   |   `-- 8d841a9e8c1afd175e0061bb7b762d708b0c58
|       |   |-- e3
|       |   |   `-- 1f2ec741b91b2d4ddc9500991cc660a8cf037d
|       |   |-- e6
|       |   |   `-- 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
|       |   |-- ed
|       |   |   `-- 5eb993715da4af89ce517eedb2c3879994e10e
|       |   |-- ee
|       |   |   `-- 74341ac408153e9bfe02fe55669533ccdfdbba
|       |   |-- f1
|       |   |   `-- 25e7fa5f3603669e173695b284d170ddd7b62f
|       |   |-- info
|       |   |   `-- packs
|       |   `-- pack
|       |       |-- pack-e8aca9b5d216bb7c5a7ac884d5cdcb6c0a9faabe.idx
|       |       `-- pack-e8aca9b5d216bb7c5a7ac884d5cdcb6c0a9faabe.pack
|       |-- packed-refs
|       `-- refs
|           |-- heads
|           |   `-- master
|           `-- tags
`-- X1
    |-- ci
    |-- conf
    |   `-- magic -&gt; /etc/httpd/conf/magic
    |-- conf.d
    |-- &lt;b&gt;data&lt;/b&gt;
    |-- logs
    |   |-- access_log-20111122-000000-EST
    |   |-- access_log-20111123-000000-EST
    |   |-- error_log-20111122-000000-EST
    |   `-- error_log-20111123-000000-EST
    |-- modules -&gt; /usr/lib64/httpd/modules
    |-- perl5lib
    |-- repo -&gt; runtime/repo
    |-- run
    |-- runtime
    |   `-- repo
    |       |-- deplist.txt
    |       |-- libs
    |       |-- misc
    |       |-- perl
    |       |   |-- health_check.pl
    |       |   |-- index.pl
    |       |   `-- printenv.pl
    |       `-- README
    `-- tmp

45 directories, 53 files
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Persistent Storage&lt;/h2&gt;
&lt;p&gt;
Wie oben bereits erw&amp;auml;hnt, werden bei der Auslieferung (git push) alle Dateien, die sich innerhalb des Git-Repositories befinden, auf dem Cloud-Server gel&amp;ouml;scht und neu eingespielt. 
&lt;/p&gt;
&lt;p&gt;
Persistente Daten, z.B. SQLite Dateien, m&amp;uuml;ssen daher ausserhalb des Git-Repositories auf dem Server aufbewahrt werden. Dazu stellt OpenShift Express den Ordner &lt;i&gt;data&lt;/i&gt; zur Verf&amp;uuml;gung. 
&lt;/p&gt;
&lt;p&gt;
Der Pfad zum Ordner &lt;i&gt;data&lt;/i&gt; kann aus der Umgebungsvariablen &lt;i&gt;OPENSHIFT_DATA_DIR&lt;/i&gt; &lt;a href="https://www.redhat.com/openshift/blogs/whats-new-in-openshift-express-august-2011"&gt;ermittelt&lt;/a&gt; werden.
&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/perl
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;Content-type: text/plain\n\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$data_dir&lt;/span&gt; = &lt;span style="color: #00688B;"&gt;$ENV&lt;/span&gt;{&lt;span style="color: #000000;"&gt;OPENSHIFT_DATA_DIR&lt;/span&gt;}&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$file&lt;/span&gt; = &lt;span style="color: #CD5555;"&gt;&amp;#39;test.txt&amp;#39;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;open&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;OUT&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;&amp;gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;$data_dir/$file&amp;quot;&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;or&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;die&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$!&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;for&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #B452CD;"&gt;1&lt;/span&gt; .. &lt;span style="color: #B452CD;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
        &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #00688B;"&gt;OUT&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;$_\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;close&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;OUT&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;or&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;die&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$!&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;exit&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Die im Ordner &lt;i&gt;data&lt;/i&gt; gespeicherten Daten lassen sich per &lt;i&gt;rhc-snapshot&lt;/i&gt; vom Cloud-Server holen. 
&lt;/p&gt;
&lt;pre&gt;
$ tree
.
|-- ci
|-- conf
|   `-- magic -&gt; /etc/httpd/conf/magic
|-- conf.d
|-- &lt;b&gt;data&lt;/b&gt;
|   `&lt;b&gt;-- test.txt&lt;/b&gt;
|-- logs
|   |-- access_log-20111122-000000-EST
|   |-- access_log-20111123-000000-EST
|   |-- error_log-20111122-000000-EST
|   `-- error_log-20111123-000000-EST
|-- modules -&gt; /usr/lib64/httpd/modules
|-- perl5lib
|-- repo -&gt; runtime/repo
|-- run
|-- runtime
|   `-- repo
|       |-- deplist.txt
|       |-- libs
|       |-- misc
|       |-- perl
|       |   |-- health_check.pl
|       |   |-- index.pl
|       |   |-- printenv.pl
|       |   |-- read.pl
|       |   `-- write.pl
|       `-- README
`-- tmp
&lt;/pre&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Siehe auch&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openshift.redhat.com/app/"&gt;OpenShift by Red Hat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openshift.redhat.com/app/express"&gt;OpenShift Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.redhat.com/docs/en-US/OpenShift_Express/1.0/html/User_Guide/index.html"&gt;User Guide - Using OpenShift Express to manage your applications in the cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/openshift/faq/"&gt;Frequently Asked Questions &gt; OpenShift FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/openshift/kb/kb-e1013-how-to-onboard-a-perl-application"&gt;OpenShift Knowledge Base - How to onboard a Perl application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openshift"&gt;OpenShift Beispiele auf GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/openshift/kb/kb-e1014-how-to-deploy-the-perl-dancer-framework-on-openshift-express"&gt;OpenShift Knowledge Base - How to deploy the Perl Dancer framework on OpenShift Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openshift/dancer-example"&gt;openshift / dancer-example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/openshift/kb/kb-e1000/installing-openshift-express-client-tools-on-non-rpm-based-systems"&gt;OpenShift Knowledge Base - Installing OpenShift Express client tools on Mac OSX, Linux, and Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;man 5 express.conf - configuration file for OpenShift Express&lt;/li&gt;
&lt;li&gt;man 1 rhc-create-domain - creates a new OpenShift Express domain namespace with a user&lt;/li&gt;
&lt;li&gt;man 1 rhc-create-app - creates a new hosted application at rhcloud.com&lt;/li&gt;
&lt;li&gt;man 1 rhc-tail-files - Tail files from remote running applications in real-time&lt;/li&gt;
&lt;li&gt;man 1 rhc-user-info - Displays information about a user on the rhcloud.com system&lt;/li&gt;
&lt;li&gt;man 1 rhc-chk - Diagnoses the connection between this client and the OpenShift servers&lt;/li&gt;
&lt;li&gt;man 1 rhc-ctl-app - Control an existing rhcloud.com application&lt;/li&gt;
&lt;li&gt;man 1 rhc-snapshot - Pulls down an application snapshot as gzipped tarfile&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/openshift/faq/i-have-deployed-my-app-but-i-don%E2%80%99t-like-telling-people-to-visit-myapp-myusernamerhcloudcom-how-c"&gt;OpenShift Knowledge Base - I have deployed my app, but I don&amp;#39;t like telling people to visit &amp;lt;my_app&gt;-&amp;lt;my_username&gt;.rhcloud.com. How can I set up my own domain name to point to my app?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/openshift/kb/kb-e1011-redirecting-your-server-to-openshift-express-with-modrewrite"&gt;OpenShift Knowledge Base - Redirecting your server to OpenShift Express with mod_rewrite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.linux-magazin.de/Heft-Abo/Ausgaben/2011/10/Open-Shift?category=0"&gt;Linux Magazin - Cloud-K&amp;uuml;che - Red Hat Open Shift: Plattform für Webentwickler und Hoster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/tRqnG3EcsXI" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>WWW::Google::PageRank - Google Pagerank für Websites abfragen</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/11/wwwgooglepagerank-google-pagerank-fur-websites-abfragen.html" />
    <id>tag:perl-howto.de,2011://1.224</id>

    <published>2011-11-21T17:17:53Z</published>
    <updated>2011-11-21T17:38:54Z</updated>

    <summary><![CDATA[ WWW::Google::PageRank von Yuri Karaban ermittelt den Google Pagerank f&uuml;r Websites. &nbsp; Pagerank ermitteln: get() Die Methode get() liefert im skalaren Kontext den Pagerank, im Listenkontext den Pagerank und zus&auml;tzlich ein HTTP::Response Objekt zum Debuggen zur&uuml;ck. &nbsp; Beispiel: get() im...]]></summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="LWP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="http://search.cpan.org/perldoc?WWW::Google::PageRank"&gt;WWW::Google::PageRank&lt;/a&gt; von &lt;a href="http://search.cpan.org/~ykar/"&gt;Yuri Karaban&lt;/a&gt; ermittelt den &lt;a href="http://www.google.com/about/corporate/company/"&gt;Google &lt;/a&gt; &lt;a href="http://de.wikipedia.org/wiki/PageRank"&gt;Pagerank&lt;/a&gt; f&amp;uuml;r Websites.
&lt;/p&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Pagerank ermitteln: get()&lt;/h2&gt;
&lt;p&gt;
Die Methode &lt;i&gt;get()&lt;/i&gt; liefert im &lt;b&gt;skalaren Kontext&lt;/b&gt; den Pagerank, im &lt;b&gt;Listenkontext&lt;/b&gt; den Pagerank und zus&amp;auml;tzlich ein &lt;a href="http://search.cpan.org/perldoc?HTTP::Response"&gt;HTTP::Response Objekt&lt;/a&gt; zum Debuggen zur&amp;uuml;ck.
&lt;/p&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h3&gt;Beispiel: get() im skalaren Kontext&lt;/h3&gt;
&lt;pre&gt;
#!/usr/bin/perl
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;WWW::Google::PageRank&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$pr&lt;/span&gt; = &lt;span style="color: #000000;"&gt;WWW::Google::PageRank&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #000000;"&gt;host&lt;/span&gt; &lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;#39;toolbarqueries.google.de&amp;#39;&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@urls&lt;/span&gt; = &lt;span style="color: #CD5555;"&gt;qw!&lt;/span&gt;
  &lt;span style="color: #CD5555;"&gt;http://perl-howto.de&lt;/span&gt;
  &lt;span style="color: #CD5555;"&gt;http://yahoo.de&lt;/span&gt;
  &lt;span style="color: #CD5555;"&gt;http://web.de&lt;/span&gt;
  &lt;span style="color: #CD5555;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;foreach&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$url&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #00688B;"&gt;@urls&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
    &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;URL: $url &amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;scalar&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$pr&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #00688B;"&gt;$url&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Das Programm liefert folgende Ausgabe:
&lt;/p&gt;
&lt;pre&gt;
URL: http://perl-howto.de 4
URL: http://yahoo.de 8
URL: http://web.de 7
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h3&gt;Beispiel: get() im Listenkontext&lt;/h3&gt;

&lt;pre&gt;
#!/usr/bin/perl
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;WWW::Google::PageRank&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$pr&lt;/span&gt; = &lt;span style="color: #000000;"&gt;WWW::Google::PageRank&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #000000;"&gt;host&lt;/span&gt; &lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;#39;toolbarqueries.google.de&amp;#39;&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt;
  &lt;span style="color: #8B008B; font-weight:bold;"&gt;or&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;die&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$!&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@urls&lt;/span&gt; = &lt;span style="color: #CD5555;"&gt;qw!&lt;/span&gt;
  &lt;span style="color: #CD5555;"&gt;http://perl-howto.de&lt;/span&gt;
  &lt;span style="color: #CD5555;"&gt;http://yahoo.de&lt;/span&gt;
  &lt;span style="color: #CD5555;"&gt;http://web.de&lt;/span&gt;
  &lt;span style="color: #CD5555;"&gt;http://example.tld&lt;/span&gt;
  &lt;span style="color: #CD5555;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #228B22;"&gt;# Debug&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;foreach&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$url&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #00688B;"&gt;@urls&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
    &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;URL: $url &amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

    &lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$pagerank&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$response&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt; = &lt;span style="color: #00688B;"&gt;$pr&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #00688B;"&gt;$url&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

    &lt;span style="color: #8B008B; font-weight:bold;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;defined&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$pagerank&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
        &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;PageRank: $pagerank\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000000;"&gt;}&lt;/span&gt;
    &lt;span style="color: #8B008B; font-weight:bold;"&gt;else&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
        &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;Fehler: &amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$response&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;status_line&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
        &lt;span style="color: #8B008B; font-weight:bold;"&gt;warn&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$response&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;as_string&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000000;"&gt;}&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;
Das Programm liefert folgende Ausgabe (die lange XML-Ausgabe des &lt;i&gt;as_string()&lt;/i&gt; habe ich weggelassen):
&lt;/p&gt;
&lt;pre&gt;
URL: http://perl-howto.de PageRank: 4
URL: http://yahoo.de PageRank: 8
URL: http://web.de PageRank: 7
URL: http://example.tld Fehler: 403 Forbidden
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Siehe auch:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?WWW::Google::PageRank"&gt;WWW::Google::PageRank - Query google pagerank of page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.perl-uwe.com/2010/12/day-5-check-your-google-pagerank-with.html"&gt;Perl-Uwe.com: Day 5: Check your Google PageRank with WWW::Google::PageRank &lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?LWP::UserAgent"&gt;LWP::UserAgent - Web user agent class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?HTTP::Response"&gt;HTTP::Response - HTTP style response message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perldoc.perl.org/perldata.html#List-value-constructors"&gt;Perldoc - List value constructors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?AnyEvent::Google::PageRank"&gt;AnyEvent::Google::PageRank - Non-blocking wrapper for WWW::Google::PageRank&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?POE::Component::WWW::Google::PageRank"&gt;POE::Component::WWW::Google::PageRank - A non-blocking wrapper for WWW::Google::PageRank&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/Z82BEh6p4Lw" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>FLOSS-Weekly Episode 189: Interview mit Jeffrey Thalhammer - Perl::Critic</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/11/flossweekly-episode-189-interview-mit-jeffrey-thalhammer-perlcritic.html" />
    <id>tag:perl-howto.de,2011://1.223</id>

    <published>2011-11-14T21:00:00Z</published>
    <updated>2011-11-14T21:05:57Z</updated>

    <summary> Perl::Critic ist ein statischer Source Code Analyzer für Perl, der die Einhaltung der Perl Best Practices - Standards and Styles for Developing Maintainable Code, prüft. Twit.tv hat ein Interview mit Jeffrey Thalhammer, dem Erfinder von Perl::Critic veröffentlicht. Das Interview...</summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="Talks" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bestpractices" label="best practices" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="http://search.cpan.org/perldoc?Perl::Critic"&gt;Perl::Critic&lt;/a&gt; ist ein statischer Source Code Analyzer für &lt;a href="http://www.perl.org"&gt;Perl&lt;/a&gt;, der die Einhaltung der &lt;a href="http://shop.oreilly.com/product/9780596001735.do"&gt;Perl Best Practices&lt;/a&gt; - Standards and Styles for Developing Maintainable Code, prüft.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://twit.tv/"&gt;Twit.tv&lt;/a&gt; hat ein &lt;a href="http://twit.tv/show/floss-weekly/189"&gt;Interview&lt;/a&gt; mit Jeffrey Thalhammer, dem Erfinder von &lt;a href="http://search.cpan.org/perldoc?Perl::Critic"&gt;Perl::Critic&lt;/a&gt;  veröffentlicht.
&lt;/p&gt;
&lt;p&gt;
Das Interview führt &lt;a href="http://www.stonehenge.com/merlyn/"&gt;Randal Schwartz&lt;/a&gt; zusammen mit &lt;a href="http://thesourceshow.org/"&gt;Aaron Newcomb&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
In dem sehenswerten Video gehen die drei auf die Hintergründe und die Geschichte von Perl::Critic ein, zeigen Beispiele für die Verwendung und finden mit Perl::Critic gleich ein paar Bugs.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Enjoy!&lt;/h2&gt;

&lt;iframe src="http://twit.tv/embed/10114" width="640" height="320" scrolling="no" marginwidth="0" marginheight="0" hspace="0" align="middle" frameborder="0"&gt;&lt;/iframe&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Perl::Critic ausprobieren&lt;/h2&gt;
&lt;p&gt;
Wer Perl::Critic einfach mal ausprobieren möchte, kann eine Datei mit Perl Source Code auf der Website &lt;a href="http://www.perlcritic.org/"&gt;http://www.perlcritic.org/ (Some Ways Are Better Than Others)&lt;/a&gt; hochladen und prüfen lassen.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;


&lt;h2&gt;Siehe auch:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Perl::Critic"&gt;Perl::Critic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.perlcritic.org/"&gt;http://www.perlcritic.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://refcards.com/refcard/perl-best-practices-vromansj"&gt;Perl Best Practices Reference card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/joshua.mcadams/yapcna-2007-an-introduction-to-perl-critic"&gt;An introduction to PerlCritic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/joshua.mcadams/yapcna-2007-customizing-and-extending-perl-critic"&gt;Customizing and Extending PerlCritic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://reneeb-perlblog.blogspot.com/2009/05/eigene-perlcritic-policies.html"&gt;Perl-Blog: eigene Perl::Critic Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://damienlearnsperl.blogspot.com/2009/03/write-better-perl-with-perlcritic.html"&gt;Damien Learns Perl: Write better Perl with Perl::Critic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Via:&lt;/h2&gt;
&lt;p&gt;
Perl-News: &lt;a href="http://perl-nachrichten.de/index.cgi/details/983"&gt;FLOSS-Weekly: Interview mit Jeffrey Thalhammer - Perl::Critic&lt;/a&gt;
&lt;/p&gt;
        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/AtP5yfoqGpk" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Carp::Always - warn und die mit stack backtrace</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/10/carpalways-warn-und-die-mit-stack-backtrace.html" />
    <id>tag:perl-howto.de,2011://1.222</id>

    <published>2011-10-25T18:50:00Z</published>
    <updated>2011-10-25T18:57:09Z</updated>

    <summary><![CDATA[ Carp::Always - Warns and dies noisily with stack backtraces von Adriano Ferreira erleichtert das Debuggen von Perl-Programmen. Statt m&uuml;hselig den Debugger an zu werfen, wird Carp::Always einfach ohne &Auml;nderung des Programms auf der Kommandozeile aufgerufen. $ perl -MCarp::Always programm.pl...]]></summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="101" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="debugging" label="debugging" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="http://search.cpan.org/perldoc?Carp::Always"&gt;Carp::Always - Warns and dies noisily with stack backtraces&lt;/a&gt; von &lt;a href="http://search.cpan.org/~ferreira/"&gt;Adriano Ferreira&lt;/a&gt; erleichtert das Debuggen von &lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt;-Programmen. 
&lt;/p&gt;
&lt;p&gt;
Statt m&amp;uuml;hselig den Debugger an zu werfen, wird &lt;a href="http://search.cpan.org/perldoc?Carp::Always"&gt;Carp::Always&lt;/a&gt; einfach ohne &amp;Auml;nderung des Programms auf der Kommandozeile aufgerufen.
&lt;/p&gt;
&lt;pre&gt;
$ perl -MCarp::Always programm.pl
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Beispiel:&lt;/h2&gt;
&lt;p&gt;
Das folgende Beispielprogramm versucht eine nicht existierende Webseite auf zu rufen.
&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/perl
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;WWW::Mechanize&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$mech&lt;/span&gt; = &lt;span style="color: #000000;"&gt;WWW::Mechanize&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$url&lt;/span&gt; = &lt;span style="color: #CD5555;"&gt;&amp;#39;http://example.tld&amp;#39;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #00688B;"&gt;$mech&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$url&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Das Programm erzeugt folgende Ausgabe:
&lt;pre&gt;
Error GETing http://example.tld: Can't connect to example.tld:80 (Bad hostname 'example.tld') at mech.pl line 11
&lt;/pre&gt;
&lt;p&gt;
Carp::Always wird auf der Kommandozeile aufgerufen
&lt;/p&gt;
&lt;pre&gt;
$ /opt/perl-5.12.3/bin/perl -MCarp::Always mech.pl
&lt;/pre&gt;
&lt;p&gt;
und erzeugt folgenden Stack Backtrace (den ich hier ein wenig umgebrochen habe):
&lt;/p&gt;
&lt;pre&gt;
Error GETing http://example.tld: Can't connect to example.tld:80 (Bad
hostname) at /opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm
line 2747
	WWW::Mechanize::_die('Error ', 'GET', 'ing ',
	'URI::http=SCALAR(0xa1f2db0)', ': ', 'Can\'t
	connect to example.tld:80 (Bad hostname)') called at
	/opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm line 2734

	WWW::Mechanize::die('WWW::Mechanize=HASH(0xa11cf98)',
	'Error ', 'GET', 'ing ', 'URI::http=SCALAR(0xa1f2db0)', ': ',
	'Can\'t connect to example.tld:80 (Bad hostname)') called at
	/opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm line 2381

	WWW::Mechanize::_update_page('WWW::Mechanize=HASH(0xa11cf98)',
	'HTTP::Request=HASH(0xa211690)', 'HTTP::Response=HASH(0xa15f480)')
	called at /opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm
	line 2213

	WWW::Mechanize::request('WWW::Mechanize=HASH(0xa11cf98)',
	'HTTP::Request=HASH(0xa211690)') called at
	/opt/perl-5.12.3/lib/site_perl/5.12.3/LWP/UserAgent.pm line 411

	LWP::UserAgent::get('WWW::Mechanize=HASH(0xa11cf98)',
	'http://example.tld') called at
	/opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm line 407

	WWW::Mechanize::get('WWW::Mechanize=HASH(0xa11cf98)',
	'http://example.tld') called at
	/opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm line 2747

	WWW::Mechanize::_die('Error ', 'GET', 'ing ',
	'URI::http=SCALAR(0xa1f2db0)', ': ', 'Can\'t
	connect to example.tld:80 (Bad hostname)') called at
	/opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm line 2734

	WWW::Mechanize::die('WWW::Mechanize=HASH(0xa11cf98)',
	'Error ', 'GET', 'ing ', 'URI::http=SCALAR(0xa1f2db0)', ': ',
	'Can\'t connect to example.tld:80 (Bad hostname)') called at
	/opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm line 2381

	WWW::Mechanize::_update_page('WWW::Mechanize=HASH(0xa11cf98)',
	'HTTP::Request=HASH(0xa211690)', 'HTTP::Response=HASH(0xa15f480)')
	called at /opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm
	line 2213

	WWW::Mechanize::request('WWW::Mechanize=HASH(0xa11cf98)',
	'HTTP::Request=HASH(0xa211690)') called at
	/opt/perl-5.12.3/lib/site_perl/5.12.3/LWP/UserAgent.pm line 411

	LWP::UserAgent::get('WWW::Mechanize=HASH(0xa11cf98)',
	'http://example.tld') called at
	/opt/perl-5.12.3/lib/site_perl/5.12.3/WWW/Mechanize.pm line 407

	WWW::Mechanize::get('WWW::Mechanize=HASH(0xa11cf98)',
	'http://example.tld') called at mech.pl line 11
&lt;/pre&gt;
&lt;p&gt;
Wem Schwarz-Wei&amp;szlig; zu langweilig ist, kann die Ausgabe mit &lt;a href="http://search.cpan.org/perldoc?Carp::Always::Color"&gt;Carp::Always::Color&lt;/a&gt; aufh&amp;uuml;bschen.
&lt;/p&gt;
&lt;pre&gt;
$ perl -MCarp::Always::Color programm.pl
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Hinweis:&lt;/h2&gt;
&lt;p&gt;
Da Carp::Always eigene Signalhandler f&amp;uuml;r &lt;a href="http://perldoc.perl.org/functions/die.html"&gt;die()&lt;/a&gt; und &lt;a href="http://perldoc.perl.org/functions/warn.html"&gt;warn()&lt;/a&gt; installiert, funktioniert dieses Modul &lt;b&gt;nicht&lt;/b&gt; mit Programmen oder Modulen, die bereits Signalhandler f&amp;uuml;r &lt;i&gt;die()&lt;/i&gt; und/oder &lt;i&gt;warn()&lt;/i&gt; verwenden.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Siehe auch:&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Carp::Always"&gt;Carp::Always - Warns and dies noisily with stack backtraces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cpanratings.perl.org/dist/Carp-Always"&gt;CPAN Ratings Carp-Always reviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dereferenced.com/2011/08/22/perl-module-monday-carpalways/"&gt;Perl Module Monday: Carp::Always&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Carp::Always::Color"&gt;Carp::Always::Color - Carp::Always, but with color&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Carp::Source::Always"&gt;Carp::Source::Always - Warns and dies with stack backtraces and source code context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Devel::SimpleTrace"&gt;Devel::SimpleTrace - See where you code warns and dies using stack traces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perldoc.perl.org/Carp.html"&gt;Carp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perldoc.perl.org/diagnostics.html"&gt;diagnostics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl101.org/debugging.html"&gt;Perl 101: Debugging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/eSzqWIdlWqg" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Vortragsprogramm des 13. Deutschen Perl-Workshops (19.10.2011 bis 21.10.2011) ist online</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/09/vortragsprogramm-des-13-deutschen-perlworkshops-19102011-bis-21102011-ist-online.html" />
    <id>tag:perl-howto.de,2011://1.221</id>

    <published>2011-09-12T19:21:39Z</published>
    <updated>2011-09-12T19:25:19Z</updated>

    <summary> Renée Bäcker hat das Vortragsprogramm des 13. Deutschen Perl-Workshops (19.10.2011 bis 21.10.2011) online gestellt....</summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="Talks" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="training" label="training" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
Renée Bäcker hat das &lt;a href="http://conferences.yapceurope.org/gpw2011/schedule"&gt;Vortragsprogramm&lt;/a&gt; des &lt;a href="http://conferences.yapceurope.org/gpw2011/"&gt;13. Deutschen Perl-Workshops&lt;/a&gt; (19.10.2011 bis 21.10.2011) online gestellt.
&lt;/p&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/mo8CyY0v8fQ" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Memory::Usage - Aktuelle Speichernutzung  </title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/09/memoryusage-aktuelle-speichernutzung.html" />
    <id>tag:perl-howto.de,2011://1.220</id>

    <published>2011-09-11T20:19:19Z</published>
    <updated>2011-09-11T20:22:31Z</updated>

    <summary><![CDATA[ Memory::Usage von David O'Neill zeigt den aktuellen Speicherbedarf eines Programms aus der Sicht des Betriebssystems an. Da hierzu die Datei /proc/$pid/statm genutzt wird, funktioniert Memory::Usage derzeit nur auf Betriebssystemen, welche diese Datei zur Verf&uuml;gung stellen, z.B. Linux. Memory::Usage untergliedert...]]></summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="Linux" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="benchmark" label="benchmark" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="profiling" label="profiling" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sysadmin" label="sysadmin" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="http://search.cpan.org/perldoc?Memory::Usage"&gt;Memory::Usage&lt;/a&gt; von &lt;a href="http://search.cpan.org/~doneill/"&gt;David O'Neill&lt;/a&gt; zeigt den aktuellen Speicherbedarf eines Programms aus der Sicht des Betriebssystems an. Da hierzu die Datei &lt;i&gt;/proc/$pid/statm&lt;/i&gt; genutzt wird, funktioniert Memory::Usage derzeit nur auf Betriebssystemen, welche diese Datei zur Verf&amp;uuml;gung stellen, z.B. &lt;a href="http://www.linuxfoundation.org/"&gt;Linux&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Memory::Usage untergliedert die Speichernutzung wie folgt:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;virtual memory size (vzs)&lt;/li&gt;
 &lt;li&gt;resident set size (rss)&lt;/li&gt;
 &lt;li&gt;shared memory size (shared)&lt;/li&gt;
 &lt;li&gt;text (aka code or exe) size (code)&lt;/li&gt;
 &lt;li&gt;data and stack size (data)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Beispiel&lt;/h2&gt;
&lt;p&gt;
Im diesem Beispiel wird der Speicherverbrauch vor und nach dem Aufbau einer speicherhungrigen Datenstruktur mit &lt;i&gt;record()&lt;/i&gt; gemessen.
 Anschlie&amp;szlig;end wird ein Report auf den Standardfehlerkanal STDERR via &lt;i&gt;dump()&lt;/i&gt; ausgegeben.
&lt;/p&gt;

&lt;pre&gt;
#!/usr/bin/perl
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;Memory::Usage&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$mu&lt;/span&gt; = &lt;span style="color: #000000;"&gt;Memory::Usage&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;%hash&lt;/span&gt; = &lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #228B22;"&gt;# Record amount of memory used by current process&lt;/span&gt;
&lt;span style="color: #00688B;"&gt;$mu&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;record&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #CD5555;"&gt;&amp;#39;starting work&amp;#39;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #228B22;"&gt;# Use some memory&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;for&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #B452CD;"&gt;1&lt;/span&gt; .. &lt;span style="color: #B452CD;"&gt;10_000_000&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
	&lt;span style="color: #00688B;"&gt;$hash&lt;/span&gt;{ &lt;span style="color: #00688B;"&gt;$_&lt;/span&gt; } = &lt;span style="color: #B452CD;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;

&lt;span style="color: #228B22;"&gt;# Record amount in use afterwards&lt;/span&gt;
&lt;span style="color: #00688B;"&gt;$mu&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;record&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #CD5555;"&gt;&amp;#39;finished work&amp;#39;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #228B22;"&gt;# Spit out a report&lt;/span&gt;
&lt;span style="color: #00688B;"&gt;$mu&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;dump&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;exit&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Das Programm liefert folgende Ausgabe:
&lt;/p&gt;
&lt;pre&gt;
time    vsz (  diff)    rss (  diff) shared (  diff)   code (  diff)   data (  diff)
    0   5304 (  5304)   2072 (  2072)   1652 (  1652)   1244 (  1244)    692 (   692) starting work
   37  834004 ( 828700) 830784 ( 828712)   1676 (    24)   1244 (     0)  829392 ( 828700) finished work
&lt;/pre&gt;
&lt;p&gt;
Die Laufzeit wird in Sekunden angeben, alle Speicherangaben in Kilobytes. Memory::Usage rechnet intern &lt;a href="http://de.wikipedia.org/wiki/Paging"&gt;pages&lt;/a&gt; in Kilobyte um (4 kb je page).
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Siehe auch:&lt;/h2&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Memory::Usage"&gt;Memory::Usage&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://linux.die.net/man/5/proc"&gt;proc(5) - Linux man page&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Devel::Peek"&gt;Devel::Peek&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://perldoc.perl.org/perldebguts.html#Using-%24ENV{PERL_DEBUG_MSTATS}"&gt;Debugging Perl memory usage: Using $ENV{PERL_DEBUG_MSTATS}&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Devel::Size"&gt;Devel::Size&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://perl-howto.de/2008/09/develsize-wieviel-speicher-b.html"&gt;Devel::Size - Wieviel Speicher belegt meine Datenstruktur?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Memchmark"&gt;Memchmark&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/bSJjSuFO18E" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Talk: Ricardo Signes - Perl 5.14 for Pragmatists </title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/08/talk-ricardo-signes-perl-514-for-pragmatists.html" />
    <id>tag:perl-howto.de,2011://1.219</id>

    <published>2011-08-23T18:49:08Z</published>
    <updated>2011-08-23T18:57:29Z</updated>

    <summary> Ricardo Signes (RJBS) hat die lesenswerten Slides seines Vortrags Perl 5.14 for Pragmatists veröffentlicht. Perl 5.14 for Pragmatists View more presentations from Ricardo Signes Alles Wesentliche auf einen Blick. Siehe auch Perl 5.14 parallel zu einem bestehendem Perl installieren...</summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="Talks" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="http://rjbs.manxome.org/"&gt;Ricardo Signes&lt;/a&gt; (&lt;a href="http://search.cpan.org/~rjbs/"&gt;RJBS&lt;/a&gt;) hat die lesenswerten &lt;a href="http://www.slideshare.net/rjbs/perl-514-8809465"&gt;Slides&lt;/a&gt; seines Vortrags &lt;em&gt;Perl 5.14 for Pragmatists&lt;/em&gt; veröffentlicht.
&lt;/p&gt;
&lt;div style="width:425px" id="__ss_8809465"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/rjbs/perl-514-8809465" title="Perl 5.14 for Pragmatists" target="_blank"&gt;Perl 5.14 for Pragmatists&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/8809465" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/rjbs" target="_blank"&gt;Ricardo Signes&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;
&lt;p&gt;
Alles Wesentliche auf einen Blick.
&lt;/p&gt;


&lt;h2&gt;Siehe auch&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://perl-howto.de/2011/05/perl-514-parallel-zu-einem-bestehendem-perl-installieren.html"&gt;Perl 5.14 parallel zu einem bestehendem Perl installieren&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/9f_NOnG49mg" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Call for Papers für den 13. Deutschen Perl-Workshop(19.10.2011 bis 21.10.2011)</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/06/call-for-papers-fur-den-13-deutschen-perlworkshop19102011-bis-21102011.html" />
    <id>tag:perl-howto.de,2011://1.218</id>

    <published>2011-06-26T08:15:00Z</published>
    <updated>2011-06-26T08:20:34Z</updated>

    <summary>Call for Papers / Participation Vom 19.10.2011 bis 21.10.2011 (Mittwoch bis Freitag) findet der 13. Deutsche Perl-Workshop im Haus der Jugend in Frankfurt am Main statt. Zielgruppe des Workshops sind alle ernsthaften Perl-Anwender und die, die es werden wollen. Unser...</summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="Talks" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="training" label="training" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;h2&gt;Call for Papers / Participation&lt;/h2&gt;

&lt;p&gt;Vom &lt;strong&gt;19.10.2011 bis 21.10.2011&lt;/strong&gt; (Mittwoch bis Freitag) findet der &lt;a href="http://conferences.yapceurope.org/gpw2011/"&gt;13. Deutsche Perl-Workshop&lt;/a&gt; im Haus der Jugend in Frankfurt am Main statt. Zielgruppe des Workshops sind alle ernsthaften Perl-Anwender und die, die es werden wollen.&lt;/p&gt;

&lt;p&gt;Unser Workshop steht und f&amp;auml;llt mit den Vortr&amp;auml;gen. &amp;Uuml;blicherweise sind Vortr&amp;auml;ge 5, 20 oder 40 Minuten lang. Alle Themen, die in irgendeiner Weise mit Perl oder dem Perl-Umfeld zu tun haben, k&amp;ouml;nnen als Vortr&amp;auml;ge f&amp;uuml;r den Workshop interessant sein.&lt;/p&gt;

&lt;p&gt;Du hast im Moment nur eine vage Idee f&amp;uuml;r ein Thema? Kein Problem: uns interessieren im Prinzip alle Themen, die in irgendeiner Weise mit Perl zu tun haben. Frag' im Zweifelsfall einfach fr&amp;uuml;h genug bei uns (wsorga@perl-workshop.de) nach. Wir helfen gerne dabei, ein vages Thema zu konkretisieren.&lt;/p&gt;

&lt;p&gt;Alle Vortr&amp;auml;ge werden im Plenum (120 - 150 Teilnehmer) angeboten. Zus&amp;auml;tzlich zu den eigentlichen Vortr&amp;auml;gen wird es zwei oder drei halbt&amp;auml;gige Tutorials zu jeweils einem gr&amp;ouml;&amp;szlig;eren Thema geben; auch hierzu sind uns Vorschl&amp;auml;ge von Referenten hochwillkommen. Konferenzsprache ist Deutsch, aber Du kannst Deinen Vortrag auch auf Englisch halten, wenn Deutsch nicht Deine Muttersprache ist.&lt;/p&gt;

&lt;p&gt;Deinen Vorschlag schickst Du uns bitte bis sp&amp;auml;testens Sonntag, den &lt;strong&gt;14.08.2011 &lt;/strong&gt;als Abstract. Du kannst nat&amp;uuml;rlich gerne auch mehrere Themen vorschlagen. Dein Abstract sollte in rund 2000 Zeichen (das sind ca. 30 Zeilen a 72 Spalten) das Thema beschreiben, was besonders an Deinem Ansatz ist und weshalb Perl als Sprache in diesem Fall besonders n&amp;uuml;tzlich ist.&lt;/p&gt;

&lt;p&gt;Zum Einreichen eines Vorschlages, melde Dich bitte auf der Perlworkshop-Webseite an und verwende danach das Formular unter &lt;a href="http://conferences.yapceurope.org/gpw2011/newtalk"&gt;Mein Workshop / Meine Vortr&amp;auml;ge / Neuen Vortrag einreichen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Die Zuh&amp;ouml;rer sind, dem Workshop-Charakter gem&amp;auml;&amp;szlig;, in erster Linie erfahrene Perl-Anwender. Auf Grund der R&amp;auml;umlichkeiten haben wir aber auch Platz f&amp;uuml;r weniger erfahrene Anwender. Vortr&amp;auml;ge sollten, m&amp;uuml;ssen aber nicht, technisch ausgerichtet sein. Optimal w&amp;auml;re es, wenn wir Deinem Beitrag praktisch nutzbare Anregungen f&amp;uuml;r die eigene Arbeit entnehmen k&amp;ouml;nnten.&lt;/p&gt;

&lt;h3&gt;Ultrakurzvortr&amp;auml;ge (5 Minuten)&lt;/h3&gt;

&lt;p&gt;Ein Nachmittag des Workshops wird wieder f&amp;uuml;r "Lighting Talks" zur Verf&amp;uuml;gung stehen. Hier k&amp;ouml;nnen insbesondere diejenigen, die sich (noch) keinen langen Vortrag zutrauen, einen aktiven Beitrag zum Workshop leisten und ihren ersten Auftritt als Vortragende versuchen.&lt;/p&gt;

&lt;p&gt;Ebenso ist hier Platz f&amp;uuml;r Vortr&amp;auml;ge unter dem Motto "Mein liebstes Modul", in denen ein interessantes, n&amp;uuml;tzliches und evtl. zu wenig bekanntes Perl-Modul kurz vorgestellt wird.&lt;/p&gt;

&lt;h3&gt;Kurzvortr&amp;auml;ge (20 Minuten)&lt;/h3&gt;

&lt;p&gt;Vortrag von 20 Minuten sowie anschliessend 5 Minuten Zeit f&amp;uuml;r Fragen und Antworten. Kurzvortr&amp;auml;ge sind zum Beispiel zur Vorstellung von Projekten interessant.&lt;/p&gt;

&lt;h3&gt;Langvortr&amp;auml;ge (40 Minuten)&lt;/h3&gt;

&lt;p&gt;Vortrag von 40 Minuten sowie anschliessend 5 Minuten Zeit f&amp;uuml;r Fragen und Antworten. Langvortr&amp;auml;ge sollten detailliert auf einen oder zwei besonders interessante technische Aspekte des Themas eingehen.&lt;/p&gt;

&lt;h3&gt;Tagungsband / CD&lt;/h3&gt;

&lt;p&gt;Wir produzieren zum Workshop im Rahmen unserer M&amp;ouml;glichkeiten einen gedruckten Tagungsband sowie eine CD-ROM mit den Beitr&amp;auml;gen aller bisherigen Workshops. Dazu ben&amp;ouml;tigen wir eine schriftliche Ausarbeitung Deines Vortrags und Dein schriftliches Einverst&amp;auml;ndnis f&amp;uuml;r die Publikation in den Tagungsmaterialien [und im Web].&lt;/p&gt;

&lt;h2&gt;Termine&lt;/h2&gt;

&lt;p&gt;Bis Sonntag, den 14.08.2011, nehmen wir Vorschl&amp;auml;ge f&amp;uuml;r Vortr&amp;auml;ge an. Bis Sonntag den 28.08.2011 wirst Du von uns eine R&amp;uuml;ckmeldung erhalten. Die schriftliche Ausarbeitung des akzeptierten Vortrags muss uns bis sp&amp;auml;testens Freitag den 30.09.2011 vorliegen, damit er in den Tagungsband aufgenommen werden kann.&lt;/p&gt;

&lt;p&gt;Im Zweifelsfall hilft es uns und Dir, wenn Du fr&amp;uuml;hzeitig mit uns per Email (wsorga@perl-workshop.de) Kontakt aufnimmst, um Fragen zu stellen bzw. Unklarheiten zu kl&amp;auml;ren.&lt;/p&gt;

&lt;h3&gt;Unverbindliche Themenvorschl&amp;auml;ge&lt;/h3&gt;

&lt;p&gt;Als Anregung (nicht als Ausschlussliste!) bieten wir hier eine Reihe von stichwortartigen Anregungen zu Themenbereichen, zu denen wir uns interessante Vortr&amp;auml;ge oder Tutorials vorstellen k&amp;ouml;nnen:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt; Debugging (Nutzung vorhandener Debugging-Tools)&lt;/li&gt;

    &lt;li&gt; Testen (speziell z.B. Unit Testing, Test-First-Ansatz)&lt;/li&gt;
    &lt;li&gt; Refactoring (im Sinne von Kent Beck/Martin Fowler)&lt;/li&gt;
    &lt;li&gt; Entwurf&lt;/li&gt;
    &lt;li&gt; Dokumentation (Automatisierung/Generierung)&lt;/li&gt;
    &lt;li&gt; Codegenerierung (Code aus Spezifikationen)&lt;/li&gt;

    &lt;li&gt; Mein liebstes CPAN-Modul&lt;/li&gt;
    &lt;li&gt; Grundlagen-Vortr&amp;auml;ge zu den obigen Themen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Weitere Themen, zu denen wir uns interessante Vortr&amp;auml;ge vorstellen k&amp;ouml;nnen (ohne Anspruch auf Vollst&amp;auml;ndigkeit):&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt; Aktuelle Web-Frameworks: Catalyst, Dancer, Mojolicious, ...&lt;/li&gt;
    &lt;li&gt; Objektorientierung: Moose, Moose::Autobox, ...&lt;/li&gt;
    &lt;li&gt; Datenbankabstraktion: DBIx::Class, Rose::DB&lt;/li&gt;
    &lt;li&gt; SPAM-Abwehr/Erkennung&lt;/li&gt;

    &lt;li&gt; Unicode&lt;/li&gt;
    &lt;li&gt; Perl-IO&lt;/li&gt;
    &lt;li&gt; Perl 6&lt;/li&gt;
    &lt;li&gt; Perl6-in-Perl5-Integration und vice versa&lt;/li&gt;
    &lt;li&gt; "wirklich gro&amp;szlig;e" Perl-Systeme&lt;/li&gt;

    &lt;li&gt; Releasemanagement&lt;/li&gt;
    &lt;li&gt; Vergleich von "gleichen" Softwaresystemen (Template-Engines, Wikis, XML-Engines, ...)&lt;/li&gt;
    &lt;li&gt; Vertr&amp;auml;glichkeit mit anderen Systemen&lt;/li&gt;
    &lt;li&gt; (plattform&amp;uuml;bergreifende) GUI-Programmierung&lt;/li&gt;

    &lt;li&gt; Erfahrungsberichte zum Einsatz von Perl (z.B. Inbetriebnahme gr&amp;ouml;sserer Perl-Systeme (WebGUI, ...))&lt;/li&gt;
    &lt;li&gt; Grundlagen-Tutorials zu allen Perl-Themen (XML, Web, DBI, ...)&lt;/li&gt;
&lt;/ul&gt; 


        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/HuDyNon7Z3k" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Perl@FrOSCon2011 - Call for Papers bis 22.07.2011</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/06/perlfroscon2011-call-for-papers-bis-22072011.html" />
    <id>tag:perl-howto.de,2011://1.217</id>

    <published>2011-06-19T10:15:00Z</published>
    <updated>2011-06-19T10:20:35Z</updated>

    <summary> Die Organisatoren der FrOSCon 2011 haben uns auch in diesem Jahr wieder einen Raum für einen Tag für Perl-Vorträge zur Verfügung gestellt. Am 21. August 2011 wird es also wieder Perl-Vorträge geben. Vorträge Insgesamt haben wir 7 Stunden für...</summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="Talks" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="froscon" label="FrOSCon" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="talk" label="talk" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="training" label="training" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
Die Organisatoren der &lt;a href="http://froscon.de/"&gt;FrOSCon 2011&lt;/a&gt; haben uns auch in diesem Jahr wieder einen Raum für einen Tag für Perl-Vorträge zur Verfügung gestellt. Am &lt;strong&gt;21. August 2011&lt;/strong&gt; wird es also wieder Perl-Vorträge geben.
&lt;/p&gt;

&lt;h2&gt;Vorträge&lt;/h2&gt;
&lt;p&gt;
Insgesamt haben wir 7 Stunden für die Vorträge zur Verfügung. Die Vorträge sollten entweder 20, 40 oder 60 Minuten lang sein und logischerweise etwas mit &lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt; zu tun haben.
&lt;/p&gt;
&lt;h2&gt;Vortragsraum&lt;/h2&gt;
&lt;p&gt;
Der Raum, der uns zur Verfügung steht, fasst ca. 40 Personen und in den letzten beiden Jahren  waren bei den Vorträgen zwischen 20 und 30 Leuten anwesend.
&lt;/p&gt;
&lt;h2&gt;Deadlines&lt;/h2&gt;
&lt;p&gt;
Bitte reicht die Vortragsvorschläge &lt;strong&gt;bis zum 22. Juli&lt;/strong&gt; per E-Mail an froscon2011@perl-magazin.de ein. Bis zum&lt;strong&gt; 29. Juli&lt;/strong&gt; werden wir dann ein Programm zusammenstellen und euch darüber informieren.
&lt;/p&gt;
&lt;p&gt;
Der Vortragsvorschlag sollte eine kurze Zusammenfassung über den Vortragsinhalt sowie eine Längenangabe beinhalten.
&lt;/p&gt;

&lt;h2&gt;Via:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://perl-nachrichten.de/index.cgi/details/915"&gt;Perl@FrOSCon2011 - Call for Papers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://reneeb-perlblog.blogspot.com/2011/06/perlfroscon2011-call-for-papers.html"&gt;Perl@FrOSCon2011 - Call for Papers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/Iquq2NqJM4M" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Perl 5.14 parallel zu einem bestehendem Perl installieren</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/05/perl-514-parallel-zu-einem-bestehendem-perl-installieren.html" />
    <id>tag:perl-howto.de,2011://1.216</id>

    <published>2011-05-23T21:20:00Z</published>
    <updated>2011-05-23T21:22:26Z</updated>

    <summary><![CDATA[ Perl 5.14.0 ist bereits seit dem 15. Mai 2011 verf&uuml;gbar. Die Neuerungen sind ausf&uuml;hrlich in perldelta beschrieben. Wer die neue Version einfach einmal ausprobieren m&ouml;chte, kann Perl 5.14.0 aus den Sourcen parallel zu einem bestehenden Perl installieren. &nbsp; Vorbereitungen:...]]></summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="101" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="linux" label="linux" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="http://search.cpan.org/~jesse/perl-5.14.0/"&gt;Perl 5.14.0&lt;/a&gt; ist bereits seit dem 15. Mai 2011 verf&amp;uuml;gbar. Die Neuerungen sind ausf&amp;uuml;hrlich in &lt;a href="http://search.cpan.org/~jesse/perl-5.14.0/pod/perldelta.pod"&gt;perldelta&lt;/a&gt; beschrieben.
&lt;/p&gt;

&lt;p&gt;
Wer die neue Version einfach einmal ausprobieren m&amp;ouml;chte, kann Perl 5.14.0 aus den Sourcen parallel zu einem bestehenden Perl installieren.
&lt;/p&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Vorbereitungen: C-Compiler und Bibliotheken installieren&lt;/h2&gt;
&lt;p&gt;
Um Perl kompilieren zu k&amp;ouml;nnen, werden neben einem C-Compiler weitere Werkzeuge und Bibliotheken ben&amp;ouml;tigt.
Unter Ubuntu 10.04 (LTS) installiert man dazu einfach folgende Pakete:
&lt;/p&gt;
&lt;pre&gt;
$ sudo apt-get install build-essential
$ sudo apt-get install libdb-dev libdb4.7
$ sudo apt-get install libgdbm-dev libgdbm3
&lt;/pre&gt;
&lt;p&gt;
Neuere Ubuntu-Versionen verwenden &lt;i&gt;libdb4.8&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Installation perl-5.14.0&lt;/h2&gt;
&lt;p&gt;
&lt;strong&gt;Ziel:&lt;/strong&gt; Perl 5.14.0 soll parallel zu dem bestehenden Perl 5.10.1 in das Verzeichnis&lt;em&gt; /opt/perl5.14.0&lt;/em&gt; installiert werden.
&lt;/p&gt;
&lt;pre&gt;
$ sudo mkdir /opt/perl5.14.0

$ cd /tmp/
$ wget http://search.cpan.org/CPAN/authors/id/J/JE/JESSE/perl-5.14.0.tar.gz
$ tar xzvf perl-5.14.0.tar.gz
$ cd perl-5.14.0/

$ ./Configure -des -Dprefix=/opt/perl-5.14.0 -Dusethreads
$ make
$ make test
$ sudo make install
&lt;/pre&gt;
&lt;p&gt;
Jetzt sollten zwei verschiedene Perl-Versionen auf dem System vorhanden sein:
&lt;/p&gt;
&lt;pre&gt;
$ /opt/perl-5.14.0/bin/perl -v

This is perl 5, version 14, subversion 0 (v5.14.0) built for i686-linux-thread-multi

Copyright 1987-2011, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
&lt;/pre&gt;
&lt;p&gt;
und
&lt;/p&gt;
&lt;pre&gt;
$ /usr/bin/perl -v

This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi

Copyright 1987-2009, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
&lt;/pre&gt;

&lt;h3&gt;Die neue Version verwenden&lt;/h3&gt;
&lt;p&gt;
F&amp;uuml;r Perl 5.14.0 muss stets der volle Pfad angegeben werden. (Die Umgebungsvariable PATH bleibt unver&amp;auml;ndert.)
&lt;/p&gt;
&lt;p&gt;
Entweder in der &lt;a href="http://de.wikipedia.org/wiki/Shebang"&gt;Shebang-Zeile&lt;/a&gt; 
&lt;/p&gt;
&lt;pre&gt;
&lt;strong&gt;#!/opt/perl-5.14.0/bin/perl&lt;/strong&gt;
use strict;
use warnings;
&lt;/pre&gt;
&lt;p&gt;
oder auf der Kommandozeile:
&lt;/p&gt;
&lt;pre&gt;
$ &lt;strong&gt;/opt/perl-5.14.0/bin/perl&lt;/strong&gt; meinprogramm.pl
&lt;/pre&gt;

&lt;h3&gt;CPAN Module installieren&lt;/h3&gt;
&lt;p&gt;
CPAN-Module lassen sich wie gehabt per &lt;a href="http://search.cpan.org/perldoc?CPAN"&gt;CPAN-Shell&lt;/a&gt; installieren.
&lt;/p&gt;
&lt;pre&gt;
$ /opt/perl-5.14.0/bin/cpan

cpan shell -- CPAN exploration and modules installation (v1.9600)
Enter 'h' for help.

cpan[1]&gt; install YAML
....
Appending installation info to 
&lt;strong&gt;/opt/perl-5.14.0/lib/5.14.0/i686-linux-thread-multi/perllocal.pod&lt;/strong&gt;
&lt;/pre&gt;
&lt;p&gt;
Leider steht noch keine aktuelle Version von &lt;a href="http://search.cpan.org/perldoc?ExtUtils::MakeMaker"&gt;ExtUtils::MakeMaker&lt;/a&gt; zur Verf&amp;uuml;gung.
Einige XS-Module lassen sich wegen der Abh&amp;auml;ngigkeit auf &lt;i&gt;cc_runtime.h&lt;/i&gt; nicht installieren. Abhilfe schafft die manuelle Installation des 
Developer-Releases von ExtUtils::MakeMaker.
&lt;/p&gt;

&lt;pre&gt;
$ wget http://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/ExtUtils-MakeMaker-6.57_11.tar.gz
$ tar xzvf ExtUtils-MakeMaker-6.57_11.tar.gz
$ cd ExtUtils-MakeMaker-6.57_11
$ /opt/perl-5.14.0/bin/perl Makefile.PL
$ make
$ make test
$ sudo make install
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Installation mit App-perlbrew&lt;/h2&gt;
&lt;p&gt;
&lt;a href="http://search.cpan.org/dist/App-perlbrew/"&gt;App-perlbrew&lt;/a&gt;, ist ein Werkzeug, welches die Installation
und Verwendung mehrerer Perl-Versionen erheblich vereinfacht. Root-Rechte werden nicht ben&amp;ouml;tigt.
&lt;/p&gt;
&lt;pre&gt;
$ curl -LO http://xrl.us/perlbrew
$ chmod +x perlbrew
$ ./perlbrew init
$ source ~/perl5/perlbrew/etc/bashrc
$ ./perlbrew install perl-5.14.0 -D=usethreads
....
&lt;/pre&gt;
&lt;h3&gt;Die neue Version verwenden&lt;/h3&gt;
&lt;p&gt;
App-perlbrew ver&amp;auml;ndert &amp;uuml;ber den Schalter &lt;i&gt;switch&lt;/i&gt; die &lt;a href="http://de.wikipedia.org/wiki/Umgebungsvariable"&gt;Umgebungsvariable&lt;/a&gt; PATH
&lt;/p&gt;
&lt;pre&gt;
$ perlbrew switch perl-5.14.0
$ perl -v

This is perl 5, version 14, subversion 0 (v5.14.0) built for i686-linux-thread-multi

Copyright 1987-2011, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

$ which perl
/home/tf/perl5/perlbrew/perls/perl-5.14.0/bin/perl
&lt;/pre&gt;
&lt;p&gt;
Dank der Pfadmanipulation wird nun das &lt;i&gt;passende&lt;/i&gt; Perl auf der Kommandozeile gefunden.
&lt;/p&gt;
&lt;pre&gt;
$ perl  meinprogramm.pl
&lt;/pre&gt;
&lt;p&gt;
Im Programm selbst bietet sich &lt;a href="http://perldoc.perl.org/perlrun.html"&gt;folgende Shebang-Zeile&lt;/a&gt; an:
&lt;/p&gt;
&lt;pre&gt;
&lt;strong&gt;#!/usr/bin/env perl&lt;/strong&gt;
use strict;
use warnings;

print "Perl-Version: $]\n";
&lt;/pre&gt;


&lt;h3&gt;CPAN Module installieren&lt;/h3&gt;
&lt;p&gt;
Das &lt;i&gt;passende&lt;/i&gt; Kommandozeilentool &lt;a href="http://search.cpan.org/perldoc?App::Cpan"&gt;cpan&lt;/a&gt; liegt im Pfad.
&lt;/p&gt;
&lt;pre&gt;
$ perlbrew switch perl-5.14.0
$ cpan
cpan[1]&gt; install YAML
....
Appending installation info to 
&lt;strong&gt;/home/tf/perl5/perlbrew/perls/perl-5.14.0/lib/5.14.0/i686-linux-thread-multi/perllocal.pod&lt;/strong&gt;
&lt;/pre&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Siehe auch&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CPAN: &lt;a href="http://search.cpan.org/~jesse/perl-5.14.0/"&gt;Perl 5.14.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Perl News: &lt;a href="http://perl-nachrichten.de/index.cgi/details/901"&gt;Perl 5.14.0 ver&amp;ouml;ffentlicht - IPv6-Support verbessert uvm.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Heise Developer: &lt;a href="Perl 5.14: Fleißrelease f&amp;uuml;r einen sanften Wandel"&gt;http://www.heise.de/developer/meldung/Perl-5-14-Fleissrelease-fuer-einen-sanften-Wandel-1225865.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl-howto.de/2010/07/appperlbrew-mehrere-perl-installationen-im-heimatverzeichnis.html"&gt;App::perlbrew - Mehrere Perl-Installationen im Heimatverzeichnis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CPAN: &lt;a href="http://search.cpan.org/dist/App-perlbrew/"&gt;App-perlbrew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Perldoc: &lt;a href="http://perldoc.perl.org/perlrun.html"&gt;perlrun&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/_n3o23rVKGQ" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Devel::Modlist - welche Module verwendet ein Programm?</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/03/develmodlist-welche-module-verwendet-ein-programm.html" />
    <id>tag:perl-howto.de,2011://1.215</id>

    <published>2011-03-28T18:30:00Z</published>
    <updated>2011-03-28T18:45:58Z</updated>

    <summary><![CDATA[ Devel::Modlist von Randy J Ray ermittelt und zeigt die Module, die von einem Perl-Programm genutzt werden, &uuml;bersichtlich an. &nbsp; Verwendete Module auflisten Devel::Modlist wird auf der Kommandozeile aufgerufen. $ perl -d:Modlist Programm.pl Angewandt auf ein einfaches Beispielprogramm #!/usr/bin/perl use...]]></summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="101" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="debugging" label="debugging" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dependencies" label="dependencies" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="deployment" label="deployment" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="http://search.cpan.org/perldoc?Devel::Modlist"&gt;Devel::Modlist&lt;/a&gt; von &lt;a href="http://search.cpan.org/~rjray/"&gt;Randy J Ray&lt;/a&gt; ermittelt und zeigt die Module, die von einem Perl-Programm genutzt werden, &amp;uuml;bersichtlich an. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Verwendete Module auflisten&lt;/h2&gt;
&lt;p&gt;
&lt;a href="http://search.cpan.org/perldoc?Devel::Modlist"&gt;Devel::Modlist&lt;/a&gt; wird auf der Kommandozeile aufgerufen.
&lt;/p&gt;
&lt;pre&gt;
$ perl -d:Modlist Programm.pl
&lt;/pre&gt;
&lt;p&gt;
Angewandt auf ein einfaches Beispielprogramm
&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/perl
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;LWP&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
liefert Devel::Modlist folgende Ausgabe auf &lt;a href="http://de.wikipedia.org/wiki/Standard-Datenstr%C3%B6me"&gt;STDERR&lt;/a&gt;:
&lt;/p&gt;
&lt;pre&gt;
AutoLoader             5.71
Carp                   1.17
Config                     
Config_git.pl              
Config_heavy.pl            
DynaLoader             1.10
Exporter             5.64_01
Exporter::Heavy      5.64_01
Fcntl                  1.06
File::Spec             3.33
File::Spec::Unix       3.33
FileHandle             2.02
HTTP::Date             6.00
HTTP::Headers         5.835
HTTP::Message         5.837
HTTP::Request         5.827
HTTP::Response        5.836
HTTP::Status          5.817
IO                   1.25_02
IO::File               1.14
IO::Handle             1.28
IO::Seekable            1.1
LWP                   5.837
LWP::MemberMixin           
LWP::Protocol         5.829
LWP::UserAgent        5.835
SelectSaver            1.02
Storable               2.25
Symbol                 1.07
Time::Local          1.2000
URI                    1.58
URI::Escape            3.30
XSLoader               0.10
constant               1.20
overload               1.10
vars                   1.01
warnings               1.09
warnings::register     1.01
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Optionen&lt;/h2&gt;
&lt;p&gt;
&amp;Uuml;ber Optionen l&amp;auml;sst sich das Verhalten von Devel::Modlist steuern. Die allgemeine Syntax:
&lt;/p&gt;
&lt;pre&gt;
 perl -d:Modlist=option1[,option2,...]
&lt;/pre&gt;

&lt;h3&gt;stdout&lt;/h3&gt;
&lt;p&gt;
Diese Option schickt die Ausgabe von Devel::Modlist zur Standardausgabe &lt;a href="http://de.wikipedia.org/wiki/Standard-Datenstr%C3%B6me"&gt;STDOUT&lt;/a&gt;
&lt;/p&gt;
&lt;pre&gt;
$ perl -d:Modlist=stdout Programm.pl
&lt;/pre&gt;

&lt;h3&gt;nocore&lt;/h3&gt;
&lt;p&gt;
Bei Verwendung dieser Option werden die verwendeten Core-Module nicht angezeigt:
&lt;/p&gt;
&lt;pre&gt;
$ perl -d:Modlist=stdout,nocore Programm.pl
&lt;/pre&gt;
&lt;p&gt;
Angewandt auf ein obiges Beispielprogramm, liefert Devel::Modlist folgende Ausgabe 
&lt;/p&gt;
&lt;pre&gt;
HTTP::Date             6.00
HTTP::Headers         5.835
HTTP::Message         5.837
HTTP::Request         5.827
HTTP::Response        5.836
HTTP::Status          5.817
LWP                   5.837
LWP::MemberMixin           
LWP::Protocol         5.829
LWP::UserAgent        5.835
URI                    1.58
URI::Escape            3.30
&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h3&gt;cpan, cpandist&lt;/h3&gt;
&lt;p&gt;
&lt;em&gt;cpan&lt;/em&gt; reduziert die Liste auf Module, die über das Modul &lt;a href="http://search.cpan.org/perldoc?CPAN"&gt;CPAN&lt;/a&gt; installiert wurden.
&lt;/p&gt;
&lt;pre&gt;
perl -d:Modlist=stdout,cpan Programm.pl
&lt;/pre&gt;
&lt;p&gt;
Angewandt auf ein obiges Beispielprogramm, liefert Devel::Modlist folgende Ausgabe 
&lt;/p&gt;
&lt;pre&gt;
AutoLoader             5.71
Carp                   1.17
Config                     
Config_git.pl              
Config_heavy.pl            
Exporter             5.64_01
File::Spec             3.33
HTTP::Date             6.00
HTTP::Headers         5.835
IO                   1.25_02
LWP                   5.837
Storable               2.25
Time::Local          1.2000
URI                    1.58
XSLoader               0.10
constant               1.20
&lt;/pre&gt;
&lt;p&gt;
&lt;em&gt;cpandist&lt;/em&gt; funktioniert wie &lt;em&gt;cpan&lt;/em&gt;, gibt allerdings den Dateinamen statt des Modulnamen aus: 
&lt;/p&gt;
&lt;pre&gt;
perl -d:Modlist=stdout,cpandist Programm.pl
&lt;/pre&gt;
&lt;p&gt;
Angewandt auf ein obiges Beispielprogramm, liefert Devel::Modlist folgende Ausgabe 
&lt;/p&gt;
&lt;pre&gt;
S/SM/SMUELLER/AutoLoader-5.71.tar.gz
J/JE/JESSE/perl-5.13.9.tar.gz
Contact Author The Perl5 Porters Mailing List &lt;perl5-porters@perl.org&gt;
/opt/perl5.12.2/lib/5.12.2/i686-linux-thread-multi/Config_git.pl
/opt/perl5.12.2/lib/5.12.2/i686-linux-thread-multi/Config_heavy.pl
F/FE/FERREIRA/Exporter-5.63.tar.gz
S/SM/SMUELLER/PathTools-3.33.tar.gz
G/GA/GAAS/HTTP-Date-6.00.tar.gz
G/GA/GAAS/HTTP-Message-6.01.tar.gz
G/GB/GBARR/IO-1.25.tar.gz
G/GA/GAAS/libwww-perl-6.01.tar.gz
A/AM/AMS/Storable-2.25.tar.gz
F/FL/FLORA/Time-Local-1.2000.tar.gz
G/GA/GAAS/URI-1.58.tar.gz
S/SA/SAPER/XSLoader-0.10.tar.gz
S/SA/SAPER/constant-1.19.tar.gz
&lt;/pre&gt;
&lt;h3&gt;stop&lt;/h3&gt;
&lt;p&gt;
Die Option &lt;em&gt;stop&lt;/em&gt; l&amp;auml;dt das Programm und f&amp;uuml;hrt es &lt;strong&gt;nicht&lt;/strong&gt; aus. Die erst zur Laufzeit mit &lt;a href="http://perldoc.perl.org/functions/require.html"&gt;require&lt;/a&gt; oder &lt;a href"http://perldoc.perl.org/functions/eval.html"&gt;eval&lt;/a&gt; geladenen Module k&amp;ouml;nnen nicht ermittelt werden.
&lt;/p&gt;

&lt;h3&gt;zerodefault, noversion&lt;/h3&gt;
&lt;p&gt;
Falls die Versionsnummmer eines Moduls nicht ermittelt werden kann, setzt &lt;em&gt;zerodefault&lt;/em&gt; diese einfach auf 0,  &lt;em&gt;noversion&lt;/em&gt; unterdr&amp;uuml;ckt die Ausgabe der Versionnummern generell.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Siehe auch&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Devel::Modlist"&gt;Devel::Modlist - Perl extension to collect module use information&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Module::ScanDeps"&gt;Module::ScanDeps - Recursively scan Perl code for dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Devel::TraceUse"&gt;Devel::TraceUse - show the modules your program loads, recursively&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?CPAN::FindDependencies"&gt;CPAN::FindDependencies - find dependencies for modules on the CPAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Perl::PrereqScanner"&gt;Perl::PrereqScanner - a tool to scan your Perl code for its prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?CPAN"&gt;CPAN -query, download and build perl modules from CPAN sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl-howto.de/2008/07/cpanfinddependencies.html"&gt;Modulabh&amp;auml;ngigkeiten ermitteln mit CPAN::FindDependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl-howto.de/2010/09/develtraceuse-verwendete-module-ubersichtlich-auflisten.html"&gt;Devel::TraceUse - Verwendete Module &amp;Uuml;bersichtlich auflisten&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/bCv3f3uds8I" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>Potenzmengen berechnen mit List::PowerSet</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/03/potenzmengen-berechnen-mit-listpowerset.html" />
    <id>tag:perl-howto.de,2011://1.214</id>

    <published>2011-03-18T14:50:00Z</published>
    <updated>2011-03-18T14:54:03Z</updated>

    <summary><![CDATA[ Potenzmengen (engl. Powerset) lassen sich mit dem CPAN-Modul List::PowerSet von Nik Clayton einfach berechnen. &nbsp; powerset() und powerset_lazy() List::PowerSet stellt zwei Funktionen, powerset() und powerset_lazy(), bereit. powerset() powerset() nimmt eine Liste (Menge) entgegen und gibt eine Referenz auf eine...]]></summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="101" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="math" label="math" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="http://de.wikipedia.org/wiki/Potenzmenge"&gt;Potenzmengen&lt;/a&gt; (engl. Powerset) lassen sich mit dem CPAN-Modul &lt;a href="http://search.cpan.org/perldoc?List::PowerSet"&gt;List::PowerSet&lt;/a&gt; von &lt;a href="http://search.cpan.org/~nikc/"&gt;Nik Clayton&lt;/a&gt; einfach berechnen.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;powerset() und powerset_lazy()&lt;/h2&gt;
&lt;p&gt;
List::PowerSet stellt zwei Funktionen, &lt;em&gt;powerset()&lt;/em&gt; und &lt;em&gt;powerset_lazy()&lt;/em&gt;, bereit.
&lt;/p&gt;
&lt;h3&gt;powerset()&lt;/h3&gt;
&lt;p&gt;
&lt;em&gt;powerset()&lt;/em&gt; nimmt eine Liste (Menge) entgegen und gibt eine Referenz auf eine Liste von Referenzen auf Arrays zur&amp;uuml;ck - jede Array Referenz enth&amp;auml;lt eine Teilmenge.
&lt;/p&gt;
&lt;p&gt;
Beispiel:
&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/perl 
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;List::PowerSet&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;qw/powerset/&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@input_list&lt;/span&gt; = &lt;span style="color: #CD5555;"&gt;qw/ x y z /&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$powerset&lt;/span&gt; = &lt;span style="color: #00688B;"&gt;powerset&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #00688B;"&gt;@input_list&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;foreach&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$ps&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #00688B;"&gt;@$powerset&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
    &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;[ @$ps ]\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Das Programm erzeugt folgende Ausgabe: 
&lt;/p&gt;
&lt;pre&gt;
[ x y z ]
[ y z ]
[ x z ]
[ z ]
[ x y ]
[ y ]
[ x ]
[  ]
&lt;/pre&gt;

&lt;h3&gt;powerset_lazy()&lt;/h3&gt;
&lt;p&gt;
&lt;em&gt;powerset_lazy()&lt;/em&gt; nimmt, wie &lt;em&gt;powerset()&lt;/em&gt;, eine Liste entgegen und liefert eine Referenz auf eine Subroutine zur&amp;uuml;ck, die als 
Iterator verwendet werden kann. Bei jedem Aufruf des Iterators wird eine weitere Teilmenge als Referenz auf einen Array zur&amp;uuml;ckgegeben. 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;powerset_lazy()&lt;/em&gt; bietet sich vor allem bei umfangreichen Listen an. Im Gegensatz zu &lt;em&gt;powerset()&lt;/em&gt; werden nicht alle Teilmengen 
auf ein Mal berechnet, sondern &lt;a href="http://perldesignpatterns.com/?LazyEvaluation"&gt;lazy evaluiert&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Beispiel:
&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/perl 
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;List::PowerSet&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;qw/powerset_lazy/&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@input_list&lt;/span&gt; = &lt;span style="color: #CD5555;"&gt;qw/ x y z /&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$ps_iterator&lt;/span&gt; = &lt;span style="color: #00688B;"&gt;powerset_lazy&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@input_list&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;while&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$set&lt;/span&gt; = &lt;span style="color: #00688B;"&gt;$ps_iterator&lt;/span&gt;-&amp;gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;

    &lt;span style="color: #228B22;"&gt;# $set is the next powerset entry&lt;/span&gt;
    &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;[ @$set ]\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;
Das Programm erzeugt folgende Ausgabe: 
&lt;/p&gt;
&lt;pre&gt;
[ x y z ]
[ y z ]
[ x z ]
[ z ]
[ x y ]
[ y ]
[ x ]
[  ]
&lt;/pre&gt;

&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

&lt;h2&gt;Siehe auch&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?List::PowerSet"&gt;List::PowerSet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Data::PowerSet"&gt;Data::PowerSet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Data::PowerSet::Hash"&gt;Data::PowerSet::Hash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hop.perl.plover.com/Examples/"&gt;Higher-Order Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.catonmat.net/blog/perl-one-liners-explained-part-three/"&gt;Famous Perl One-Liners Explained, Part III: Calculations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perldoc.perl.org/perlreftut.html"&gt;perlreftut - Mark's very short tutorial about references&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perldoc.perl.org/perllol.html"&gt;perllol - Manipulating Arrays of Arrays in Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wikipedia: &lt;a href="http://de.wikipedia.org/wiki/Potenzmenge"&gt;Potenzmenge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mathepedia: &lt;a href="http://www.mathepedia.de/Potenzmenge.aspx"&gt;Potenzmenge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;mathe-lexikon.at: &lt;a href="http://www.mathe-lexikon.at/mengenlehre/grundlagen/potenzmenge.html"&gt;Potenzmenge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/eEcG2Jx8Doo" height="1" width="1"/&gt;</content>
</entry>

<entry>
    <title>File::Find::Duplicates - mehrfach vorhandene Dateien finden</title>
    <link rel="alternate" type="text/html" href="http://perl-howto.de/2011/02/filefindduplicates-mehrfach-vorhandene-dateien-finden.html" />
    <id>tag:perl-howto.de,2011://1.212</id>

    <published>2011-02-05T11:45:00Z</published>
    <updated>2011-02-05T11:47:32Z</updated>

    <summary> File::Find::Duplicates von Tony Bowden durchsucht Verzeichnisse nach mehrfach vorhandenen Dateien. Vorgehensweise Zunächst erstellt File::Find::Duplicates Listen von Dateien identischer Größe. Nur für Dateien der selben Größe wird eine MD5 Prüfsumme erstellt. Dateien gelten als identisch, wenn sowohl Größe als auch...</summary>
    <author>
        <name>Thomas Fahle</name>
        <uri>http://www.thomas-fahle.de</uri>
    </author>
    
        <category term="101" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="datei" label="datei" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="file" label="file" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://perl-howto.de/">
        &lt;p&gt;
&lt;a href="http://search.cpan.org/perldoc?File::Find::Duplicates"&gt;File::Find::Duplicates&lt;/a&gt; von &lt;a href="http://search.cpan.org/~tmtm/"&gt;Tony Bowden&lt;/a&gt; durchsucht Verzeichnisse nach mehrfach vorhandenen Dateien.&lt;/p&gt;

&lt;h2&gt;Vorgehensweise&lt;/h2&gt;
&lt;p&gt;
Zunächst erstellt &lt;a href="http://search.cpan.org/perldoc?File::Find::Duplicates"&gt;File::Find::Duplicates&lt;/a&gt; Listen von Dateien identischer Größe.
&lt;/p&gt;
&lt;p&gt;
 Nur für Dateien der selben Größe wird  eine &lt;a href="http://de.wikipedia.org/wiki/Message-Digest_Algorithm_5"&gt;MD5&lt;/a&gt; Prüfsumme erstellt.
&lt;/p&gt;
&lt;p&gt;
Dateien gelten als identisch, wenn sowohl Größe als auch MD5-Prüfsumme übereinstimmen.
&lt;/p&gt;
&lt;p&gt;
Diese Vorgehensweise erzielt  eine hohe Geschwindigkeit und nimmt dafür eine sehr geringe Wahrscheinlichkeit für&lt;a href="http://www.mscs.dal.ca/~selinger/md5collision/"&gt; "False Positives"&lt;/a&gt; in Kauf.
&lt;/p&gt;

&lt;h2&gt;Beispiel&lt;/h2&gt;
&lt;p&gt;
Dieses einfache Beispielprogramm nimmt eine Liste von Verzeichnissen als Kommandozeilenargumente entgegen, durchsucht diese rekursiv und gibt die gefunden Duplikate (Name,Größe, MD5) aus.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;find_duplicate_files&lt;/em&gt; liefert im Erfolgsfall eine Liste von Objekten zurück, welche die Methoden &lt;em&gt;size()&lt;/em&gt;, &lt;em&gt;md5()&lt;/em&gt; und &lt;em&gt;files()&lt;/em&gt; zur Verfügung stellen.
&lt;/p&gt;
&lt;p&gt;
Im Misserfolgsfall (keine Duplikate)  wird eine leere Liste zurückgegeben. 
&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/perl
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;strict&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;warnings&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;use&lt;/span&gt; &lt;span style="color: #000000;"&gt;File::Find::Duplicates&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@dirs&lt;/span&gt; = &lt;span style="color: #00688B;"&gt;@ARGV&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #228B22;"&gt;# Basic Sanity Check&lt;/span&gt;
&lt;span style="color: #00688B;"&gt;usage&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;unless&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;scalar&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@ARGV&lt;/span&gt; &amp;gt; &lt;span style="color: #B452CD;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@dupesets&lt;/span&gt; = &lt;span style="color: #00688B;"&gt;find_duplicate_files&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #00688B;"&gt;@dirs&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;

&lt;span style="color: #8B008B; font-weight:bold;"&gt;foreach&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;my&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$dupeset&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #00688B;"&gt;@dupesets&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
	&lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;Duplicate files: &amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #8B008B; font-weight:bold;"&gt;join&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #CD5555;"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #00688B;"&gt;@&lt;/span&gt;{ &lt;span style="color: #00688B;"&gt;$dupeset&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;files&lt;/span&gt; } &lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
        &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;MD5:  &amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$dupeset&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;md5&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
        &lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;Size: &amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #00688B;"&gt;$dupeset&lt;/span&gt;&lt;span style="color: #00688B;"&gt;-&amp;gt;size&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot; Bytes\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
	&lt;span style="color: #8B008B; font-weight:bold;"&gt;print&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;

&lt;a name="usage"&gt;&lt;/a&gt;&lt;span style="color: #8B008B; font-weight:bold;"&gt;sub &lt;/span&gt;&lt;span style="color: #FF0000; font-weight:bold;"&gt;usage&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;
    &lt;span style="color: #8B008B; font-weight:bold;"&gt;warn&lt;/span&gt; &lt;span style="color: #CD5555;"&gt;&amp;quot;Usage: $0 DIR1 DIR2\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
    &lt;span style="color: #8B008B; font-weight:bold;"&gt;exit&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Das Programm erzeugt z.B. folgende Ausgabe:
&lt;/p&gt;
&lt;pre&gt;
perl basic.pl . /tmp/
Duplicate files: ./basic.pl, /tmp/basic.pl
MD5:  9bc2302a67edcd34e3f3cd44f6d5284b
Size: 465 Bytes
&lt;/pre&gt;


&lt;h2&gt;Siehe auch&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?File::Find::Duplicates"&gt;File::Find::Duplicates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?File::Find"&gt;File::Find&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Class::Struct"&gt;Class::Struct&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Digest::MD5"&gt;Digest::MD5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://de.wikipedia.org/wiki/Message-Digest_Algorithm_5"&gt;Message-Digest Algorithm 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/u8y6oMjqgsQ" height="1" width="1"/&gt;</content>
</entry>

</feed>

