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

Hash von Hashes einstiegsprobleme

Leser: 3


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
v0id
 2007-03-12 18:01
#74954 #74954
User since
2005-07-06
33 Artikel
BenutzerIn
[default_avatar]
Hi,

ich möchte über ein regex 7 werte in ein 3dimensionalen hash speicher, leider weiß ich noch nicht genau wie es geht und bekomme fehlermeldungen. bin was perl angeht komplett aus der übung und weiß auch nicht ob die fehlermeldungen nicht doch von was anderem kommen.

darum erstmal die bitte wegen dem hash.

ich möchte eins das wie folgt aufgebaut ist:

hashname->$1
->begin
->name
->year
->month
->day
->hour
->minute
->second
->end
->name
->year
->month
->day
->hour
->minute
->second


ich habe es auf diese weise versucht, jedoch bekomm ich

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
#!/opt/perl5.8.6/bin/perl -w

use Time::Local;

my $dir = "/pfad/";
my $oldname = 0;

my %dif_hash;


opendir(DIR, "$dir");
my @files = readdir(DIR);
closedir(DIR);

print "Inhalt von $dir:\n";

foreach (@files) {
#auszulesendedatei.20070117.001124.log
m/(.*)\.(\d{4})(\d{2})(\d{2})\.(\d{2})(\d{2})(\d{2})\.log/;


if ( $1 ne $oldname )
{
%div_hash = ($1 => {begin => {

name => $1,

year => $2,

month => $3,

day => $4,

hour => $5,

minute => $6,

second => $7,

}

}
);
}
else
{
%div_hash = ($1 => {end => {

name => $1,

year => $2,

month => $3,

day => $4,

hour => $5,

minute => $6,

second => $7,

}

}
);
}

$oldname = $1;

}

foreach ($div_hash)
{
print "$_ \n";
}


vll liegts ja auch an irgend ner anderen dummheit, über eure hilfe würd ich mich sehr freuen

gruß

v0id
pktm
 2007-03-12 19:34
#74955 #74955
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
DU belegst zum einen immer den ganzen Hash auf einmal:
my %hash = (); inistialisiert dir einen leeren Hash.
Das solltest du vor dem Einfügen der Werte machen.

Dann erstellst du den Hash nur innherhalb von Codeblöcken{}, was dazu führt, dass der Hash außerhalb dieser Blöcke nicht mehr existiert. Daher auch die Notwendigkeit ihn vorher zu deklarieren.

Mit jeder Zeile aus deiner Datei möchtest du einen Datensatz anlegen.
Das geht so:
$hash{'Schluessel'} = { 'meine' => 'Datenstruktur' };
Wichtig ist, dass du das $-Zeichen nimmst, und nicht das %-Zeichen, wenn du ein Element des Hashes ansprechen möchtest.

Nun noch was zur Ausgabe:
Du baust einen Hash aus Hashes. Wenn du einen Hash mit print ausgibst erhältst du für dich wohl unbrauchbare kryptischen Kram.
Nimm dazu das Modul Data::Dumper: print Dumper( \%hash );

Einen Hash durchläuft man entweder mit each in einer while-Schleife:
Code: (dl )
1
2
3
while( my ($schl, $wert) = each %hash ) {
   print "$schl => $wert\n";
}


oder mit den Schlüsseln in einer anderen Schleife:
Code: (dl )
1
2
3
foreach my $schl ( keys(%hash) ) {
   print "$schl => $hash{$schl}\n";
}


Und immer schön use strict; und use warnings; benutzen (weniger den -w-Switch, aber das wurde schon öfter mal woanders behandelt).

Wenn du Hashes aus Hashes hast wirst du auch nicht umhin kommen dich mit Referenzen zu beschäftigen.
Das wirst du brauchen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Hash aus Hashes:
my %h = (
   'erster' => { 'schl1' => 'wert', 'schl2' => 'wert', 'schl3' => 'wert', },
   'zweiter' => { 'schl1' => 'wert', 'schl2' => 'wert', 'schl3' => 'wert', },
);
# Zugriff auf die Hashes im Hash:
print Dumper $hash{erster};
print Dumper $hash{erster}->{schl1}

# Eine Hashreferenz:
my $href = {
  'abc' => 'def',
}; # man beachte den Unterschied, dass geschweifte Klammern benutzt werden anstatt runde

print $href->{abc};


Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2007-03-12 19:35
#74956 #74956
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie wär's mit
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
#!/opt/perl5.8.6/bin/perl -w

use Time::Local;

my $dir = "/pfad/";
my $oldname = 0;

my %dif_hash;

opendir(DIR, "$dir");
my @files = readdir(DIR);
closedir(DIR);

print "Inhalt von $dir:\n";

foreach my $file (@files) {
#auszulesendedatei.20070117.001124.log
my @info = $file =~ m/(.*)\.(\d{4})(\d{2})(\d{2})\.(\d{2})(\d{2})(\d{2})\.log/;

if ( $info[0] ne $oldname )
{
my %subhash = ();
@subhash{ qw/name year month day hour minute second/ } = @info;
$div_hash{ $info[0] } = {
begin => { %subhash }
};
}
else
{
my %subhash = ();
@subhash{ qw/name year month day hour minute second/ } = @info;
$div_hash{ $info[0] } = {
end=> { %subhash }
};
}

$oldname = $1;

}

