Schrift
[thread]3569[/thread]

hash wird gelöscht/überschrieben(foreach und hash): warum wird hash gelöscht?!!



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
bamboocha
 2005-05-18 12:22
#33248 #33248
User since
2005-04-04
13 Artikel
BenutzerIn
[default_avatar]
Hallo Leutz,

ich habe folgendes Problem, bei dem ich mich jetzt bald aus dem Kellerfenster schmeiße.....und zwar:

ich habe ein Array (3 zellen) mit Daten, welche ich dann über einen bestimmten Namen (z.B.  "1") aufrufen möchte. Dafür verarbeite ich das Array mit den Daten zu einem Hash. Dabei weiß ich dem Hash den Namen zu (eben "1","2",...usw) und die Daten über eine foreach schleife....allerdings sieht es so aus, dass ich nur während die schleife durchlaufen wird zugriff auf den entsprechenden Hash habe.....aber hier erstmal der Code (EmbedPerl :-) )

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[$ while $dat = $sth -> fetchrow_arrayref $]
[- $w = 1; -]
 
           [$ foreach $v @$dat $]

[-var %thelabel = ("$w" => "$v"); -]

#Bemerkung: Kontrollausgabe --> dabei wird aber nur der Hash mit dem Namen 1 ausgegeben und das nur, wenn dieser gerade zugewiesen wurde

Wert [+ $w +]: [+ $thelabel{$w}+] ***** [+ $thelabel{1} +]</b><br>

[- $w++; -]
           [$ endforeach $]  

[- %thelabel2 = ($thelabel{1}, $thelabel{3}) -]

[$ endwhile $]

[+ $thelabel2{S002} +]



=> Zugriff habe ich dann immer nur auf auf den letzten Hash-Wert (also in diesem Falle auf $thelabel{3}) )??!!


Sodala, das wars mal. Ich hoffe, es ist zu verstehen was ich meine, ansonsten einfach nachfragen, ich antworte gerne :-)..


Ich danke schon mal dem Profi hier, welcher mir dabei helfen kann...

schönen Tag noch

ich
Taulmarill
 2005-05-18 12:31
#33249 #33249
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich kenn mich jetzt nicht speziell mit EmbedPerl aus (sieht ja grausam aus) aber normalerweise sollte sich das beheben lassen, indem man den hash vor der schleife per my deklariert, sonst lebt er nur innerhalb der schleife.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
bamboocha
 2005-05-18 12:36
#33250 #33250
User since
2005-04-04
13 Artikel
BenutzerIn
[default_avatar]
HI Leutz,

Probelm gelöst!!

die Hash zuweisung läuft anders:

...
[- $thelabel{$w} = $v; -]
....


sodala, dann kämpfe ich mal weiter, bis demnächst :D

cu

ich
bamboocha
 2005-05-18 12:37
#33251 #33251
User since
2005-04-04
13 Artikel
BenutzerIn
[default_avatar]
@Taulmaril

das Sach mit dem "my" gibts in EmbedPerl nicht, aber trotzdem danke...

cu

ich
renee
 2005-05-18 12:38
#33252 #33252
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du erzeugst den Hash jedesmal neu...

Was Du machst (kein EmbPerl):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my %hash;
my $w = 1;
for $v (0..3){
%hash = ($w => $v);
$w++;
}

print Dumper(\%hash);



Wie es aber aussehen sollte:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my %hash;
my $w = 1;
for $v (0..3){
$hash{$w} = $v;
$w++;
}

print Dumper(\%hash);


Übertragen auf Dein Beispiel (wenn ich EmbPerl auf die SChnelle richtig interpretiere):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[$ while $dat = $sth -> fetchrow_arrayref $]
[- $w = 1; -]
[- %thelabel; -]

[$ foreach $v @$dat $]

[- $thelabel{$w} = $v; -]

#Bemerkung: Kontrollausgabe --> dabei wird aber nur der Hash mit dem Namen 1 ausgegeben und das nur, wenn dieser gerade zugewiesen wurde

Wert [+ $w +]: [+ $thelabel{$w}+] ***** [+ $thelabel{1} +]</b><br>

[- $w++; -]
[$ endforeach $]

[- %thelabel2 = ($thelabel{1}, $thelabel{3}) -]

[$ endwhile $]

[+ $thelabel2{S002} +]
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/
hucks
 2006-08-18 13:22
#33253 #33253
User since
2006-08-10
16 Artikel
BenutzerIn
[default_avatar]
Ich mal wieder.

