Schrift
[thread]6553[/thread]

Hashvalues nach Variablen sortieren: SCHWER (Seite 2)



<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
renee
 2004-09-01 18:34
#49759 #49759
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das hier ist bestimmt ein Anfang für Dich:
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
#! /usr/bin/perl

use strict;
use warnings;

my %hash = ();

while(my $line = <DATA>){
 chomp $line;
 my @array = split(/\s+/,$line);
 $hash{$array[1]} = [@array[2,3,4,0,6,5]];
}

my @sorted_keys = sort{change_time($hash{$a}->[3],$hash{$a}->[4]) <=>
                        change_time($hash{$b}->[3],$hash{$b}->[4])}keys %hash;

print "\nFlugnummer\tDatum     \tUhrzeit\t",
sprintf("%15s",'Zielort'),"\t",sprintf("%15s",'Abflugort'),
"\tTerminal\tAnkunft\n";
foreach(@sorted_keys){
 print sprintf("%10s",$_),"\t",
       sprintf("%10s",$hash{$_}->[3]),"\t",
       sprintf("%7s",$hash{$_}->[4]),"\t",
       sprintf("%15s",$hash{$_}->[0]),"\t",
       sprintf("%15s",$hash{$_}->[1]),"\t",
       sprintf("%9s",$hash{$_}->[2]),"\t",
       sprintf("%7s",$hash{$_}->[5]),"\n";
}


sub change_time{
 my($date,$clock) = @_;
 $clock =~ s/\://;
 return join("",reverse split(/\./,$date)).$clock;
}
# hier Leerzeichen weglassen
_ _DATA_ _
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


Ausgabe:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
~/entwicklung 54> perl flug.pl

Flugnummer      Datum           Uhrzeit         Zielort       Abflugort Terminal        Ankunft
   587931      04.07.2004        12:00       Barcelona       Bielefeld         E         14:00
   654321      23.07.2004        12:58          Berlin       Bielefeld         D         13:00
   123456      30.07.2004        11:31          Malaga       Bielefeld         C         12:15
   456987      30.07.2004        11:55            Bonn        Bielfeld         H         14:00
   356987      30.07.2004        12:00        Muenchen       Bielefeld         A         12:50
   879652      30.07.2004        12:15           Koeln       Bielefeld         B         12:55
   456789      05.08.2004        13:00        Freiburg        Bielfeld         C         15:00
   336632      01.09.2004        19:00          Berlin       Bielefeld         B         22:00
\n\n

<!--EDIT|renee|1094049410-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
DayGlo
 2004-09-01 18:41
#49760 #49760
User since
2004-09-01
5 Artikel
BenutzerIn
[default_avatar]
Sieht gut aus, aber kannst du mir erklären, was du da machst? Das wär lieb!
DayGlo
 2004-09-01 18:45
#49761 #49761
User since
2004-09-01
5 Artikel
BenutzerIn
[default_avatar]
Jetzt hast du doch den Status rausgeschmissen, oder? Den brauche ich aber auch...
renee
 2004-09-01 18:54
#49762 #49762
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hier mit Status:
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
#! /usr/bin/perl

use strict;
use warnings;

my %hash = ();

while(my $line = <DATA>){
 chomp $line;
 my @array = split(/\s+/,$line);
 $hash{$array[1]} = [@array[2,3,4,0,6,5]];
}

my @sorted_keys = sort{change_time($hash{$a}->[3],$hash{$a}->[4]) <=>
                      change_time($hash{$b}->[3],$hash{$b}->[4])}keys %hash;

print "\nFlugnummer\tDatum     \tUhrzeit\t",sprintf("%15s",'Zielort'),
     "\t",sprintf("%15s",'Abflugort'),"\tTerminal\tAnkunft\n";

foreach(@sorted_keys){
 print sprintf("%10s",$_),"\t",
       sprintf("%10s",$hash{$_}->[3]),"\t",
       sprintf("%7s",$hash{$_}->[4]),"\t",
       sprintf("%15s",$hash{$_}->[0]),"\t",
       sprintf("%15s",$hash{$_}->[1]),"\t",
       sprintf("%9s",$hash{$_}->[2]),"\t",
       sprintf("%7s",$hash{$_}->[5]),"\n";
}

my $flight = 336632;
print "Status von Flug $flight:\t", status($hash{336632});


sub change_time{
 my($date,$clock) = @_;
 $clock =~ s/\://;
 return join("",reverse split(/\./,$date)).$clock;
}

