Schrift
[thread]772[/thread]

Hashes of Arrays



<< >> 9 Einträge, 1 Seite
flango
 2006-07-08 17:19
#8270 #8270
User since
2006-07-08
5 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte für ein CGI Scipt hashes einem Array zuordnen.
die Zuordnung funktioniert auch, mein Problem ist, das sich nur bestimmte hashes innerhalb des arrays bearbeiten möchte.

Dafür ist folgende foreach Schleife:

foreach $hash (@standorte) {
print "<br>";
print keys %$hash ;
print " --- ";
print values %$hash;
}

Ausgabe:
########
standort_1 --- 1

standort_2 --- 2

standort_3 --- 3

abschicken --- Submit...
########

Um nur Standorte angezeigt zu bekommen,
habe ich folgende Bedingung hinzugefügt. Aber ich erhalte keine Ausgabe ?

Wenn ich für den Regex "/1/i" statt "/standorte/i" angebe erhalte ich eine Augabe ?


Wieso behält diese Variable:
local $hash_values = values %$hash;
_immer_ den Wert "1" ? Obwohl sie innerhalb der foreach-Schleife ist ???



foreach $hash (@standorte) {
local $hash_values = values %$hash;
print "Hash_values<br> ". $hash_values."<br>";
if ( (keys %$hash) =~ /standorte/i ) {
print "<br>";
print keys %$hash ;
print " --- ";
print values %$hash;
}
}

Ausgabe mit "/standorte/i" als Regex:
########
Hash_values
1
Hash_values
1
Hash_values
1
Hash_values
1
########

Ausgabe mit "/1/i" als Regex:
########
Hash_values
1
Hash_values
1

standort_1 --- 1Hash_values
1
Hash_values
1

standort_2 --- 2Hash_values
1
Hash_values
1

standort_3 --- 3Hash_values
1
Hash_values
1

abschicken --- Submit...
########


gruss
flango
Thorium
 2006-07-08 17:27
#8271 #8271
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du scheinst da ein ziemliches Durcheinander zu haben...
Willst du Daten in diesem Format speichern?
Code: (dl )
1
2
3
standort_1 => 'something',
standort_2 => 'something else',
standort_3 => 'anything'

Wenn das der Fall ist, brauchst du kein Hash im Array; dann reicht ein einfaches Hash:
Code: (dl )
1
2
3
4
5
my %standorte = (
standort_1 => 'something',
standort_2 => 'something else',
standort_3 => 'anything'
);

Ein array von hashes macht nur Sinn, wenn du Mehrere Informationen in einer Geordneten Liste haben willst:

Code: (dl )
1
2
3
4
my @standorte;
push @standorte, { name => 'Irgendwo', stadt => 'berlin', strasse => 'lang\'strasse' };
push @standorte, { name => 'Irgendwo2', stadt => 'frankfurt', strasse => 'lang\'strasse' };
push @standorte, { name => 'Foobar', stadt => 'kassel', strasse => 'lang\'strasse' };


Aber zu deiner Frage:
Code: (dl )
local $hash_values = values %$hash;

(values %$hash) gibt eine Liste zurück. Eine Liste gibt im Skalaren Kontext die Anzahl elemente zurück - und das ist in deinem Fall immer eins.
Wenn du aber auf das Element "standort_1" in einem reinen Hash zugreiffen willst:

Code: (dl )
my $standort1 = $standort{standort_1}

Wie du siehst, ist das Zugreiffen auf Daten wesentlich einfacher, wenn du die Daten dementsprechend speicherst.\n\n

<!--EDIT|Thorium|1152365280-->
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
flango
 2006-07-08 19:19
#8272 #8272
User since
2006-07-08
5 Artikel
BenutzerIn
[default_avatar]
[quote=Thorium,08.07.2006, 15:27]Du scheinst da ein ziemliches Durcheinander zu haben...
Willst du Daten in diesem Format speichern?
Code: (dl )
1
2
3
standort_1 => 'something',
standort_2 => 'something else',
standort_3 => 'anything'


