pl: Perl als "Hackersprache" - konkrete historische Beispiele?

Beitrag lesen

problematische Seite

Moin,

nun, die Lesbarkeit obliegt stets einer eigenen Entscheidung. Ein schöner Hack ist die Vorbelegung von Funktionsargumenten mit Default-Values, in Perl ist das ganz einfach:

use strict;
use warnings;
use Carp;

sub new{
    my $class = shift;
    # Numbers decimal, hexadecimal
    my %nr = (
        dec => 0,
        hex => 0,
    @_);

    return eval{
        croak "Wrong format for hexadecimal number!"
            unless $nr{hex} =~ /^[0-9a-fA-F]+$/;
        croak "Wrong format for decimal number!"
            unless $nr{dec} =~ /^\d+$/;
        my $self = bless{
            hex => hex($nr{hex}),
            dec => $nr{dec}
        }, $class;
        $self->compare() or carp "The numbers are not equal!";
        $self;
    };
}

sub compare{
    my $self = shift;
    $self->{hex} == $self->{dec};
}

my $m = main->new( hex => 'FF', dec => 255 ) or die $@;

Also eine kontextgerechte Verwendung der Perlinternen Variable @_ die sehr vielgestaltig sein kann. Es gibt eine ganze Reihe vordefinierter Variablen die u.a. auch das Verhalten nachgelagerter Funktionen bestimmen, Beispiel:

    $,      The output field separator for the print operator. If defined,
            this value is printed between each of print's arguments. Default
            is "undef".



local $, = "\n";
print 1, 2, 3;

Was bewirkt, daß im Listenkontext von print() jedes Element auf einer eigenen Zeile ausgegeben wird. perldoc perlvar gibt diese vordefinierten Variablen samt Beschreibung aus.

Nochn Hack:

$, = "\n";
print stat($0), stat(_) ;

Ausgegeben wird 2x dasselbe, nämlich das was stat() für das eigene Script ermittelt was mit vollständiger Pfadangabe in $0 zu finden ist. Beim 2. Aufruf der stat() wird jedoch anstelle $0 das UnderscoreHandle _ verwendet, was nunmehr auf $0 zeigt.

Aber bei _ wie auch bei $_ muss man schon sehr genau hingucken, daß da auch daß drinsteht was man erwartet.

Hash Slice

my %stat = ();
@stat{qw(dev ino mode nlink uid gid rdev size atime mtime ctime blkize blocks)} =
    stat($0);

print ''.localtime $stat{mtime};

MfG