Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

hash of of, problème match valeurs identique


Sujet :

Langage Perl

  1. #1
    Membre régulier
    hash of of, problème match valeurs identique
    Bonjour,

    Je travaille sur un fichier de format comme ci-dessous (en version simplifié).

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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
    config firewall address
    	edit "host-192.168.2.10"
            set subnet 192.168.2.10 255.255.255.255
        next
    	edit "VPN-TEST_local_subnet_1"
            set uuid 9c9700ba-c3f8-51e9-f815-9c6096d88800
            set allow-routing enable
            set subnet 192.168.2.0 255.255.255.0
        next
     
    end
    config firewall addgrp
        edit "VPN-TEST_local"
            set member "VPN-TEST_local_subnet_1"
        next
    end
    config firewall service custom
    edit "TELNET"
            set category "Remote Access"
            set tcp-portrange 23
        next
        edit "TFTP"
            set category "File Access"
            set udp-portrange 69
        next
    end


    Cherchant à faire un hash de hash $hash{config firewall address}{edit} et la valeur sera selon après subnet | member | portrange.

    Le problème est que edit est dans la partie address et addrgr, résultat la clé ""VPN-TEST_local" se retrouve en double.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $VAR1 = {
              'config firewall service custom' => {
                                                    '"TFTP"' => ' set udp-portrange 69',
                                                    '"TELNET"' => ' set tcp-portrange 23'
                                                  },
              'config firewall addgrp' => {
                                            '"VPN-TEST_local"' => '"VPN-TEST_local_subnet_1"'
                                          },
              'config firewall address' => {
                                             '"VPN-TEST_local"' => 'member "VPN-TEST_local_subnet_1"',
                                             '"VPN-TEST_local_subnet_1"' => '192.168.2.0 255.255.255.0',
                                             '"host-192.168.2.10"' => '192.168.2.10 255.255.255.255'
                                           },
              '' => {}
            };


    Le code

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    use strict;
    use warnings;
    use 5.026.1;
    use Data:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />umper;
    no warnings ('uninitialized', 'substr');
     
    open (my $fh, "<", 'data.txt')  or die "Cannot open file $!";
     
    my %hash;
    my $firewall_addr;
    my $firewall_addrg;
    my $firewall_service;
    my $edit_name;
     
    while (<$fh>) {
    	chomp;
    	# Firewall address
    	if (/config firewall address/) {
    		$firewall_addr = $_;
    		$hash{$firewall_addr};
    	} elsif (/edit/) {
    		$edit_name = (split /\s+/,$_) [-1];
    		$hash{$firewall_addr}{$edit_name};
    	} elsif (/subnet/) {
    		my @values = (split /\s+/, $_ ) [-2,-1];
    		$hash{$firewall_addr}{$edit_name} = "@values";
    	}
    	#Firewall groupe
    	if (/config firewall addgrp/) {
    		$firewall_addrg = $_;
    		$hash{$firewall_addrg};
    	} elsif (/edit/) {
    		$edit_name = (split /\s+/,$_) [-1];
    		$hash{$firewall_addrg}{$edit_name};
    	} elsif (/member/) {
    		s/\s+set member\s+//;
    		my @values = (split /\s+/, $_ );
    		$hash{$firewall_addrg}{$edit_name} = "@values";
    	}
    	#Firwall service custom
    	if (/config firewall service custom/) {
    		$firewall_service = $_;
    		$hash{$firewall_service};
    	} elsif (/edit/) {
    		$edit_name = (split / /,$_) [-1];
    		$hash{$firewall_service}{$edit_name};
    	} elsif (/portrange/) {
    		#s/\s+//;
    		my @values = (split /\s+/, $_ );
    		$hash{$firewall_service}{$edit_name} = "@values";
    	}
    }
     
    print Dumper \%hash;


    Quelqu'un a une idée pour palier ce problème? Une autre méthode ?

    Merci.

  2. #2
    Membre éprouvé
    le problème c'est que tu ne compartimentes pas tes sections, tu passes par tous les ifs pour chaque ligne.
    De plus, tu as le code pour les lignes edit à 3 endroits différents, pour un même traitement
    Dans ce cas-là, tu peux simplifier un peu ton code, par exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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
    open (my $fh, "<", 'data.txt')  or die "Cannot open file $!";
     
    my %hash;
    my $section;
    my $edit_name;
    while (<$fh>) {
    	chomp;
    	if (/^config/) {
    		$section = $_;
    	}
    	if (/edit/) {
    		$edit_name = (split /\s+/,$_) [-1];
    	}
    	if (/subnet/) {
    		my @values = (split /\s+/, $_ ) [-2,-1];
    		$hash{$section}{$edit_name} = "@values";
    	}
    	if (/member/) {
    		s/\s+set member\s+//;
    		my @values = (split /\s+/, $_ );
    		$hash{$section}{$edit_name} = "@values";
    	}
    	if (/portrange/) {
    		#s/\s+//;
    		my @values = (split /\s+/, $_ );
    		$hash{$section}{$edit_name} = "@values";
    	}
    }
     
    print Dumper \%hash;
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Membre régulier
    Merci Gardyen,

    ta solution fonctionne.

    Effectivement c'est la partie compartiment que je n'arrivai pas à mettre en place.

###raw>template_hook.ano_emploi###