Perl 5.10 – was man wissen muss 1

Posted by Bo on November 17, 2008

No Gravatar

Perl 5.10 ist nun bereits eine Weile draussen und hat Einzug auf die gängigen Linux-Distributionen gehalten. Aus diesem Grunde möchte ich an dieser Stelle einen kleinen Reminder bringen, welche Features für den Programmieraltag wirklich der Rede Wert sind. Viele der Neuerungen sind Backports aus der Designarbeit an Perl 6.

Da dies keine Einführung in Perl darstellt, sondern eine Info an Cracks, Admins und solche die es werden wollen, gehe ich nicht auf die Details ein. Ich schlage vor die Code-Beispiele jeweils in die Kommandozeile zu kopieren und zu damit herum zu spielen.

Wenn man die neuen Features benutzen will muss man dies im Skript deklarieren.

use feature ':5.10';

Klein aber Oho

Es gibt viele kleine Änderungen die es aber in sich haben. Ich möchte hier vier herauspicken die sich ganz besonders lohnen.

Sag es

Die kleinste, grösste, simpelste und wichtigste Änderung ist ganz klar die Funktion say. Endlich kann man eine Zeile ohne grosse Schreibarbeit ausgeben!

say 'say means: never ever again print "bla\n"!';

Man mag diese Änderung zwar belächeln. Aber es ist doch wichtig, das dies endlich geschehen ist… und wie ich finde ist es sehr elegant gelungen.

Zeilen lesen

Eine weitere Nettigkeit ist, das nun die Funktion readline wie der diamond operator (<>) agiert. Nun geht das Einlesen einiges intuitiver von der Hand:

say 'press ctrl+d to resume...';
while (readline) {
    print;
}

Clevere Vergleiche

Es steht nun ein sogenannter “smart match operator” zur Verfügung. Er entscheidet selber “intelligent” wie Strings und Zahlen miteinander verglichen werden sollen.

say '0 equals "abc" if compared with ==' if (0 == "abc");
say 'But 0 differs from "abc" if using ~~ "the smart operator"' unless (0 ~~ "abc");

Defined or

Ein neuer Operator ermöglicht einfach Verkettungen. Das besondere ist, das er undef statt false/true auswertet.

sub a { return undef }
sub b { return 'b is defined!' }
sub c { return undef }
say a() // b() // c();

Mal ganz was neues

Neben den kleinen erwähnten Nettigkeiten gibt es aber auch grössere Ergänzungen und Änderungen. Es sind deren zwei die mir auffallen.

Ein “kein” Switch-Statement

Perl hat endlich ganz offiziell sein eigenes Switch-Statement. Doch wie könnte es anders sein, das Statement heisst nicht switch sondern given. Das ganze sieht ziemlich gut aus und kann sehr flexibel angewendet werden.

say 'Tell me something for my switch-statement:';
chomp (my $input = readline);
given ($input) {
    when (undef) { say 'what the heck!'; }
    when ('perl') { say 'you name it!'; }
    when (/\d+/) { say 'nice number...'; continue; }
    say 'you type boring stuff!';
}

Das Statement ist sehr flexibel, da der Mechanismus dahinter simpel ist. given setzt $_ und when wertet dieselbe aus.

Neue Regex Engine!

Die wichtigste Änderung mit dem grössten Impact dürfte die Neuimplementation der Regex-Engine sein. Details wie z.B. das sie nun iterativ statt rekursiv implementiert ist hören sich nett an, ändern aber wenig am Programmieraltag. Das beste Feature für mich ist ganz klar, dass man Teile des Regex nun benennen kann und sich so übersichtlicher Ausdrücke verschachteln lassen.

say 'type any brackets to check if they are consistent';
my $regex = qr{
(?&amp;BRA)     # 'run' the pattern
            #
(?(DEFINE)  # Define section
(?&lt;SIGN&gt;    # Pattern declaration of signs
 [^()]      # everithing except brackets
)           #
(?&lt;BRA&gt;     # Recursive pattern declaration of brackets
 (?&amp;SIGN)*  # any signs or nothing
 \(         # followed by a opening bracket
 (?&amp;SIGN)*  # possibly some further signs
 (?&amp;BRA)*   # recursive call to deeper nested brackets
 (?&amp;SIGN)*  # again there may be some stuff between
 \)         # now we need a closing bracket
 (?&amp;SIGN)*  # and let again space for some signs
 (?&amp;BRA)*   # recursice call to brackets for outside nested ones
)           #
)           # End of the define section
}xms;       # End of the regex declaration
my $in = readline;
if ($in =~ / ^ $regex $ /xms) {
    say 'Your input is valid';
}
else {
    say 'Your input is NOT valid';
}

Dieses Beispiel findet heraus ob die Klammerung vollständig ist. Die Implementation ist von mir, also bitte nicht produktiv verwenden. Ich gebe keine Gewähr ;-)
Wer Besonders gut aufgepasst hat merkt, das dieser Regex rekursiv arbeitet. BRA wird in seiner eigenen Definition wieder verwendet.

Trackbacks

Use this link to trackback from your own site.

Comments
  • Bo

    Ich habe tatsächlich noch etwas vergessen: Die State-Variable.
    Damit ist es möglich eine Variable im Block so zu definieren als wäre sie ausserhalb definiert worden. Dies ist besonders praktisch für Zähler aller Art.

    Hier der Code:

    sub foo {
    my $i = 0;
    state $j = 0;

    $i++; $j++;
    return “i:$i, j:$j”;
    }
    say ‘my $i versus state $j in a freuently called sub witch increments:’;
    say foo() for (0..4);

Leave a Comment
This site is using OpenAvatar based on

Threaded commenting powered by Spectacu.la code.