Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8541[/thread]

Registry durchlaufen: rekursiv?

Leser: 2


<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
Gast Gast
 2006-12-01 12:01
#72093 #72093
Hallo Jungs!

Ich stehe leider vor einem Problem. Vielleicht könnt ihr mir da weiter helfen.
Folgende Problemstellung möchte ich lösen. Ich möchte die Windows Registry im ersten Schritt durchlaufen. Im zweiten möchte ich dann z.B. per Eingabe von Schlüsseln diesen Wert suchen lassen und den kompletten Pfad anzeigen lassen um den Schlüssel dann z.B. auch löschen zu können.


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
use Win32::TieRegistry;

$root = $Registry -> Open ("CConfig", {Delimiter=>"/"});
$path1= $root->Path;

&func;

sub func
{ my ($key);
my ($dir);
my ($path);

#neue Keys im neuen Pfad einlesen !

foreach $key (keys %$root)
{ chomp($key);

if ($key =~ /^(\/.*)/)
{ print "Werte"; }

if ($key =~ /(\/)$/)
{ print "Schluessel: ", $key, "\n";
$dir = $root -> Open ("$key"); #In den Key wechseln
#$path= $dir->Path;
#print $path, "\n";

#&func; #Funktion erneut aufrufen

#wieder eins nach oben !


}
}
}


So...das ist das, was ich bisher gemacht habe (was auch funktioniert). Eigentlich müsste es ja so ähnlich wie im Dateisystem ablaufen. Rekursiv in die Schlüssel abtauchen. Das Problem ist hier halt, dass es alles mit Hashes zu tun hat und das auf und ab in den Ebenen ist dadurch nich so einfach. Und darin bin ich noch nicht wirklich fit bzw. es fällt mir noch schwer da durchzusteigen.
Zu meinem Programm bist jetzt. Also im ersten Schritt öffne ich einen Schlüssel. Dieser sollte ja dann als Root angesehen werden. Dann öffnet er die Funktion und ließt die neuen Unterschlüssel über die Referenz "%$root aus und testet im nächsten Schritt, ob dieser Key wiederrum Subkeys besitzt oder nicht. Steht am Ende ein "/" dann besitzt dieser Key Subkeys. Steht am Anfang "/", dann sind das zwar auch Keys aber diese Keys besitzen Werte d.h. in diesem Schlüssel gibt es keine weiteren Subkeys.

So jetzt muss sich die Funktion wieder selber aufrufen. Das Prob ist halt jetzt die Navigation und die Hashes, da sich %$root immer auf den ersten Pfad bezieht.

Wie könnte man das lösen? Ist wirklich wichtig, da ich über das Modul TieRegistry einen Vortrag mit Bsp. halten muss.


Vielen Vielen Dank Jungs.
Reen
esskar
 2006-12-01 12:53
#72094 #72094
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
erstmal
Code: (dl )
1
2
use strict;
use warnings;


und functionsparameter erleichtern das leben

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
use strict;
use warnings;

use Win32::TieRegistry;

my $regroot = $Registry -> Open ("CConfig", {Delimiter=>"/"});
my $regpath= $regroot->Path;

func( $regroot );

sub func {
my $regkey = shift;

foreach my $key (keys %$regkey) {
chomp($key);

if ($key =~ /^(\/.*)/)
{ print "Werte"; }

if ($key =~ /(\/)$/)
{ print "Schluessel: ", $key, "\n";
my $dir = $regkey->Open ("$key"); #In den Key wechseln
#$path= $dir->Path;
#print $path, "\n";

func($dir); #Funktion erneut aufrufen

#wieder eins nach oben !


}
}
}


ungetestet!!!
Reen
 2006-12-03 20:59
#72095 #72095
User since
2006-12-01
11 Artikel
BenutzerIn
[default_avatar]
Ok...danke dir...Werds gleich mal probieren. Ansonsten melde ich mich nochma.
pq
 2006-12-03 21:20
#72096 #72096
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Guest,01.12.2006, 11:01]Hallo Jungs!
...
Vielen Vielen Dank Jungs.[/quote]
vielleicht haette ich ja auch helfen koennen, aber so...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
topeg
 2006-12-03 21:28
