Schrift
[thread]7623[/thread]

Frage zu Hash



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
jason-duff
 2006-01-16 12:13
#61929 #61929
User since
2005-10-11
23 Artikel
BenutzerIn
[default_avatar]
hallo Leute habe ich habe mal wieder ne Frage!

habe ein Hash der Form

%dirs = {
'./space/dir/dirname1' => Wert1
'./space/dir/dirname2' => Wert2
'./space/dir/dirname3' => Wert3
'./space/dir/dirname4' => Wert4
};

der hash enthält als keys Pfadangaben.
Ich möchte die keys abfragen. und zwar den letzten Ordner zb. dirname1 bei './space/dir/dirname1'. Je nachdem welchen wert der hat rufe ich eine funktion auf die als Parameter den Key mit der Pfadangabe, und einen Key mit einer anderen Pfadangabe. zb.'./space/dir/dirname4'.
hab das so gemacht.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
foreach my $dir (keys(%dirs)) { 
   
 my @array = (split (/\//,$dir));
 

 if ($array[-1] == 'dirname1')
   {
     $array[-1] = 'dirname4';  
     my $path = join('/',@array);
       
     function1($dir,$dirs{$dir},$path ,$dirs{$path} )
   
   }
  if ($array[-1] == 'dirname2')
  {...}
   .
   .
 
}

Da ich einige If-Abfragen habe. wird es echt viel Code.
vielleicht habt ihr ne Idee wie man es vereinfachen und kompakter machen kann.

gruss Jason
Crian
 2006-01-16 13:52
#61930 #61930
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Einmal fällt mir File::Basename::basename ein... zum anderen ist die Frage, ob der Pfad immer der gleiche ist (weglassen im Schlüssel), oder ob das Endverzeichnis immer unterschiedlich ist (Pfad mit abspeichern als HoH)
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
bloonix
 2006-01-16 13:58
#61931 #61931
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=jason-duff,16.01.2006, 11:13]%dirs = {
'./space/dir/dirname1' => Wert1
'./space/dir/dirname2' => Wert2
'./space/dir/dirname3' => Wert3
'./space/dir/dirname4' => Wert4
};
[/quote]

da sind einige Fehler drin! Komma fehlt, Quoting auf der
rechten Seite und die Zuweisung ist auch nicht korrekt.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl -w
use strict;

my %dirs = (
  './space/dir/dirname1' => 'Wert1',
  './space/dir/dirname2' => 'Wert2',
  './space/dir/dirname3' => 'Wert3',
  './space/dir/dirname4' => 'Wert4',
);

my %other_dirs = (
  dirname1 => 'dirname4',
  dirname2 => 'dirname5',
  dirname3 => 'dirname99',
  dirname4 => 'dirname100'
);

foreach (keys %dirs) {
  # matched bis zum letzten Slash, ein Slash muss enthalten sein
  next unless /^(.+)\/(.+)$/ && exists $other_dirs{$2};
  function1($_,$dirs{$_},"$1/$other_dirs{$2}",$other_dirs{$2});
}
\n\n

<!--EDIT|opi|1137412823-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
lichtkind
 2006-01-16 14:10
#61932 #61932
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
oder wie wärs mit verschachtelten HOH beim enstehung der daten aufbaun, dann brauchst nicht immer extrahieren. kommt halt drauf an wie oft du es am ende machst und wie man sich das einsparen kann. (zb durch zwischenspeichern)
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Crian
 2006-01-16 14:14
#61933 #61933
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
ja, s.o.
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
Taulmarill
 2006-01-16 14:18
#61934 #61934
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich hätt noch die idee, code-referenzen als werte zu benutzen. dann hätte man sich die arbeit die hashwerte in subroutinen-aufrufe umzusetzen gespart.
ausserdem sollte man zum vergleichen von strings eq benutzen. der operator == ist für numerische werte.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
jason-duff
 2006-01-16 14:42
#61935 #61935
User since
2005-10-11
23 Artikel
BenutzerIn
[default_avatar]
hallo,

Danke erstmal für die Antworten.

Code: (dl )
1
2
3
4
5
6
7
8
my %dirs = (
'./space/dir/traffic' => 'Referenz',
'./space/dir/packetloss' => 'Referenz',
'./space/dir/JitterIN' => 'Referenz',
'./space/dir/jitterOUT' => 'Referenz',
'./space/dir/PacketLossIN' => 'Referenz',
'./space/dir/PacketLossOUT' => 'Referenz',
);


./space/dir/ ist immer gleich.

Es ist so das Verzeichnisse auf .rrd Dateien untersucht werden. falls rrd Dateien vorhanden waren, speichere das Verzeichnis samt der Liste der Dateien in %dirs

%dirs enthält jetzt einen Hash, dessen keys die Pfade zu allen Verzeichnissen mit rrd Dateien sind und dessen values jeweils Referenzen auf Arrays mit den rrd Dateien sind.

Jetzt wollte ich in einer Schleife
schauen falls der wert traffic ist , so soll eine Funktion traffic() aufgerufen werden, die den Pfad und den Wert(Referenz) als Parameter aufnimmt.

Ist der Wert aber JitterIN oder JitterOut , dann muss eine Funktion Jitter() aufgerufen werden.Jetzt muss aber als Parameter Pfad und wert von JitterIN und JitterOut übergeben werden.
Das gleich für PacketLoss..

Wie gesagt, entweder eine Funktion die 2 Parameter aufnimmt, oder eine die 4 Parameter aufnimmt.

Ich hoffe ich konnte euch mein Problem etwas genauer beschreiben, und hoffe das ihr mir helfen könnt.

Crian: CODE-Tags\n\n

<!--EDIT|Crian|1137415530-->
Crian
 2006-01-16 14:44
#61936 #61936
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Wenn der Pfad immer gleich ist, würd ich den in einer extra Variablen speichern und aus dem Hash rauslassen.

Wenn ich Dich richtig verstehe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $path = './space/dir/';
my %dirs = (
'traffic' => { array => 'Referenz', sub => \&traffic },
'packetloss' => { array => 'Referenz', sub => \&packetloss},
'JitterIN' => { array => 'Referenz', sub = \&iitter_in},
'jitterOUT' => { array => 'Referenz', sub = \&jitter_out },
'PacketLossIN' => { array => 'Referenz', sub => \&packet_loss_in },
'PacketLossOUT' => { array => 'Referenz', sub => \&packet_loss_out },
);

while (my ($dir, $value) = each %dirs) {
my @param = ($path, $value->{array});
$value->{sub}->(@param);
}


Wie man sieht, wird $dir gar nicht gebraucht... wenn das tatsächlich so bleibt, geht das wesentlich einfacher :)\n\n