Nein, ich wollte den Beitrag so einfach wie möglich belassen.
Zu den Standorten werden noch weitere keys/values hizukommen.


Wenn das der Fall ist, brauchst du kein Hash im Array; dann reicht ein einfaches Hash:
Code: (dl )
1
2
3
4
5
my %standorte = (
standort_1 => 'something',
standort_2 => 'something else',
standort_3 => 'anything'
);


Ein array von hashes macht nur Sinn, wenn du Mehrere Informationen in einer Geordneten Liste haben willst:

Code: (dl )
1
2
3
4
my @standorte;
push @standorte, { name => 'Irgendwo', stadt => 'berlin', strasse => 'lang\'strasse' };
push @standorte, { name => 'Irgendwo2', stadt => 'frankfurt', strasse => 'lang\'strasse' };
push @standorte, { name => 'Foobar', stadt => 'kassel', strasse => 'lang\'strasse' };


Genau da soll es irgendwann hin :-)

Aber zu deiner Frage:
Code: (dl )
local $hash_values = values %$hash;

(values %$hash) gibt eine Liste zurück. Eine Liste gibt im Skalaren Kontext die Anzahl elemente zurück - und das ist in deinem Fall immer eins.
Wenn du aber auf das Element "standort_1" in einem reinen Hash zugreiffen willst:

Code: (dl )
my $standort1 = $standort{standort_1}

Wie du siehst, ist das Zugreiffen auf Daten wesentlich einfacher, wenn du die Daten dementsprechend speicherst.[/quote]

aah, das stichwort Scalarer kontext hat bei mir den groschen fallen lassen.

Quote
Du scheinst da ein ziemliches Durcheinander zu haben...
Willst du Daten in diesem Format speichern?
Code: (dl )
1
2
3
standort_1 => 'something',
standort_2 => 'something else',
standort_3 => 'anything'

Nein, ich wollte den Beitrag so einfach wie möglich lassen.
Zu den Standorten werden noch weitere keys/values hizukommen
Quote
Code: (dl )
1
2
3
4
my @standorte;
push @standorte, { name => 'Irgendwo', stadt => 'berlin', strasse => 'lang\'strasse' };
push @standorte, { name => 'Irgendwo2', stadt => 'frankfurt', strasse => 'lang\'strasse' };
push @standorte, { name => 'Foobar', stadt => 'kassel', strasse => 'lang\'strasse' };

Genau da soll es irgendwann hin :-)


Quote
Aber zu deiner Frage:
Code: (dl )
local $hash_values = values %$hash;

(values %$hash) gibt eine Liste zurück. Eine Liste gibt im Skalaren Kontext die Anzahl elemente zurück - und das ist in deinem Fall immer eins.
Wenn du aber auf das Element "standort_1" in einem reinen Hash zugreiffen willst:



Habe es nun mit einer weitere Schleife gelöst:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
 
foreach my $hash (@standorte) {
foreach my $key (keys %$hash) {
if ( $key =~ /stand/i ) {
print "<br>";
print keys %$hash;
print " --- ";
print values %$hash;

}
}
}


Hat nun das erwünschte Ergebniss.

Code: (dl )
1
2
3
standort_1 --- 1
standort_2 --- 2
standort_3 --- 3



Um die letzte foreach Schleife kam ich nicht umher ?

Quote
my $standort1 = $standort{standort_1}


Habe dies mal versucht auf das Beispiel umzusetzten,
Code: (dl )
my $hash_value =   $hash{standort_1};


Ergab bei mir eine Fehlermeldung in der Zeile mit der Zuweisung.

Global symbol "%hash" requires explicit package name at /test.cgi ???
GwenDragon
 2006-07-08 19:34
