2017-09-18 1 views
2

J'ai un tableau avec un tas de chaînes comme éléments, et je veux mettre alors en hachage. J'ai donc d'abord déversé les chaînes dans le tableau et ensuite mis les chaînes analysées dans un nouvel appel de tableau parse_list.perl mettre élément de tableau dans le hachage

Ceci est mon code:

#!/usr/bin/perl 
use strict; 
use warnings; 
use feature 'say'; 
use Data::Dumper qw(Dumper); 
my %hash; 

my $string_array = [ 
       "Europe West France Spain Germany", 
       "Europe North Finland Iceland", 
       "Asia East Japan Korea China", 
       "America North Mexico USA Canada" 
    ]; 

foreach my $country(@{$string_array}){ 
    my @parse_list = split(/\s+/, $country); 
    (my $continent,my $region,) = @parse_list[0,1]; 
    #I just know how to get the continent and region, I don't know how to put  
    #the element from index [2..4] to an array 

} 

Comment puis-je mettre

Continent comme la clé primaire et la région la valeur dans la première couche du hachage.

Région comme la clé secondaire et le tableau Pays comme la valeur dans la seconde couche du hachage.

il en est ainsi comme

my %hash = (
    Europe => { 
     West => [ "France", "Spain", "Germany"] 
     } 
    ); 
+8

'mon (continent $, $ région, repos @) = @parse_list ; $ hash {$ continent} {$ région} = \ @rest; ' –

+0

@ Сухой27 ça marche !! Merci beaucoup. – Luke

Répondre

5

Lorsque vous « analyse syntaxique » votre liste, il est pas très utile pour stocker tout dans un seul tableau. Au lieu de cela, placez les données dans des variables plus utiles.

#!/usr/bin/perl 

use strict; 
use warnings; 

use Data::Dumper; 

my $string_array = [ 
    "Europe West France Spain Germany", 
    "Europe North Finland Iceland", 
    "Asia East Japan Korea China", 
    "America North Mexico USA Canada" 
]; 

my %geography; 

for (@$string_array) { 
    my ($continent, $region, @countries) = split; 

    $geography{$continent}{$region} = \@countries; 
} 

print Dumper \%geography; 

La sortie est:

$VAR1 = { 
      'America' => { 
         'North' => [ 
             'Mexico', 
             'USA', 
             'Canada' 
            ] 
         }, 
      'Europe' => { 
         'West' => [ 
            'France', 
            'Spain', 
            'Germany' 
            ], 
         'North' => [ 
            'Finland', 
            'Iceland' 
            ] 
         }, 
      'Asia' => { 
         'East' => [ 
            'Japan', 
            'Korea', 
            'China' 
           ] 
        } 
     }; 

Mise à jour (pour ajouter un peu plus d'explications):

J'ai changé le nom de %hash-%geography - dénomination des variables bien est très important . Lorsque vous utilisez la construction for (...), il est souvent utile d'utiliser le comportement par défaut de Perl et de stocker les éléments de la liste dans $_. C'est parce que $_ est souvent la variable d'entrée par défaut pour diverses opérations. Dans ce cas, par exemple, je aurais pu écrire:

for my $geo (@$string_array) { 
    my ($continent, $region, @countries) = split /\s+/, $geo; 
    ... 
} 

Mais la fonction split fonctionne sur $_ par défaut. Et, mieux encore, son comportement standard est de diviser le /\s+/, donc nous pouvons omettre tout ce que trop et finissent avec beaucoup de code plus propre:

for (@$string_array) { 
    my ($continent, $region, @countries) = split; 
    ... 
} 
+0

ça marche plutôt bien! Merci d'avoir résolu mon problème. :) – Luke

+0

@Luke: Heureux d'entendre ça fonctionne "plutôt bien": -/J'espère que vous avez appris quelque chose en le lisant. –

+0

J'ai vraiment appris quelque chose d'utile. Merci beaucoup – Luke