<!--EDIT|Crian|1137416047-->
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
jason-duff
 2006-01-16 14:46
#61937 #61937
User since
2005-10-11
23 Artikel
BenutzerIn
[default_avatar]
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
#use strict;
use warnings;

use File::Find;
no warnings 'File::Find';

my %dirs = ();
my $startdir = '.';

sub filter_for_rrd {
# filtere aus dem Verzeichnis alle rrd dateien heraus
my @files = grep /.*\.rrd$/, @_;
my @sorted_files = map{$_->[0]}sort{$a->[1] <=>$b->[1]}map{[$_,(split(/-|\./,$_))[-2]]}@files;
# filtere alle Unterverzeichnisse heraus
my @dirs = grep -d, @_;
# falls rrd Dateien vorhanden waren, speichere das Verzeichnis
# samt der Liste der Dateien in %dirs
$dirs{$File::Find::dir} = \@sorted_files if (@sorted_files);
# gib für File::Find die Liste der Verzeichnisse und der rrd Dateien
# zurück
return @dirs,@sorted_files;
}

sub process_rrd {
if (-f $_) {
# bearbeite einzelne rrd Datei hier, oder lasse die ganze
# process_rrd Subroutine einfach leer.

}
}

find({
preprocess => \&filter_for_rrd,
wanted => \&process_rrd },
$startdir);

# %dirs enthält jetzt einen Hash, dessen keys die Pfade zu allen
# Verzeichnissen mit rrd Dateien sind und dessen values jeweils
# Referenzen auf Arrays mit den rrd Dateien sind.
use Data::Dumper;
print Dumper \%dirs;


so untersuche ich die Verzeichnisse nach rrd dateien, falls es jemanden interessiert.
Crian
 2006-01-16 14:54
#61938 #61938
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
s.o. (hab noch Code hinzugepackt)
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
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-01-16 12:13.