print Dumper(\%div_hash);
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/
v0id
 2007-03-13 08:33
#74957 #74957
User since
2005-07-06
33 Artikel
BenutzerIn
[default_avatar]
Guten Morgen,

danke schon mal für die ausgebige hilfe, ich werde mir gleich beides mal genauer durchlesen und versuchen zu verstehen... nach dem ersten kaffee..
v0id
 2007-03-13 10:16
#74958 #74958
User since
2005-07-06
33 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
42
43
44
     1  #!/opt/perl5.8.6/bin/perl -w
2
3 #use strict;
4 use Time::Local;
5 use Data::Dumper;
6
7 my $dir = "/pfad/";
8 my $oldname = 0;
9
10 my %dif_hash = ();
11
12 opendir(DIR, "$dir");
13 my @files = readdir(DIR);
14 closedir(DIR);
15
16 print "Inhalt von $dir:\n";
17
18 foreach my $file (@files) {
19 #dateiname.20070117.001124.log
20 my @info = ();
21 @info = $file =~ m/(.*)\.(\d{4})(\d{2})(\d{2})\.(\d{2})(\d{2})(\d{2})\.log/;
22
23 if ( $info[0] ne $oldname )
24 {
25 my %subhash = ();
26 @subhash{ qw/name year month day hour minute second/ } = @info;
27
28 $div_hash{ $info[0] } = {
29 begin => { %subhash }
30 };
31 }
32 else
33 {
34 my %subhash = ();
35 @subhash{ qw/name year month day hour minute second/ } = @info;
36
37 $div_hash{ $info[0] } = {
38 end => { %subhash }
39 };
40 }
41
42 $oldname = $1;
43
44 }


ich habe es zuerst mit diesem code versucht, jedoch bekomme ich (ohne use strict) die meldungen:
Use of uninitialized value at dir_4.pl line 23.
Use of uninitialized value at dir_4.pl line 28.
Use of uninitialized value at dir_4.pl line 28.
Use of uninitialized value at dir_4.pl line 23.
Use of uninitialized value at dir_4.pl line 23.
Use of uninitialized value at dir_4.pl line 37.
Use of uninitialized value at dir_4.pl line 23.
Use of uninitialized value at dir_4.pl line 23.
Use of uninitialized value at dir_4.pl line 28.
Use of uninitialized value at dir_4.pl line 23.
Use of uninitialized value at dir_4.pl line 28.

ich verstehe nur nicht wieso die variablen nicht initialisiert sein sollen. dahinter steht dann noch ein teil vom code der sich wiederholt, und zwar die abfrage mit den richtigen inhalten, bis auf den zweiten welcher undef ist.

mit strict bekomme ich lediglich:
Global symbol "%div_hash" requires explicit package name at dir_4.pl line 28.
Execution of dir_4.pl aborted due to compilation errors.

vielleicht könntet ihr mir nochmal aus der patsche helfen.
das script soll ansich alle dateien aus dem ordner durchgehen, viele haben den gleichen namen bis auf die zahlen am ende. es soll quasi immer die erste und die letzte datei die gleich heißt gespeichert werden. anschliessend soll die nächste datei mit anfang und ende gespeichert werden usw..
renee
 2007-03-13 10:39
#74959 #74959
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wiki:[tt]use strict[/tt] hätte Dich aber darauf aufmerksam gemacht, dass $oldname weder deklariert noch initialisiert ist...
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/
renee
 2007-03-13 10:41
#74960 #74960
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Und es gibt einen Unterschied zwischen %dif_hash und %div_hash. Auch das hätte Dir Wiki:[tt]use strict[/tt] gesagt...

Ansonsten funktioniert der Code...\n\n

<!--EDIT|renee|1173775363-->
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/
v0id
 2007-03-13 10:50
#74961 #74961
User since
2005-07-06
33 Artikel
BenutzerIn
[default_avatar]
uff, vor lauter bäumen.... danke sehr!

aber $oldname is doch in zeile 8 initialisiert und bei der meldung zeigt auch auf keine zeile mit oldname :-/
habe nun use strict an und bekomme leider noch die uninitialized meldung. mit dem gleichen fehler. übersehe ich nochwas oder versteh ich wieder etwas falsch? :-/\n\n

<!--EDIT|v0id|1173776938-->
v0id
 2007-03-13 12:19
#74962 #74962
User since
2005-07-06
33 Artikel
BenutzerIn
[default_avatar]
ich verstehs nicht, es scheint irgendwas mit der $info[0] zutun zu haben, dabei hab ich die doch mit my @info = (); initialisiert. ich komm nicht voran :(
renee
 2007-03-13 12:26
#74963 #74963
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann zeig mal den Code, den Du jetzt hast...

Mach mal aus
Code: (dl )
my @files = readdir(DIR);


das hier:
Code: (dl )
1
2
3
4
5
my @files = grep{ 
$_ !~ /\.\.?$/ # filter . und ..
and
-f $dir.'/'.$_ # überprüfe, ob es eine datei ist
}readdir(DIR);
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/
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2007-03-12 18:01.