Perl-Programmierung: Variablen

Aus Wikibooks



Perl-Variablen[Bearbeiten]

Unter einer Variable versteht man ganz allgemein einen Bezeichner für Daten. Früher konnte man davon sprechen, dass ein Bereich des Hauptspeichers mit dem Variablennamen identifiziert wurde. Im Gegensatz dazu existiert bei Perl die Möglichkeit auch eine Datei, ein Feld in einer Exceltabelle, eine Webseite auf einem Computer am anderen Ende des Globus und viele andere Vorkommen von Daten wie eine Variable zu behandeln. Im Normalfall ist aber auch in Perl eine Variable ein Bezeichner für Daten, die im Hauptspeicher des Rechners liegen. Perl übernimmt dabei die komplette Speicherverwaltung. Es verwendet ein für die Programmierer sehr bequemes System mit einem Zähler für jeden gespeicherten Wert. Mit diesem Zähler kann Perl feststellen, ob in dem Programm noch ein Verweis auf diesen Wert existiert. Variablen können in Perl fast beliebig groß sein. Von undef, dem Standardwert von Perl für eine Variable ohne Inhalt und den vielen Gigabyte Speicher, welche das jeweilige System Perl zur Verfügung stellen kann.

Skalare Variablen[Bearbeiten]

Skalare Variablen sind in Perl-Code leicht erkennbar durch das vorangestellte Dollar-Zeichen ($). Sie können fast jede Art von Daten speichern. Mit dem Zuweisungsoperator = kann ihnen ein Wert zugewiesen werden. In Skalaren werden auch Referenzen (Verweise auf andere Variablen; vergleichbar mit Zeigern in anderen Programmiersprachen) und Objekte gespeichert.

Zahlen[Bearbeiten]

$var = 50;     # ganze Zahl
$var = 0.01;   # Fließkommazahl
$var = 1e2;    # wissenschaftliche Notation – dasselbe wie 100
$var = 1e-2;   # wie 0.01

In Perl als Skriptsprache muss, anders als in anderen, nicht-interpretierten Sprachen wie z. B. C, nicht angegeben werden, ob eine Variable eine ganze Zahl, Fließkommazahl, oder anderes enthält. Perl übernimmt die Bestimmung des Datentyps für uns, abhängig von dem jeweiligen Umfeld, in dem die Variable verwendet wird.

Beispiel[Bearbeiten]
#!/usr/bin/perl

use strict;
use warnings; 

my $a = 2;
my $b = 3;
print "$a + $b = ", $a + $b, "\n";

Die Ausgabe des Programmes:

2 + 3 = 5

Erklärung: Die Shebang-Zeile wurde bereits im letzten Kapitel erläutert, die beiden use-Anweisungen werden unter Stil und Struktur erläutert. In den beiden folgenden Zeilen werden die skalaren Variablen $a und $b mit dem Schlüsselwort my deklariert, außerdem werden ihnen die Werte 2 bzw. 3 zugeordnet. Das Schlüsselwort my beschreibt den Geltungsbereich einer Variable. Die dritte Zeile beginnt mit einer in " eingeschlossene Zeichenkette. Die Variablen werden innerhalb der Zeichenkette als String ersetzt. Hinter der Zeichenkette werden $a und $b mit dem mathematischen Operator + verknüpft. Sie werden also als Zahlen interpretiert und das Ergebnis wird ausgegeben. Abgeschlossen wird die Ausgabe durch einen Zeilenumbruch.

Perl stellt uns eine Vielzahl mathematischer Operatoren zur Verfügung, neben der hier verwendeten Addition ist uns u.a. auch Subtraktion, Multiplikation, Division und Potenzieren möglich (siehe Operatoren).

Zeichenketten (Strings)[Bearbeiten]

$var = 'text';
$var = "text";

