Thread Hashvalues nach Variablen sortieren: SCHWER (25 answers)
Opened by Gast at 2004-09-01 16:49

DayGlo
 2004-09-01 18:10
#49756 #49756
User since
2004-09-01
5 Artikel
BenutzerIn
[default_avatar]
Also mein problem ist viel komplizierter, glaube ich. Wollte da mit dem Kino veranschaulichen. Hier kommt mal mein Programm:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#! perl -w
use strict;

use CGI qw/ :standard/;

my @datahashes = daten('fp.txt');     # Daten werden allen Subroutinen zugänglich gemacht


print page('Flughafen Bielefeld',print_text_html(@datahashes));   # der Seite wird der Name Flughafen gegeben, der Subroutine werden die Daten übergeben  print "$day";

sub daten {
   my $file = shift;                                      #???
   open(FILE,$file) || die "Datei $file nicht gefunden!";     # die Datei fp.txt, wie ganz oben angegeben, wird geöffnet

   my %am = my %ziel = my %von = my %gate = my %arrival = my %depart =();        # es werden leere Hashes deklariert

while ( defined (my $line = <FILE>) ) {                    # durch die while-Schleife kann die Datei Zeile für Zeile eingelsen werden
   chomp $line;                                           # chomp entfernt den Zeilenumbruch
   my @fields = split(' ', $line);                        # das array wird in zeilen zerlegt
   my $flugnr = $fields[1];                               # das 2. Element des Arrays wird als $flugnr deklariert
   $am{$flugnr} = $fields[0];                             # die restlichen Elemente werden unter dem Key flugnr abgelegt
   $ziel{$flugnr} = $fields[2];
   $von{$flugnr} = $fields[3];
   $gate{$flugnr} = $fields[4];
   $arrival{$flugnr} = $fields[5];
   $depart{$flugnr} = $fields[6];
};

close(FILE);                                                  # die Datei wird wieder zugemacht
   return (\%am,\%ziel,\%von,\%gate,\%arrival,\%depart);     # Hashreferenzen werden zurückggeben. Die Rückgabe mehrerer Hashes ist nicht möglich, weil
};                                                            # Perl diese sonst zu einem einizgen langen Hash zusammenpacken würde


sub datum_uhrzeit {                                                           #neue Subroutine
   my ($Sekunden,$Minuten, $Stunden, $Monatstag, $Monat,                    # Den Variablen wird die reale Zeit/das reale Datum übergeben
   $Jahr, $Wochentag) = localtime(time);
   my $CTIME_String = localtime(time);
   $Monat+=1;
   $Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat;
   $Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag;
   $Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden;
   $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
 
   $Jahr+=1900;
   my @Wochentage = ("Sonntag","Montag","Dienstag","Mittwoch","Do
nnerstag","Freitag","Samstag");

   my $datum = "$Wochentage[$Wochentag], der $Monatstag.$Monat.$Jahr";
   my  $uhrzeit = "$Stunden:$Minuten";

   return ($uhrzeit,$datum,$Monatstag,$Monat,$Jahr);
};


sub status {
 my($am,$ziel,$von,$gate,$arrival,$depart)=@_;          #Aufruf Subroutine
 my ($uhrzeit,$datum,$Monatstag,$Monat,$Jahr) = &datum_uhrzeit();               #Aufruf Subroutine

 my ($std,$min) = split(':',$uhrzeit);                  #realeUhrzeit wird in Minuten und Stunden aufgeteilt
 my $realminutes = 60*$std + $min;                      #reale Uhrzeit wird nur noch in Minuten angegeben


  my %status=();

 foreach my $flugnr ( keys %$am ) {
 my ($stunde,$minute) = split(':',$depart->{$flugnr});  #depart-Uhrzeit wird in Minuten und Stunden aufgeteilt
 my ($departday,$departmonth,$departyear) = split('\.',$am->{$flugnr});

 my $departminutes = 60*$stunde + $minute;              #depart-Uhrzeit wird nur noch in Minuten angegeben
 my $info=$departminutes-$realminutes;
 
 my $status='';
SWITCH:
{
 if ( ($info <= -6) && ($Monatstag eq $departday) && ($Monat eq $departmonth) && ($Jahr eq $departyear) ) {
    $status="weg"; last SWITCH; };
 
 if ( ($info <= 0) && ($Monatstag eq $departday) && ($Monat eq $departmonth) && ($Jahr eq $departyear) ) {
    $status="startet"; last SWITCH; };

 if ( (($info <= 10) && ($Monatstag eq $departday)) && (($Monat eq $departmonth) && ($Jahr eq $departyear))) {
    $status="Boarding"; last SWITCH; };

 if ( (($info <= 30) && ($Monatstag eq $departday)) && (($Monat eq $departmonth) && ($Jahr eq $departyear))) {
    $status="Check in"; last SWITCH; };

    $status="am Boden";
};

 $status{$flugnr}=$status;                                              # der Status auf gestartet umspringen
};
 return %status;                                                       #$status wird zurück gegeben
};


Ich muss eine Aziegetafel für den Fulghafen schreiben, bei der die Flüge natürlich geordnet nach Datum und Uhrzeit sein müssen. Hoffe, ihr steigt da durch...
Meine Dati fp.txt sieht so aus:
Quote
30.07.2004 123456 Malaga Bielefeld C 12:15 11:31  
23.07.2004 654321 Berlin Bielefeld D 13:00 12:58
04.07.2004 587931 Barcelona Bielefeld E 14:00 12:00
30.07.2004 356987 Muenchen Bielefeld A 12:50 12:00
30.07.2004 879652 Koeln Bielefeld B 12:55 12:15
30.07.2004 456987 Bonn Bielfeld H 14:00 11:55
05.08.2004 456789 Freiburg Bielfeld C 15:00 13:00
01.09.2004 336632 Berlin Bielefeld B 22:00 19:00
\n\n

<!--EDIT|renee|1094048060-->

View full thread Hashvalues nach Variablen sortieren: SCHWER