sub status{
 my ($arref) = @_;
 my @times   = localtime(time);
 my $time    = sprintf("%04d%02d%02d%02d%02d",($times[5] + 1900),($times[4] + 1),$times[3],$times[2],$times[1]); # aktuell
 my $check   = change_time($arref->[3],$arref->[4]); # Abflug
 my $check2  = change_time($arref->[3],$arref->[5]); # Ankunft
 my $diff1   = $time - $check;
 my $diff2   = $time - $check2;
 if($diff1 >= 0 && $diff2 <= 0){
   return "Flugzeug in der Luft\n";
 }
 elsif($diff1 < 0){
   return "Flug kommt noch\n";
 }
 elsif($diff2 > 0){
   return "Flugzeug schon gelandet\n";
 }
}

# bei _ _DATA_ _ die Leerzeichen weglassen
_ _DATA_ _
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 16:00
\n\n

<!--EDIT|renee|1094050484-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Taulmarill
 2004-09-01 18:59
#49763 #49763
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
<schleichwerbung>
ich konnte nicht umhin zu bemerken, dass die abflugorte alle in bielefeld sind.
wohnst du in bielefeld? wenn ja, möchte ich dich hiermit zu unserem perl-stammtisch einladen.
wir treffen uns immer am letzten dienstag im monat (das nächste mal also am 28.09.).
alles weitere findest du unter http://bielefeld.pm.org
</schleichwerbung>
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2004-09-01 18:59
#49764 #49764
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
while(my $line = <DATA>){
 chomp $line;
 my @array = split(/\s+/,$line);
 $hash{$array[1]} = [@array[2,3,4,0,6,5]];
}
Hier lese ich die Daten ein <DATA> muss dann später durch Dein Filehandle ersetzt werden. Es wird ein Hash gefüllt, bei dem die Flugnummer (die ist eindeutig) der Key ist und der Value ist ein Anonymes Array. Der Dump sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
$VAR1 = {
         '336632' => [
                       'Berlin',
                       'Bielefeld',
                       'B',
                       '01.09.2004',
                       '16:00',
                       '22:00'
                     ],
       };


Um nach dem Datum und Uhrzeit sortieren zu können, muss ich einen numerischen Vergleich ermöglichen. Deshalb die Methode change_time. Aus der Datum-Uhrzeit-Gruppe 20.09.2004 11:51 wird dann 200409201151.

$a und $b sind Spezialvariablen. Die sind sort{} schon bekannt und enthalten jeweils ein Element aus dem Array, das sort{} übergeben wird.
mit $hash{$a}->[<Zahl] greife ich auf ein Element des Anonymen Arrays zu.

@Taulmarill: solche Schleichwerbung ist erlaubt ;)\n\n

<!--EDIT|renee|1094050848-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2004-09-01 19:33
#49765 #49765
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=Taulmarill,01.09.2004, 16:59]<schleichwerbung>
ich konnte nicht umhin zu bemerken, dass die abflugorte alle in bielefeld sind.
wohnst du in bielefeld? wenn ja, möchte ich dich hiermit zu unserem perl-stammtisch einladen.
wir treffen uns immer am letzten dienstag im monat (das nächste mal also am 28.09.).
alles weitere findest du unter http://bielefeld.pm.org
</schleichwerbung>[/quote]
Geanu das wollte ich auch gerade schreiben *mitwerb*. Letztes Treffen war leider gerade gestern, aber kommt Zeit, kommt Treffen =)


Wieso flieg ich eigentlich immer ab Paderborn, wenn von Bielefeld auch so viel abfliegt? ;)\n\n

<!--EDIT|Crian|1094052848-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-09-01 19:35
#49766 #49766
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=renee,01.09.2004, 16:59]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
$VAR1 = {
         '336632' => [
                       'Berlin',
                       'Bielefeld',
                       'B',
                       '01.09.2004',
                       '16:00',
                       '22:00'
                     ],
       };
[/quote]
Wäre es da nicht schöner, ein Hash als inerste Struktur zu nehmen? Also so:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
$VAR1 = {
         '336632' => {
                       zielort => 'Berlin',
                       startort => 'Bielefeld',
                       terminal => 'B',
                       datum => '01.09.2004',
                       abflugszeit => '16:00',
                       ankunftszeit => '22:00'
                     },
       };


Dann hat man quasi "benamste" Indices und muss sich nicht merken, was wo liegt.\n\n

<!--EDIT|Crian|1094053053-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Ronnie
 2004-09-01 20:18
#49767 #49767
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@crian: Wie wäre es mit use constant; und beibehalten des Arrays?
Taulmarill
 2004-09-01 20:45
#49768 #49768
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
@ronnie: was genau bringt use constant; hier?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2004-09-01 16:49.