#72097 #72097
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
[quote=pq,03.12.2006, 20:20][quote=Guest,01.12.2006, 11:01]Hallo Jungs!
...
Vielen Vielen Dank Jungs.[/quote]
vielleicht haette ich ja auch helfen koennen, aber so...[/quote]
Allso ich werde alle nurnoch mit "Wesenheiten" anreden. Dann dürfte sich doch keiner mehr ausgeschlossen fühlen?... :-)
Reen
 2006-12-03 21:59
#72098 #72098
User since
2006-12-01
11 Artikel
BenutzerIn
[default_avatar]
Ok...Jungs und MÄDELS *hehe*

@Esskar...dein Prog funzt soweit sehr gut....aber eine Zeile musst du/ihr (auch Mädels) nochmal erklären und zwar....

Code: (dl )
my $regkey = shift;


Also was "shift" macht ist mir klar, aber ich verstehe es im Zusammenhang mit dem Prog noch nich ganz. Also in $dir steht ja dann wieder die Adresse des anonymen Arrays der neuen Subkeys. $regkey müsste ja noch die darüberliegende Struktur beinhalten (also die Adresse des Hash). Aber "shift" ist ja ne Funktion für Arrays und nich für Hashes. Was genau lösche ich denn da? Vielleicht liege ich ja richtig, dass diese Zeile es ermöglicht, um wieder eine Ebene höher zu wechseln (quasi ein chdir ".." )

Danke euch!
PerlProfi
 2006-12-03 22:22
#72099 #72099
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
shift() shiftet in Funktionen per default @_.
In $_[0] ist jetzt eine Hashreferenz, sonst würde ja 'foreach (keys %$regkey)' eine Fehlermeldung geben.

Der Hash auf den die Referenz zeigt wird dann durchlaufen und es wird jeweils geprüft ob der Key des Hashes ein Schlüssel oder ein Wert ist.

Falls es ein Schlüssel ist, wird dieser geöffnet, was in $dir jetzt drinsteht ist eine Hash Referenz. (wie schon gesagt, sonst gäbs ne Fehlermeldung)

MfG PerlProfi
GwenDragon
 2006-12-04 11:28
#72100 #72100
User since
2005-01-17
14563 Artikel
Admin1
[Homepage]
user image
[quote=Guest,01.12.2006, 11:01]Hallo Jungs!
...
Eigentlich müsste es ja so ähnlich wie im Dateisystem ablaufen. Rekursiv in die Schlüssel abtauchen.[/quote]
Die Drachenlady als höhere Wesenheit empfiehlt:
Lese mal etwas zu Rekursion und Referenzen ;)\n\n

<!--EDIT|GwenDragon|1165224621-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Reen
 2006-12-04 16:05
#72101 #72101
User since
2006-12-01
11 Artikel
BenutzerIn
[default_avatar]
ok....langsam verstehe ich das Programm. Aber an welcher Stelle sage ich dann, dass das Prgramm wieder in der Baumstruktur nach oben wechseln soll. Ich übergebe ja der Funktion dann immer wieder nur den Pfad der tiefer in die Struktur führt. Wenn ich aber ganz unten angelangt bin, dann muss ich ja wieder nach oben. Oder macht der das automatisch? Also jedesmal wenn die Funktion erneut aufgerufen wird, entsteht ja einen neue Instanz. Wenn die jetzt alle abgearbeitet bzw. dann wieder gelöschst sind, müsste ja zumindest immer noch eine Instanz mit dem Pfad ganz oben existieren. Sehe ich das richtig oder falsch?

Danke
Reen
esskar
 2006-12-04 16:59
#72102 #72102
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
genau.
das ist eben rekursion.
die function ruft sich auf eben i selbst auf um ebene i+1 abzuarbeiten.
wenn ebene i+1 abgearbeitet ist, läuft der rest auf ebene i weiter

hinweis: natürlich kann man mit rekursion auch sein system lahm legen, weil irgendwann der stack nicht mehr ausreicht.
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



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