misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Moin, ich verzweifle gerade etwas an Perl und seinen Datenstrukturen. Ich will ein Skript schreiben, welches verschiedene API-Keys für eine Suchengine anlegt. Folgenden Code habe ich exemplarisch:
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/env perl
use strict;
use JSON;
my %hashKeyTemplates = (
'backend' => {
"acl" => ["search","browse","addObject","deleteObject","listIndexes","settings"],
"validity" => 0,
"indexes" => [],
"description" => "%s::backend",
},
'frontend' => {
"acl" => ["search"],
"validity" => 0,
"indexes" => [],
"referers" => "[%s]",
"description" => "%s::frontend",
},
);
my @arrIndexes = [ 'a', 'b', 'c' ];
foreach my $strPurpose ( keys %hashKeyTemplates ) {
fncCreateKey( $hashKeyTemplates{$strPurpose}, @arrIndexes );
}
sub fncCreateKey {
my ( %hashSettings, @arrIndices ) = @_;
$hashSettings{"indexes"} = \@arrIndexes;
print encode_json( \%hashSettings )."\n";
}
|
Ich habe also einen Hash, in dem jeweils die Key-Konfiguration für Frontend und Backend drin stehen. Für jeden dieser Anwendungsfälle wird die Routine fncCreateKey aufgerufen. Diese soll die spezifische Key-Konfiguration um die betroffenen Indizes erweitern, und anschließend einen Request ausführen. Das Ergebnis dieses Skripts ist jedoch:
{"indexes":[],"HASH(0x55d7c1281620)":["a","b","c"]}
{"HASH(0x55d7c10e3748)":["a","b","c"],"indexes":[]}
Ich habe schon verschiedene andere Variationen ausprobiert, allerdings ist es mir nicht gelungen mein Anliegen umzusetzen; offenbar klaffen da noch einige Lücken im Verständnis von Perl. Hat jemand eine Lösung und eventuell eine Erklärung, warum mein Code nicht funktioniert? Vielen Dank.
|
apt-ghetto
Anmeldungsdatum: 3. Juni 2014
Beiträge: 2943
|
Leere Arrays in Perl werden mit zwei runden Klammern erzeugt: | use strict;
use warnings;
my @array = ();
|
https://perlmaven.com/perl-arrays Und für nicht-leere Arrays kannst du den qw -Operator nehmen
| use strict;
use warnings;
my @array = qw# search browse addObject deleteObject listIndexes settings #;
|
https://perlmaven.com/qw-quote-word Edit: Wenn du ein Array im Hash hast, dann wird das Array in Schlüssel-Wert-Paare aufgesplittet. Um dies zu umgehen, müsstest du eine Referenz auf ein Array als Wert übergeben: | use strict;
use warnings;
my @aclfrontend = qw# search browse addObject deleteObject listIndexes settings #;
my %hashKeyTemplates = (
frontend => {
acl => \@aclfrontend,
},
);
|
Und in Subroutine fncCreateKey hast du die Variable @arrIndices , die aber nirgends verwendet wird.
|
misterunknown
Ehemalige
(Themenstarter)
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
apt-ghetto schrieb: Wenn du ein Array im Hash hast, dann wird das Array in Schlüssel-Wert-Paare aufgesplittet. Um dies zu umgehen, müsstest du eine Referenz auf ein Array als Wert übergeben: | use strict;
use warnings;
my @aclfrontend = qw# search browse addObject deleteObject listIndexes settings #;
my %hashKeyTemplates = (
frontend => {
acl => \@aclfrontend,
},
);
|
Das hilft mir schonmal weiter. Ich hab das Problem jetzt gelöst, so funktioniert es:
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 | my %hashKeyTemplates = (
'backend' => {
"acl" => ["search","browse","addObject","deleteObject","listIndexes","settings"],
"validity" => 0,
"indexes" => [],
"description" => "%s::backend",
},
'frontend' => {
"acl" => ["search"],
"validity" => 0,
"indexes" => [],
"description" => "%s::frontend",
},
);
@arrIndexes = ( "a", "b", "c" );
foreach my $strKeyPurpose ( keys %hashKeyTemplates ) {
fncCreateKey( $hashKeyTemplates{$strKeyPurpose}, \@arrNewIndices );
}
sub fncCreateKey {
my ( $hashSettings, $arrIndexes ) = @_;
$hashSettings->{"indexes"} = $arrIndexes;
print encode_json( $hashSettings )."\n";
}
|
Und in Subroutine fncCreateKey hast du die Variable @arrIndices , die aber nirgends verwendet wird.
Stimmt, das war ein Copy&Paste-Fehler für das Minimalbeispiel hier.
|