Stichwortliste zum Vortrag "Perl - Eine Programmiersprache der vierten Generation"

well, there is more than one way to do it ...

Einordnung
Compilierte und Interpretierte Sprachen, Virtuelle Maschine, Java, Skriptsprachen, Shell, Basic
Versionen: unter Perl 5 machen wirs nicht mehr
Kernsprache + Module

Bestandteile
/usr/local/bin/perl (der interpreter)
/usr/local/lib/perl5/.... (library modules, .pm = Perl Module)
Skripte: lala.pl oder lala.cgi
erste Zeile:
	#!/usr/local/bin/perl -w
use Module
require filename
help: perldoc oder man
/usr/local/perl5/... (sourcen der libraries)

Syntactic Details and Small Examples
$scalar, %hash, @list, &function, FILEHANDLE
 1	#/!usr/local/bin/perl -w
 2
 3	$element_54 = $list[54];
 4	if(! defined $element_54) {print "gibts gar nicht!\n"; }
 6
 7	@splice_54 = @list[54]; 				# ist ein "list slice" von 54..54
 8	print "es hat ", scalar(@splice_54), " elemente\n";
 9
10	for($x=1;$x<10;$x++) { print $x, "\n"; }
11
12	foreach $x ( @ARGV ) { print "$x\n"; }
13
14	foreach $x (sort keys %ENV) { print $x, $ENV{$x}, "\n"; }
15
16	while( ($k, $v) = each %ENV ) { print "$k=$v\n"; }
17
18	if(`wc $0` =~ /(\d+)\s+(\d+)\s+(\d+)/){print "dieses script hat $3 zeichen und $2 zeilen\n";}

Datentypen
Skalare

Strings
"lala\n" ne 'lala', 'lala' eq ("la" x 2)

Zahlen
1, -1, 12.3, 1e4, 100 == 0x64, 0100 == 64

true && false: 0 ist false, der leere string ist false

defined & undefined
undef ist ein leerer string
Arrays sind Listen sind Arrays
Hashes (assoziative Arrays)
Objekte
Sonstige: File-Handles, Module, Funktionen

Operationen
Standards von C
Reguläre Ausdrücke
Unix Syscalls: $ret = system("ls");
Unix Shells (%ENV, `ls`)
Einbettung von/in C

Oddments
Defaults und komische Variablen: $_ $@ @_;
dynamisches scoping mit local()
statisches scoping mit my ()
parameter werden by-reference uebergeben, das my ($x) = @_ kopiert sie dann.
alter code benutzt typeglobs, weil references neu sind
Namespaces über Symbol Tables, die man prinzipiell auch auslesen kann. *glob.
while(<STDIN>) { print; } ABER
if($_ = <STDIN>) { print; }
$one_line = <STDIN> ABER
@all_lines = <STDIN>
print while (<>) , weil <> ein synomym für <ARGV> ist, welches wiederum "magisch" ist
while (<*.c>) { chmod 0644, $_; }, aber über die Shell, daher space-probleme. besser: readdir

References
$s = \$lala, $l = \@lala, $h = $\%lala; $$s, $l->[1], $h->{'foo'}

"Vierte Generation"?
Schwerpunkt: Textverarbeitung und System Calls
"Duct Tape" - verbindung und verknotung von 3d-generation-programmen
Mächtige Primitive
Module, die Operationen auf Applikations-Level zur Verfügung stellen
Komplexe Anbindungen (Datenbank-Tabellen über Ties etc.)

Geschwindigkeit, Optimierung, Debuggung
Wer ein perl-Skipt debuggen will, muss sich drei Punkte merken:
  1. das "-w" -Flag,
  2. das "-w" -Flag, und nicht zuletzt
  3. das "-w" -Flag.
Sicherheit: Taint-Check
Es gibt einen Profiler: perl -d:DProf lala.pl; dprofpp

Wann ist Perl die angemessene Sprache?
Wenn eine Aufgabe zu komplex für ein sh/csh/ksh/bash/sed/awk-Skript wird
Wenn viel gesucht und ersetzt wird
Wenn viele Files zu begutachten sind (find)
CGI-Skripte
Wenn ein Programm Betriebssystem-unabhängig sein soll

Installieren einer neuen Library "foo":
	cp foo.tar.gz /usr/local/perl5
	cd /usr/local/perl5
	gunzip foo.tar.gz
	tar xf foo.tar
	cd foo
	perl Makfile.pl
	make
	make test
	make install

Was leistet das C-Interface?
Wenn ein Kommandozeileninterface für eine C-Library benötigt wird
Wenn ein C-Programm eine Skriptsprache bekommen soll

Die Perllib
(wenn ich noch Zeit habe dafür)
Beispiele

Hello

perl -e 'print "hello, world!\n"'
bzw.
#!/usr/local/bin/perl
print "hello, world\n";
aber nicht
#!/usr/local/bin/perl
print hello, world\n;
und auch nicht
#!/usr/local/bin/perl
print 'hello, world\n';

Directory

opendir FOO, '.'; 
@names = readdir FOO; 
closedir FOO
print @names;
print @names, "\n";
print join(' ', @names), "\n";
print join(' ', sort @names), "\n";
print join(' ', reverse sort @names), "\n";