[Cologne-pm] A pro pos: Treffen Morgen?

A. Pagaltzis pagaltzis at gmx.de
Tue Jan 4 10:53:17 CST 2005


* Michael Lamertz <mike at lamertz.net> [2005-01-04 12:02]:
> Auch wenn Date::Manip bei Gebrauch den Raum so stark kruemmt,
> dass vom Server ausgehendes Licht nicht sichtbar ist, nutze
> ich's normalerweise, weil die Konvertierungsmoeglichkeiten
> einfach Big-Time r0ck0rn ;-)
> 
> >     use MIME::Lite;
> >     
> >     use constant WEDNESDAY => 2;
> >     
> >     my $date = DateTime->now->truncate( to => 'month' );
> >     
> >     $date->add(
> >         days => ( WEDNESDAY - $date->day_of_week() + 7 ) % 7,
> >         weeks => 2,
> >     );
> 
> Vergleicht man den oberen Abschnitt mit dem Teil aus der
> Date::Manip-Version, so wird glaub' ich klar, was ich meine:
> 
>     my $date = UnixDate("2nd wednesday in $month", "%d.%m.%Y");

Übrigens, Bug: WEDNESDAY muss natürlich 3 sein.

Ich fühle mich wesentlich wohler wenn ich Perl schreibe, statt
einem zugegebenermassen umfangreichen Parser Strings in einem
schwach definierten Format zu geben. Zum Parsen von Kommando-
zeilenparametern -- wofür ::Manip ja geschrieben wurde -- ergibt
sowas Sinn, denn dort steht weder eine ausdrucksstarke Turing-
vollständige Sprache noch der Raum für deren Verwendung zur
Verfügung, und man will uch nicht der ganzen Welt Perl-Kenntnisse
abnötigen um at(1) zu verwenden.

Es fehlen einfach ein paar Utilityfunktion in DateTime, die
solche Konvertierungen erleichtern. Ich hätte das am liebsten so
geschrieben:

    my $date = DateTime->now
        ->truncate( to => 'month' )
        ->next( day_of_week => 3 )
        ->add( weeks => 2 )
        ->dmy( '.' );

Ich denke, da verschwimmt der Vorteil von ::Manip schnell.
Vergiss nicht, dass du erst noch $month ermitteln musst -- deine
eine Zeile reicht also allein nicht aus. Und dann hast du eine in
einem nicht weiter definierten Format als Strings geschriebene
Angabe gegenüber ein Schnippsel glasklarem Perl.

DateTime rockt das Haus. :-)

> >     my $msg = MIME::Lite->new(
> >         # ... snip ...
> >         FH          => *DATA,
> 
> Ja, ich hatte den Kram auch 'mal in DATA, aber da bekommt man
> halt keine Variablen 'rein,

Naja, das ist nicht die Haupt-Stilfrage in dem Skript; an
Variablen hatte ich auch nicht gedacht. Nur unterbricht es da
an der Stelle den Programmfluss so blöde.. vor allem wegen der
mangelnden Einrückung des Heredoc. Vielleicht sowas?

    sub unindent {
        local $_ = shift;
        s/\A\n//; s/\s*\z//;
        my ( $ind ) = /\A(\s*)/; s/^$ind//mg;
        return $_;
    }

    sub mail_for {
        my ( $date ) = @_;
        From        => 'Michael Lamertz <mike at lamertz.net>',
        To          => 'Cologne Perl Mongers <cologne-pm at mail.pm.org>',
        Subject     => "Treffen am $date...",
        Encoding    => 'quoted-printable',
        Data        => unindent qq{
            Yo!
            
            Das nächste Treffen findet wie gewohnt statt in der
            
                Sansibar
                Trierer Str. 41
                50674 Köln
                ab ca. 18:30
            
            Dies ist eine automatisch erzeugte Nachricht.  Sollte mittlerweile auf der
            Liste ein anderer Termin verabredet worden sein, so ist diese Mail hinfällig.
        };
    }

    # später:

    my $msg = MIME::Lite->new( mail_for $date->dmy( '.' ) );

Da sind die Zuständigkeiten dann besser verteilt und das
hässliche strftime()-Format verschwindet auch.

So eine unindent-Funktion wie diese schreibe ich übrigens in
jedem dritten oder vierten Programm... es sollte wirklich eine in
irgendeinem Core-Modul zur Verfügung stehen...

> Ansonsten scheint mir das doch so ziemlich identisch.

Naja, allzuviel konnte man ja hier eh nicht anders machen. :-)

Gruss,
-- 
#Aristoteles
*AUTOLOAD=*_;sub _{s/(.*)::(.*)/print$2,(",$\/"," ")[defined wantarray]/e;$1}
&Just->another->Perl->hacker;


More information about the Cologne-pm mailing list