#8273 #8273
User since
2005-01-17
14550 Artikel
Admin1
[Homepage]
user image
[quote=flango,08.07.2006, 17:19]Global symbol "%hash" requires explicit package name at /test.cgi ???[/quote]
Verwende bitte
use strict;
use warnings;

Dann zeigt dir Perl was nicht korrekt deklariert ist.

Der Hast ist ebebe nicht mit my %hash oder our %hash deklariert worden.
die Drachin, Gwendolyn


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

flango
 2006-07-08 19:46
#8274 #8274
User since
2006-07-08
5 Artikel
BenutzerIn
[default_avatar]
Das ist ist ja leider der Hash ist deklariert.

Ich füge mal den ganzen fehlertext hinzu.
Code: (dl )
1
2
Global symbol "%hash" requires explicit package name at /home/www/localhost/projekt/zeichnen.cgi line 23.
Execution of /home/www/localhost/projekt/zeichnen.cgi aborted due to compilation errors.



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
#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use GD;
use Scalar::Util::Numeric qw(isnum isint isfloat);


my $cgi = new CGI;
my %standort;
my @standorte;
my @Feldnamen = $cgi->param();
print $cgi->header(),
$cgi->start_html('CGI-Feedback'),
$cgi->h1('CGI-Feedback vom Programm ',$cgi->i('zeichnen.cgi'));
foreach my $Feld (@Feldnamen) {
push (@standorte,{$Feld =>$cgi->param($Feld)});
}
foreach my $hash (@standorte) {
my $hash_value = $hash{standort_1};
if ( $key =~ /stand/i ) {
print "<br>";
print keys %$hash;
print " --- ";
print values %$hash;
}
}
}
\n\n

<!--EDIT|flango|1152373646-->
renee
 2006-07-08 22:08
#8275 #8275
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du verwendest Hash-Referenzen und versuchst dann darauf wie auf einen "normalen" Hash zuzugreifen...

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
#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use GD;
use Scalar::Util::Numeric qw(isnum isint isfloat);


my $cgi = new CGI;
my %standort;
my @standorte;
my @Feldnamen = $cgi->param();
print $cgi->header(),
$cgi->start_html('CGI-Feedback'),
$cgi->h1('CGI-Feedback vom Programm ',$cgi->i('zeichnen.cgi'));
foreach my $Feld (@Feldnamen) {
push (@standorte,{$Feld =>$cgi->param($Feld)});
}

foreach my $hash (@standorte) {
my $hash_value = $hash->{standort_1};
my ($key) = keys(%$hash);
if ( $key =~ /stand/i ) {
print "<br>";
print keys %$hash;
print " --- ";
print values %$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/
flango
 2006-07-08 22:37
#8276 #8276
User since
2006-07-08
5 Artikel
BenutzerIn
[default_avatar]
wunderbar :-)

danke.

aber,
wieso muss my $key in Klammern stehen ???
Code: (dl )
my ($key) = keys(%$hash);


Ohne Klammern funktioniert es nicht ?
Da bekomme ich für $key immer "1" als rückgabe ???
GwenDragon
 2006-07-08 22:56
#8277 #8277
User since
2005-01-17
14550 Artikel
Admin1
[Homepage]
user image
Skalarer Kontext! Anzahl der Schlüssel!
Quote
keys HASH

Returns a list consisting of all the keys of the named hash. (In scalar context, returns the number of keys.)

http://perldoc.perl.org/functions/keys.html\n\n

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


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

flango
 2006-07-09 02:17
#8278 #8278
User since
2006-07-08
5 Artikel
BenutzerIn
[default_avatar]
ok,

vielen dank für eure hilfe und für eure geduld

bin gerade nach hause gekommen vom FUSSII gucken.

3er ist besser als 4er :D

p.s.
mir hat wohl die frische luft gut getan und ich habe gerade bemerkt, dass das Topic eigentlich array of hashes hätte heissen sollen *duck*
<< >> 9 Einträge, 1 Seite



View all threads created 2006-07-08 17:19.