Schrift
[thread]7721[/thread]

%{$eingabe} zur Laufzeit erzeugen: Hash mit benutzerdefiniertem Bezeichner



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
pearl-man
 2006-02-21 12:21
#63105 #63105
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
Sers,

möchte zur Laufzeit neue Hashes mit variablen Bezeichnern bestimmen. Der Benutzer gibt also eine beliebige Zeichenfolge, z.B. bäume an, das Script soll sodann einen Hash %bäume erzeugen, wobei die eingegebene Zeichenfolge in der Variable $eingabe steckt. also:

Code: (dl )
1
2
3
4
5
6
7
8
9
...
use strict;

# Initialisierung des Hashes:
my %{$eingabe};

# Eingabe von Hash-Elementen:
%{$eingabe{'lerche'}} = 'großer baum';
...


funktioniert beides nicht, doch wie kann ich diese Problematik realisieren?
renee
 2006-02-21 12:27
#63106 #63106
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Eine Loesung des Problems:
Code: (dl )
1
2
3
4
5
6
7
8
use strict;
my %hash;

#Erzeugen der Hashreferenz
$hash{$eingabe} = {lerche => 'grosser baum'};

# zugriff spaeter:
print $hash{$eingabe}->{key};


Lesenswert: perlreftut\n\n

<!--EDIT|renee|1140517821-->
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/
pearl-man
 2006-02-21 12:43
#63107 #63107
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
vielen dank so weit, doch die sache ist dann leider doch noch etwas schwerer. möchte das realisieren:

Code: (dl )
1
2
3
4
5
6
7
8
9
...
@line = split(';;', $_);
print "One: $line[0], Two: $line[1]\n";
if ($line[1]) {
$base{$hash} = {$line[0] => \%($line[1])};
} else {
$base{$hash} = {$line[0] => 0};
}
...


$base{$hash} soll entweder den Wert '0' oder den Bezeichner eines weiteren Hashes ( \%neuer_hash) enthalten.
pearl-man
 2006-02-21 12:52
#63108 #63108
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
[quote=renee,21.02.2006, 11:27]Eine Loesung des Problems:
Code: (dl )
1
2
3
4
5
6
7
8
use strict;
my %hash;

#Erzeugen der Hashreferenz
$hash{$eingabe} = {lerche => 'grosser baum'};

# zugriff spaeter:
print $hash{$eingabe}->{key};


Lesenswert: perlreftut[/quote]
ist somit auch folgende Zuweisung möglich:

Code: (dl )
%neu = $hash{$eingabe};


???
renee
 2006-02-21 12:55
#63109 #63109
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Existiert der andere Hash schon??

Folgende Loesungsansaetze waeren also denkbar:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my (%base,%hash);

#Beispiel
$hash{Beispiel} = {lerche => 'grosser Baum'};
$hash{Hallo} = {Eibe => 'giftiger Baum'};

# Dummy
my $line = 'Test;;Beispiel';
my @info = split(/;;/,$line);

if(defined $info[1]){
$base{'WasAuchImmerIn$hashStehenMagEsIstKeinGuterBezeichnerFuerEinSkalar'} = {$info[0] => $info[1]};
}
else{
$base{'WasAuchImmerIn$hashStehenMagEsIstKeinGuterBezeichnerFuerEinSkalar'} = {$info[0] => 0};
}

#Zugriff spaeter
print Dumper($hash{$base{'WasAuchImmerIn$hashStehenMagEsIstKeinGuterBezeichnerFuerEinSkalar'}->{$info[0]}});


oder

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my (%base,%hash);

#Beispiel
$hash{Beispiel} = {lerche => 'grosser Baum'};
$hash{Hallo} = {Eibe => 'giftiger Baum'};

# Dummy
my $line = 'Test;;Beispiel';
my @info = split(/;;/,$line);

if(defined $info[1]){
$base{key} = {$info[0] => $hash{$info[1]}};
}
else{
$base{key} = {$info[0] => 0};
}

#Zugriff spaeter
print Dumper($base{key}->{$info[0]});
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
 2006-02-21 12:56
#63110 #63110
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=pearl-man,21.02.2006, 11:52][quote=renee,21.02.2006, 11:27][...]
Lesenswert: perlreftut[/quote]
ist somit auch folgende Zuweisung möglich:

Code: (dl )
%neu = $hash{$eingabe};


???[/quote]
nein, wenn der Wert von $hash{$eingabe} eine Hashreferenz ist, dann muesste es
Code: (dl )
%neu = %{$hash{$eingabe}};

heissen...
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/
pearl-man
 2006-02-21 13:10
#63111 #63111
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
und warum klappt diese Zuweisung nicht:

Code: (dl )
@temp = keys %{$hash{$eingabe}};
\n\n

<!--EDIT|pearl-man|1140520227-->
Crian
 2006-02-21 13:29
#63112 #63112
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Wieso? funktioniert doch

Code: (dl )
1
2
3
4
5
6
7
C:\>perl
$eingabe = 42;
$hash{$eingabe} = {bla => 17, blubb => 23};
@temp = keys %{$hash{$eingabe}};
print "@temp";
^Z
blubb bla
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
pearl-man
 2006-02-21 13:58
#63113 #63113
User since
2005-07-25
65 Artikel
BenutzerIn
[default_avatar]
weiteres Problem, wenn ich die keys in n array hau, wird nur das letzte hash-paar übergeben:

Code: (dl )
 @temp = keys %{$base{'neu'}};


die hash-paare wurden zuvor wie folgt dem hash hinzugefügt:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
$hash = 'neu';
@line = split(';;', $_);
print "One: $line[0], Two: $line[1]\n";
chomp($line[0]); chomp($line[1]);
if ( defined($line[1]) ) {
print "Adding to Base($hash): $line[0] mit $line[1]\n";
$base{$hash} = {$line[0] => $line[1]};
} else {
$base{$hash} = {$line[0] => 0};
}
Dubu
 2006-02-21 14:11
#63114 #63114
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Du überschreibst immer das gleiche Element $hash{neu} mit einer neuen Hashreferenz.

Meinst du vielleicht das?
Code: (dl )
1
2
3
$base{$hash}{$line[0]} = $line[1];
# bzw.
$base{$hash}{$line[0]} = 0;
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2006-02-21 12:21.