Hash-Slices erleichtern den wahlfreien Zugriff

Namentliche Adressierung ist zweckmäßiger als ein namenloser Index

Betrachten wir das Rückgabearray der Funktion localtime() bzw. gmtime() so ist es ziemlich kniffelig, das Jahr herauszuziehen, denn der dazugehörige Index [5] besagt gar nichts.

#  0    1    2     3     4    5     6     7     8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
                                            localtime(time);

Zum Verbessern der Adressierbarkeit ist ein Hash-Slice sehr hilfreich: Somit bekommen die einzelnen Felder einen aussagekräftigen Namen und der Zugriff gestaltet sich damit viel leserlicher:

my %t = ();
@t{qw(sec min hour mday mon year wday yday isdst)} = localtime;
print Dumper \%t;
$VAR1 = {
    'hour'  => 17,
    'isdst' => 1,
    'mday'  => 11,
    'min'   => 49,
    'mon'   => 9,
    'sec'   => 25,
    'wday'  => 5,
    'yday'  => 283,
    'year'  => '119'
};

print 1900 + $t{year};
        # 2019

Tie::Hash für definierte Werte

Nun befassen wir uns mit dem Hash-Slice im Hinterkopf mit einem weiteren Thema und dem Fall, daß bestimmte Werte zu einem Hash-Key auch undefiniert sein können. So liefert URI::Split::uri_split($uri) ein Array

($scheme, $auth, $path, $query, $frag) =
  uri_split($uri);

in dem einzelne Werte $query, $frag durchaus auch undefiniert sein können. Um das zu vermeiden, also dafür zu sorgen daß stets ein definierter Wert vorliegt, nehmen wir die Basisklasse Tie::StdHash zuhilfe und definieren neben der obligatorischen Methode TIEHASH{} die Methode FETCH{}. Der Einfachheit halber habe ich dieses Beispiel in der Klasse main erstellt, wer das nachbauen möchte, kann sich natürlich auch einen anderen Namen für eine eigene Package überlegen:

use strict;
use warnings;
use URI::Split qw(uri_split);
use Tie::Hash;
use base qw(Tie::StdHash);

sub TIEHASH{
    my $class = shift;
    my $addr = shift;
    eval{
        my %uri = ();
        @uri{qw(scheme auth path query frag)} =
            uri_split($addr);
        my $self = bless \%uri;
    }
}

sub FETCH{
    my $self = shift;
    my $key  = shift;
    return defined $self->{$key} ? $self->{$key} : '';
}

tie my %uri, 'main', "http://example.com/index.html?foo=bar#erl"
  or die $@;

print Dumper \%uri;

$VAR1 = {
    'auth'   => 'example.com',
    'frag'   => 'erl',
    'path'   => '/index.html',
    'query'  => 'foo=bar',
    'scheme' => 'http'
};

Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de.