ubuntuusers.de

Perl: Array einem Hash zuweisen

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

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:

1
2
3
4
use strict;
use warnings;

my @array = (); 

https://perlmaven.com/perl-arrays

Und für nicht-leere Arrays kannst du den qw-Operator nehmen

1
2
3
4
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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 Team-Icon

Ehemalige
(Themenstarter)
Avatar von misterunknown

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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.

Antworten |