Skalarvariablen können auch Zeichenketten (Strings) enthalten. Diese werden, von einfachen (') oder doppelten (") Anführungszeichen umschlossen, der Variablen zugewiesen. Der Unterschied zwischen einfachen und doppelten Anführungszeichen besteht in der sogenannten Variableninterpolation. Dazu ein Beispiel:

#!/usr/bin/perl

use strict;
use warnings;

my $var = 5;
my $text = "Variable enthält: $var";
my $text2 = 'Variable enthält: $var';
print $text;
print "\n";
print $text2;
print "\n";

erzeugt folgende Ausgabe:

Variable enthält: 5
Variable enthält: $var

Was ist passiert? Bei der Zuweisung an $text, bei der wir doppelte Anführungszeichen benutzt haben, sucht der Interpreter in der zugewiesenen Zeichenketten nach Vorkommen von $Variablenname, und ersetzt diese durch den Inhalt der jeweiligen Variable – in unserem Fall also durch den Inhalt von $var. Dies nennt man Interpolation. Eine solche Interpolation wird jedoch bei einfachen Anführungszeichen nicht vorgenommen.

Nicht nur Variablennamen, sondern auch Steuercodes wie \n werden bei einfachen Anführungszeichen ignoriert. Beispielsweise erzeugt

 print "\n";

einen Zeilenumbruch, wohingegen

 print '\n';

einfach die Zeichenfolge \n ausgibt.


Beispiel[Bearbeiten]

Nehmen wir also nochmal das Additions-Beispiel von vorhin und verschönern es ein wenig.

#!/usr/bin/perl

use strict;
use warnings;

my $a = 2;
my $b = 3;
my $c = $a + $b;

print "$a + $b = $c\n";

Ausgabe:

2 + 3 = 5

Arrays[Bearbeiten]

Ein Array enthält im Gegensatz zu einem Skalar nicht genau einen, sondern keinen, einen oder mehrere Werte. Dabei können diese Werte völlig frei gemischt werden. Es ist also möglich in dem selben Array Texte, Ganzzahlen, Kommazahlen u.ä. zu speichern. Zur Unterscheidung zwischen Arrays und Skalaren ist dem Array ein At-Zeichen (@) als Sigilie vorangestellt. Man kann sich ein Array als Liste von Skalaren vorstellen. Dabei werden die einzelnen Werte über ganze Zahlen (Integer) eindeutig identifiziert. Hier ein kleines Beispiel:

#!/usr/bin/perl

use strict;
use warnings;

my @halblinge = ( "Bilbo", "Frodo", "Sam" ); # einfache Liste von Halblingen
print $halblinge[0], "\n";                   # gibt Bilbo aus
print $halblinge[1], "\n";                   # gibt Frodo aus

Was geschieht hier? Nun, zuerst wird ein Array mit dem Namen @halblinge erzeugt. Diesem wird eine Liste zugewiesen. Listen werden in Perl in einfachen Klammern eingeschlossen. Da die Werte in der Liste Strings (Text) sein sollen, müssen sie als solche kenntlich gemacht werden. Dies kann man u.a. mit doppelten Anführungszeichen tun. Als letztes müssen die Werte einer Liste dann noch mit Kommata getrennt werden. Bei Listen von Strings ist es mithilfe des Listenoperators qw möglich, auf Kommata und doppelte Anführungszeichen zu verzichten. Die einzelnen Strings werden dann nur durch Leerzeichen getrennt. Mit dem qw-Operator ( quoted words / Wörter in Anführungszeichen ) sieht das obige Beispiel so aus:

#!/usr/bin/perl

use strict;
use warnings;

my @halblinge = qw( Bilbo Frodo Sam );       # einfache Liste von Halblingen
print $halblinge[0], "\n";                   # gibt Bilbo aus
print $halblinge[1], "\n";                   # gibt Frodo aus

Man kann die Werte einer Liste auch mit => trennen, dies werden wir bei den Hashes sehen.

Aber was soll das nun mit der zweiten und dritten Zeile? Da steht ja nun wieder ein Dollar-Zeichen vor dem Variablennamen. Das ist auch richtig so, denn aus dem Array soll nur ein einzelner skalarer Wert ausgegeben werden. Den Variablennamen mit einem vorgestellten @ an print zu übergeben, würde print aber dazu veranlassen alle Werte des Arrays auszugeben.

Perl unterscheidet hier Arrays von Skalaren, indem es an das Ende der Variable schaut. Dort ist nämlich der Platz des Wertes, auf den zugegriffen werden soll, in eckige Klammern geschrieben. Hierbei ist zu beachten, dass Arrays bei Null anfangen zu zählen und nicht bei Eins, wie man evtl. annehmen könnte.

Die Anzahl der Elemente eines Arrays erhält man, wenn man das Array im skalaren Kontext interpretiert:

my $anzahlHalblinge=@halblinge; 
print $anzahlHalblinge;            # ergibt 3

Man könnte bei diesem Beispiel den skalaren Kontext explizit angegeben indem man die interne scalar-Funktion benutzt. Somit könnte das vorhergehende Beispiel auch so aussehen:

print scalar @halblinge;            # ergibt 3 ( Klammern sind optional, timtowtdi! )

Hashes (assoziative Arrays)[Bearbeiten]

Hashes sind ganz ähnlich wie Arrays Listen von Werten. Aber im Unterschied zu Arrays sind Hashes nicht geradlinig durchnummeriert, sondern jeder Wert bekommt seinen eigenen Namen (key) der frei gewählt werden darf, weshalb sie auch assoziative Arrays genannt werden. Dadurch lassen sich viele Programmieraufgaben wesentlich schneller und schöner lösen, als es mit normalen Arrays möglich wäre.

Damit Hashes von Arrays und Skalaren unterschieden werden können, wird dem Hash ein Prozentzeichen (%) als Sigilie vorangestellt. Man beachte, dass auch bei Hashes dieses Prozentzeichen in ein Dollarzeichen gewandelt wird, wenn auf einzelne, skalare Werte des Hashes zugegriffen wird.

Eine weitere Eigenheit von Hashes ist es, dass der Schlüssel in geschweiften Klammern, und nicht wie bei Arrays in eckigen Klammern eingeschlossen wird.

my %telefon = (
    'MaxMuster'   => '0815/12345',
    'KarlMaier'   => '0815/12346',
    'HansMueller' => '0815/12347' 
);
print $telefon{'KarlMaier'}, "\n";  # gibt 0815/12346 aus!

Um in diesem Beispiel auf alle Schlüssel (in diesem Fall die Namen) zugreifen zu können, kann man sich an der keys-Funktion von Perl bedienen. Diese Funktion liefert eine Liste der Schlüssel aus dem Hash zurück.

my @list_keys = keys %telefon;
for (@list_keys) {
    print $_, "\n";
}

oder kompakter:

for (keys %telefon) {   # Variablen sparen
    print $_, "\n";
}

Dieses Beispiel liefert folgende Ausgabe:

MaxMuster
KarlMaier
HansMueller

Natürlich muss es hier auch eine Möglichkeit geben, die Werte der Identifier im Listenkontext auszugeben. Das Gegenstück zur keys-Funktion ist die values-Funktion. Sie funktioniert nach demselben Prinzip.

my @list_values = values %telefon;
for (@list_values) {
    print $_, "\n";
}

oder kompakter:

for (values %telefon) {   # Variablen sparen
    print $_, "\n";
}

liefert:

0815/12345
0815/12346
0815/12347

WARNUNG:

Die Reihenfolge in denen die Wertpaare in einem Hash angeordnet sind, ist nicht immer dieselbe. Nur weil ein Hash bei einem Durchlauf die Keys oder Values in einer bestimmten Reihenfolge ausspuckt, bedeutet das nicht zwangsläufig, dass das beim nächsten Durchlauf auch noch so sein muss. Zur Sicherheit sollte man hier von der sort-Funktion Gebrauch machen.

Beispiel:

for (sort keys %telefon) {   # Sortierte Liste der Schluessel
    print $_, "\n";
}

Hier ist gewährleistet, dass die Liste, sofern der Hash nicht verändert wurde, immer dieselbe bleibt.