Hash-Slices erleichtern den wahlfreien Zugriff
Namentliche Adressierung ist zweckmäßiger als ein namenloser Index
- Abstrakte Datentypen in c deklarieren und in Dateien speichern
- Bilder verkleinern mit Perl und GD Library
- Bilder verkleinern, Thumbnails erzeugen mit PHP
- Binary und UTF-8 in MySQL Tabellen speichern
- CPAN Module Device::USB für Win32 compilieren und installieren
- Dateinamen in UTF-8 auf beliebigen Betriebssystemen
- Datentypen haben plattformübergreifend stets dieselbe Byte-Länge
- Datum als lange Zählung und Uhrzeit in dezimaler Darstellung
- Den Zustand von Checkboxen numerisch kodieren
- Der letzte Rest: GET, PUT, POST, DELETE ...
- Der richtige Umgang mit Binaries in C und in Perl
- Die Multi-Media-Mail-Datei der Zukunft, SMS, MMS, Internet-Mail
- Drucken auf einen Netzwerkdrucker mit Perl
- Ein eigenes Forum programmieren, Zustandsmodell einer Webanwendung
- Entwickeln auf dem Lokalen Rechner, dem localhost
- Ganze Zahlen in Dateien Schreiben in Programmiersprachen c, Perl usw.
- Globale Variablen der main-Class in einem Objekt bündeln
- HTTP/1.1 Multiple Request, Persistent Connection und Pipelining
- Hash-Slices erleichtern den wahlfreien Zugriff
- Interne Zeichenkodierung, Characters, Bytes und Bytesemantics
- Julianischen und Gregorianischen Kalender berechnen mit C
- Just another OOP Tutorial for Perl
- Little Endian, Big Endian
- Locken von Dateien für atomare Lese- und Schreibzugriffe
- Modern Perl, Modern Style, Perl OOP, TDD
- Nameserver-Abfragen, UDP mit Perl und mit C
- PHP serialize, unserialize ineffizient
- Perl OOP: Getter automatisieren ohne Gettermethoden zu definieren
- Perl's Exception::Class oder Exceptions klassifizieren
- Perl-Äquivalent zu PHP __toString()
- Perl5 OOP Overload und für was das gut ist
- Perl6 Perls Zukunft oder ein totgeborenes Kind
- Perl: Dependency Injection als Design Pattern
- Perl: Referenzen auf Variablen und Funktionen
- RFC gerechte Formate für Datum und Zeit
- RTSP Real Time Streaming Protocol leicht verständlich
- Random Access, Persistenz und ein Schichtenmodell
- Schlüselparameter, Zweckbestimmung und Umgang
- Serialize Algorithmen leicht verständlich, Binary safe Read and Write
- Serverumgebung nach CGI/1.1
- Simple Mail Transfer Protocol einfach erklärt
- Transformation von Datenstrukturen für eine transportgerechte Verpackung
- Warum ein Data Abstraction (Access) Layer
- Webformulare und Fehlerbehandlung beim Senden der Daten mit Ajax
- XML und der Unsinn, Random Access auf Dateiebene abzubilden
- Anwendungsbeispiele und Programmieren mit JavaScript
- Mein Framework gibt es auch in PHP
- Perl ist meine erste Wahl zum Programmieren von Webanwendungen
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. sos@rolfrost.de.