In diesem Fall würde ich sagen, dass die kürze Variante auch die elegantere ist.
RegEx sind von sich aus (meist) schwer zu lesen, was allerdings nicht an Perl liegt, sondern an der Sache selbst.
Und wenn man
$_ und
~ weglässt, sind es ein paar "Sonderzeichen" weniger, die das Auge erfassen muss. Das ist hier kein Golfing...
Zudem war der ursprüngliche Ausdruck falsch. Der
. erfasst jedes Zeichen. Somit wären alle Verzeichnisse, die nur einen oder zwei Zeichen als Namen haben, durch das Raster gefallen.
Und ich finde
grep{$_!~/^(?:\.|\.\.)$/}@array schlechter lesbar als
grep{! /^\.\.?$/}@array
Im ersten Beispiel werden sogar noch Perl-RegEx-Konstrukte verwendet (
(?: )), während man den zweiten Ausdruck ganz einfach lesen kann (reicht schon wenn man UNIX-RegEx kenn). Anfang, ein Punkt und dann vielleicht noch ein Punkt, Ende. Und das ganze noch "verneint"...