Mein Hash (%port_analyse_result) in der Foreachschleife wird bei jedem durchlauf überschrieben, wobei ich es schon mit my deklariert habe.

Code (perl): (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
use strict;





my @ip = qw(10.17.5.201 10.16.5.201 10.37.4.201 10.46.10.201 10.17.3.201 10.18.5.201 );

my $ipaddress;

my @port_address_table;

my @mac_tabel_filter;

my @mac_tabel_result;

my $graph;

my %mac_ip;

my %graph;
my %port_analyse_result;
my %port_analyse_result2;

foreach $ipaddress (@ip){



    my $host = ("rmon12\@$ipaddress");

    my @snmp_result_port_mac = &snmpwalk($host, ("1.3.6.1.2.1.2.2.1.6"));

    my @mac_address_port = convert_mac_address(@snmp_result_port_mac);

    
        %port_analyse_result = port_analyse(@snmp_result_port_mac);
        #push (my @port_analyse_hash, { %port_analyse_result} );
        #print %port_analyse_result;
        #%port_analyse_result2 = (%port_analyse_result);
\n\n

<!--EDIT|hucks|1155892989-->
Ronnie
 2006-08-18 13:31
#33254 #33254
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Da wir die Funktion port_analyse nicht kennen ist eine genauere Aussage erstmal nicht möglich, aber es sieht doch sehr stark so aus als würdest du genau den Fehler machen den renee weiter oben ausführlich beschreibt!\n\n

<!--EDIT|Ronnie|1155893531-->
hucks
 2006-08-18 13:44
#33255 #33255
User since
2006-08-10
16 Artikel
BenutzerIn
[default_avatar]
aus der Funtion port_analyse hole ich mit ein Hash indem Macadressen und dessen Portnummern stehen.
Das will ich für mehrere Switches machen und alles in einem Hash speichern, der schlüssel ist die jeweilige Macadresse des Portes.

Hier mal die Funktion
Code (perl): (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
sub port_analyse {



my %hash;

my %oid_mac;

my $z="";

my $item="";

my $oid="";

my $data="";

my $mac="";

my @zeichen;

    

    #Make hash for converting ASCII-character to integer (used for MAC readout)

    for(my $i=0; $i<256;$i++){



      $z = sprintf("%c",$i);

      $hash{$z}=$i;  

    }



        #foreach $item (@snmp_result_port_mac){

        foreach $item (@_){

        

            #Split the OIDs from the VALUEs and save them separate

            ($oid, $data) = split(/:/, $item, 2);

            

            #Perl converts the received data for MAC-Address (normaly returned

            #as hexadezimal numbers) into strings; this have to be reconverted

            for( my $i=0;$i<=5;$i++)

            {

               
 #Seperate the 6 characters representing the MAC-Address into array elements

               
 $zeichen[$i]=substr($data, $i, 1);

            }

            

            #Convert each character from ASCII-Character to its dezimal number

            #and convert the number into hexadezimal to get MAC

            $mac=sprintf("%.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n",$hash{$zeichen[0]}, $hash{$zeichen[1]}, $hash{$zeichen[2]}, $hash{$zeichen[3]}, $hash{$zeichen[4]}, $hash{$zeichen[5]});

            

            (my $port_oid) = split (/1\.3\.6\.1\.2\.1\.2\.2\.1\.6\./, $oid);

            

            $oid_mac{$mac} = $port_oid;              &nbsp
;              &nbsp
;  

            }

    return (%oid_mac);

}

1;
Ronnie
 2006-08-18 14:16
#33256 #33256
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Wie renee oben schon gezeigt hat überschreibst du so nur den hash jedesmal. Verwende eine Referenz auf den Hash den du an die Funktion übergibst und spar dir die Zuweisung. Ein Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %hash;
my $i;

fill_hash(\%hash); # add some data
print Dumper \%hash; # dump it
fill_hash(\%hash); # add more data
print Dumper \%hash; # dump it again
exit;

sub fill_hash {
my $hash_ref = shift || {};
$hash_ref->{$i} = ord(++$i) for 1..4;
}
vayu
 2006-08-21 12:18
#33257 #33257
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
Quote
ich kenn mich jetzt nicht speziell mit EmbedPerl aus (sieht ja grausam aus) aber normalerweise sollte sich das beheben lassen, indem man den hash vor der schleife per my deklariert, sonst lebt er nur innerhalb der schleife.


mal ganz blöd gefragt, was ist EmbedPerl

heisst es überhaupt so? Hab in wikipedia.de noch in unserem Wiki was dazu gefunden :)\n\n

<!--EDIT|vayu|1156148366-->
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-05-18 12:22.