Komplexe Datenstrukturen



Ähnliche Dokumente
Komplexe Datenstrukturen

Komplexe Datenstrukturen

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Modellierung und Programmierung 1

Objektorientierte Programmierung

Studentische Lösung zum Übungsblatt Nr. 7

Einführung in die Programmierung

Lehrer: Einschreibemethoden

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Einführungskurs MOODLE Themen:

Einführung in die Programmierung

Einführung in. Logische Schaltungen

Zählen von Objekten einer bestimmten Klasse

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

AutoCAD Dienstprogramm zur Lizenzübertragung

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Anleitung über den Umgang mit Schildern

Arbeiten mit UMLed und Delphi

Einführung in die Java- Programmierung

Suchmaschinen. Universität Augsburg, Institut für Informatik SS 2014 Prof. Dr. W. Kießling 23. Mai 2014 Dr. M. Endres, F. Wenzel Lösungsblatt 6

Einführung in die C++ Programmierung für Ingenieure

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Webalizer HOWTO. Stand:

Erwin Grüner

Scala kann auch faul sein

Informatik Grundlagen, WS04, Seminar 13

Wärmebildkamera. Arbeitszeit: 15 Minuten

Datenbanken Kapitel 2

Diana Lange. Generative Gestaltung Operatoren

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Bruchrechnung Wir teilen gerecht auf

Deutsches Rotes Kreuz. Kopfschmerztagebuch von:

Objektorientierte Programmierung mit C++ Vector und List

Win-Digipet V 9.2 Premium Edition Wie bastele ich mir steuerbare Kontakte. Wie bastele ich mir steuerbare Kontakte? -Quick-And-Dirty-Lösung-

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

Das Festkomitee hat die Abi-Seite neu konzipiert, die nun auf einem (gemieteten) Share Point Server

Luis Kornblueh. May 22, 2014

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

Grundbegriffe der Informatik

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Wenn man nach Beendigung der WINDOWS-SICHERUNG folgendes angezeigt bekommt

7 Rechnen mit Polynomen

Um das Versenden von Anhängen an s zu ermöglichen, wurde der Assistent für die Kommunikation leicht überarbeitet und wo nötig verbessert.

Ohne Fehler geht es nicht Doch wie viele Fehler sind erlaubt?

Professionelle Seminare im Bereich MS-Office

Wir arbeiten mit Zufallszahlen

SUDOKU - Strategien zur Lösung

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

1 Mathematische Grundlagen

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

teamsync Kurzanleitung

Abwesenheitsnotiz im Exchange Server 2010

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Melde- und Veröffentlichungsplattform Portal (MVP Portal) Hochladen einer XML-Datei

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Systemvoraussetzung < zurück weiter >

Neun Strategien der Partnerarbeit

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel

MSXFORUM - Exchange Server 2003 > SMTP Konfiguration von Exchange 2003

Typo3 - Schulung: Fortgeschrittene I an der Hochschule Emden/Leer

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Leichte-Sprache-Bilder

Browsereinstellungen für moneycheck24 in Explorer unter Windows

ecaros2 - Accountmanager

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Vorgehensweise bei Lastschriftverfahren

Dokumentenverwaltung im Internet

Info-Veranstaltung zur Erstellung von Zertifikaten

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Programmierkurs Java

V o r w o r t. A n l e i t u n g

Anwendungsbeispiele Sign Live! Secure Mail Gateway

Historical Viewer. zu ETC5000 Benutzerhandbuch 312/15

Workflows verwalten. Tipps & Tricks

Internet online Update (Mozilla Firefox)

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Dreamweaver 8 Einführung

Informatik Kurs Simulation. Hilfe für den Consideo Modeler

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

MdtTax Programm. Programm Dokumentation. Datenbank Schnittstelle. Das Hauptmenü. Die Bedienung des Programms geht über das Hauptmenü.

Mediator 9 - Lernprogramm

Universität Augsburg, Institut für Informatik Wintersemester 2011/2012 Prof. Dr. W. Kießling 03. Feb Semesterklausur

Java: Vererbung. Teil 3: super()

5.2 Neue Projekte erstellen

Übung Theoretische Grundlagen

Anleitung SEPA-Lastschriften mit VR-NetWorld Software 5

Java Kurs für Anfänger Einheit 5 Methoden

Theoretische Grundlagen der Informatik

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

PHP - Projekt Personalverwaltung. Erstellt von James Schüpbach

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren:

Übungsaufgaben zur Programmiersprache Python

Transkript:

Perl-Praxis Komplexe Datenstrukturen Jörn Clausen, Jan Krüger Jens Reeder, Alex Sczyrba AG Praktische Informatik Technische Fakultät Universität Bielefeld {asczyrba,jkrueger@techfak.uni-bielefeld.de 1

Übersicht Hashes Referenzen komplexe Datenstrukturen 2

Hashes dritter grundlegender Datentyp von Perl Paare aus keys und values Notation: %hash ganzes Hash, $hash{key einzelner Wert Schlüssel ist eindeutiger String Zuweisung einzelner Paare: $days{jan = 31; $days{feb = 28; $days{mar = 31; Verwendung: $hours = ($days{jan + $days{feb) * 24; 3

Aufgaben Wieviele Schlüssel enthält das folgende Hash: $hash{1 = 1; $hash{1.0 = 2; $hash{ 1 = 3; $hash{ 1.0 = 4; Schlüssel sind Strings: print $hash{1,"\n"; print $hash{1.0,"\n"; print $hash{ 1,"\n"; print $hash{ 1.0,"\n"; Ausgabe: 3 3 3 4 4

Definition von Hashes Zuweisung durch Liste: %days = ( jan, 31, feb, 28, mar, 31); schlecht lesbar schlecht erweiterbar, fehleranfällig besser: %days = ( jan => 31, feb => 28, mar => 31 ); => impliziert quotes um Schlüssel 5

Verwendung von Hashes Liste aller Schlüssel eines Hashes: @months = keys(%days); typische Verwendung: foreach $mon (keys(%days)) { print "$mon has $days{$mon days\n"; Reihenfolge der Schlüssel undefiniert lexikographisch sortiert: foreach $mon (sort(keys(%days))) {... values liefert Liste aller Werte 6

Aufgaben Auch aus Hashes kann man slices extrahieren. Welcher funny character gehört an die Stelle des Fragezeichens??days{jan,mar Lies die Datei NC 000913.gbk ein und extrahiere jeweils den Gen-Namen und die zugehörige Protein-ID. Speichere die Informationen in einem Hash und gib anschließend eine sortierte Liste aller Gene mit den zugehörigen IDs aus. foreach $gene (sort keys %proteins) { print "$gene\t".$proteins{$gene."\n"; #... and /protein_id if (($line = m!/protein_id="(\s+)"!) && ($feature eq CDS )) { $protein id = $1; # if we are inside a CDS feature, look for /gene... if (($line = m!/gene="(\s+)"!) && ($feature eq CDS )) { $gene = $1; # if we have a protein_id already, store it if ($protein id) { $proteins{$gene = $protein id; $protein id = ; $gene = ; while($line = <IN>) { if ($line = /ˆ {5(\S+)\s+/) { # new feature? $feature = $1; Da der Slice eine Liste von skalaren Werten zurückliefert, muß ein @ verwendet werden. Wir suchen erst nach dem Feature CDS, und darin die keys /gene und /protein id 7

Verwendung von Hashes, cont. alternative Methode: while (($month, $days) = each(%days)) { print "$month has $days days\n"; Zuweisung an Skalar liefert nur Schlüssel: $month = each(%days); each, keys, values benutzen selben Zähler Verhalten bei Veränderung des Hashes undefiniert 8

Hash als Menge Benutze nur Schlüssel, ignoriere Werte 6 aus 49, ohne Zusatzzahl: while (keys(%numbers) < 6) { $randnum = int(rand(49)) + 1; $numbers{$randnum = 1; print join(", ", keys(%numbers)),"\n"; Dieses Beispiel ließe sich auch mit einem Array lösen. Allerdings würde es potentiell mehr Speicher belegen, bis zu 50 Einträge. Außerdem ließe sich nicht so leicht überprüfen, ob bereits sechs unterschiedliche Zahlen gezogen wurden. Falls die Elemente der Menge keine Zahlen sind, kann man kein Array verwenden. 9

Schlüssel oder Wert? Arten des Vorhandenseins : %hash = ( a => 1, b => 0, c => undef ); foreach $x ( a, b, c, d ) { print "$x is true\n" if $hash{$x; print "$x is defined\n" if defined($hash{$x); print "$x exists\n" if exists($hash{$x); Wert und Schlüssel löschen: delete($hash{a); a is true a is defined a exists b is defined b exists c exists 10

Aufgaben Zähle die Häufigkeit der Enzymklassen -.-.-., die in E. coli annotiert sind (NC 000913.gbk). Gib eine sortierte Liste der Enzymklassen aus, mit den häufigsten Klassen oben und den seltensten unten. Ist es möglich, einem Schlüssel eine Liste von Werten zuzuordnen? Was passiert hier: %hash = ( a => (1, 2, 3), b => (4, 5, 6), c => (7, 8, 9) ); Enzymklassen: open(in,$infile) die "cannot open infile: $!"; while($line = <IN>) { if ($line = m!/ec number="(\s+\.\s+\.\s+)\.\s+"!) { $class{$1++; close IN; foreach $c (sort { $class{$b <=> $class{$a keys %class) { print "$c.- \t".$class{$c."\n"; Das Hash enthält die folgenden Paare: a => 1, 2 => 3, b => 4, 5 => 6, c => 7, 8 => 9 Es gelten die bisher vorgestellten Regeln: => ist nur eine alternative Schreibweise für,, und Listen werden flachgeklopft. Daraus ergibt sich das gezeigte Ergebnis. 11

Referenzen Verweise auf Daten ähnlich zu Zeigern, aber einfacher keine Pointer-Arithmetik zwei Arten: symbolische Referenzen echte Referenzen analog zu symbolic links und hard links Grundlage komplexer Datenstrukturen 12

Referenzen, cont. Referenzen definieren: $scalar = Joe User ; $scalar_ref = \$scalar; @array = (1, 2, 3, 4, 5); $array_ref = \@array; %hash = (a=>1, b=>2); $hash_ref = \%hash; Referenz selbst ist Skalar Dereferenzierung: $name = $$scalar_ref; @nums = @$array_ref; $num = $$array_ref[2]; %rel = %$hash_ref; $val = $$hash_ref{a; 13

Aufgaben Überzeuge Dich davon, daß man eine Referenz auf ein Array bilden kann: @array = (1, 2, 3, 4, 5); $array_ref = \@array; und diese anschließend wieder dereferenzieren kann: foreach $num (@$array_ref)... Welchen Wert hat $array_ref? Was passiert, wenn Du den falschen funny character zur Dereferenzierung verwendest: $what = $$array_ref; @what = @$hash_ref; Die Referenz enthält den Typ des referenzierten Objekts und eine Speicheradresse: ARRAY(0x34288) Perl läßt sich durch einen falschen funny character nicht austricksen. Das Programm wird mit Fehlermeldungen Not a SCALAR reference at... bzw. Not an ARRAY reference at... abgebrochen. 14

Referenzen, cont. alternative Notation: $num = $array_ref->[2]; $val = $hash_ref->{a; funktioniert auch über mehrere Ebenen: $scalar_ref_ref = \$scalar_ref; $name = $$$scalar_ref_ref; anonyme Referenzen: $array_ref = [1, 2, 3, 4, 5]; $hash_ref = {a=>1, b=>2; 15

komplexe Datenstrukturen Hash von Listen: %hash = ( a => [1, 2, 3], b => [4, 5, 6], c => [7, 8, 9] ); Zugriff auf einen Hash-Wert (eine Liste): $array_ref = $hash{b; $num = $array_ref->[1]; partielle Dereferenzierung: @a = @$hash{a; @a = @{$hash{a; # funktioniert nicht 16

komplexe Datenstrukturen, cont. Zugriff auf ein Element in einer Liste: $val = $hash{b->[2]; -> kann zwischen Klammern weggelassen werden: $val = $hash{b[2]; beachte: %hash echtes Hash, daher kein -> vor erster Klammer und: -> nicht mit => verwechseln 17

LoLs,... list of lists: @atoms = ( [ Wasserstoff, H, 1], [ Helium, He, 4], [ Lithium, Li, 6] ); Zugriff: $atoms[1]->[2] $atoms[0][1] 18

... HoHs,... hash of hashes: %atoms = ( H => { name => Wasserstoff, mass => 1, He => { name => Helium, mass => 4, Li => { name => Lithium, mass => 6 ); Zugriff: $atoms{he->{mass $atoms{li{name 19

... und Kombinationen hash of lists: %atoms = ( H => [ Wasserstoff, 1], He => [ Helium, 4], Li => [ Lithium, 6] ); list of hashes: @atoms = ( { name => Wasserstoff, symbol => H, mass => 1, { name => Helium, symbol => He, mass => 4, { name => Lithium, symbol => Li, mass => 6 ); 20

dynamische Datenstrukturen komplexe Datenstrukturen dynamisch erzeugen: @names = ( Wasserstoff, Helium, Lithium ); @symbols = ( H, He, Li ); @masses = (1, 4, 6); while (@names) { $name = shift(@names); $symbol = shift(@symbols); $mass = shift(@masses); push(@atoms, { name => $name, symbol => $symbol, mass => $mass ); 21

Visualisierung zur Fehlersuche hilfreich: use Data::Dumper; %atoms =... print Dumper \%atoms; use sehen wir uns später genauer an Ausgabe: $VAR1 = {... H => [ Wasserstoff, 1 ], 22

Aufgaben Die Datei /vol/biodb/genomes/h sapiens/chr 21/NT 011512.gbseqxml enthält die Annotation des Contigs NT 011512 von Chromosom 21 des Menschen in XML-Format. Parse die Features gene und mrna und speichere die Namen des Gens, die GeneID und die IDs der Transkripte im Hash %genes und die Exonpositionen für jedes Transkript im Hash %transcripts. Es soll folgendes möglich sein: $geneid = $genes{donson{geneid; @transcripts = @{$genes{donson{transcripts; @exons = @{$transcripts{nm 145795.1; Es sind zwei Datenstrukturen zu erstellen: %genes = { donson => { geneid => 29980, transcripts => [ NM_145795.1, NM_145794.1, NM_017613.2 ]... ; %transcripts = { NM_145795.1 => [ 20575746..20575871, 20592289..20592477 ], NM_017613.2 => [ 20575746..20575871, 20592579..20593369 ], NM_145794.1 => [ 20575746..20575871, 20578915..20579081, 20582178..20588093 ]... ; Die Schlüssel geneid und transcripts sind statisch, die anderen Schlüssel werden aus den gelesenen Daten erzeugt. 23