Extraire de variables d'un tableau et comparaison de variable

Fermé
Noob_In_Perl - 7 juin 2013 à 11:15
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 17 juin 2013 à 11:45
Bonjour,


débutant en perl, je ne parviens pas à trouver l' erreur.

Je dispose d'une tableau contenant des données : La première colonne contient le nom du champ (Ex : $ref_routeur->{feuillet}) et la deuxième sa valeur.

Je voudrai pouvoir effectuer sur ce tableau le traitement suivant :

1°) Me créer deux tableaux de chaine de caractère SiteA et SiteB que j' initialise en dur dans mon code Perl

2°) Lire une variable (my $Feuillet) issue de mon tableau de données

3°) Vérifier si cette variable (my $Feuillet) est présente dans l'un des tableau SiteA ou SiteB

En fonction du résultat, la variable my $Site aura une valeur différente (dans tout les cas également une chaine de caractère)


### Tableau des sites A ###
my @SitesA = (
"CD04K7S2B8",
"CD04KU7HG5"
);

### Tableau des sites B ###
my @SitesB = (
"CD04K7UFCC",
"CD15SDFRG5"
);

### Définition de la taille des tableaux ###
my $TabSizeA = @SitesA;
my $TabSizeB = @SitesB;

##########
# Script #
##########
my $Feuillet = $ref_routeur->{feuillet};
my $Site = $ref_routeur->{type_site};

for(my $i=0; $i<$TabSizeA; $i++)
{
if($Feuillet eq $SitesA[$i])
{
$Site = 'Site_Central';
$self->forceKey(-key=>"{type_site}");
}
}

for(my $i=0; $i<$TabSizeB; $i++)
{
if($Feuillet eq "$SitesB[$i]")
{
$Site = 'Site_Distant';
$self->forceKey(-key=>"{type_site}");
}
}

Merci d'avance
A voir également:

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 12/06/2013 à 01:00
Salut,

Tu n'as pas besoin de conserver la taille du array dans une variable, ni de faire un for.

Par ailleurs, je ne vois pas ce qu'est "forceKey" ni ce que tu fais avec ce qui matche.

Pour rechercher si un array contient une valeur, tu peux utiliser l'opérateur ~~ (https://perldoc.perl.org/perlfaq4#How-can-I-tell-whether-a-certain-element-is-contained-in-a-list-or-array%3f)

#!/usr/bin/perl

use strict;
use warnings;

my @SitesA = (
"CD04K7S2B8",
"CD04KU7HG5"
);

my $Feuillet = "CD04K7S2B8";

if (/$Feuillet/ ~~ @SitesA)
{
  print "Faire quelque chose avec $Feuillet";
}

Dal
0
Noob_In_Perl
14 juin 2013 à 18:20
Bonjour,

visiblement quelque chose manque encore car même avec ce script ne fonctionne pas.

En fait j' ai des données stocker dans un tableau

VARIABLE | VALEUR
|
$ref_routeur->{feuillet} | CD04K7S2B8
$ref_routeur->{fin_hostname} | tranche
$ref_routeur->{fonction_cpe} | ROUTEUR
$ref_routeur->{hostname} | teffaud-tranche
$ref_routeur->{type_site} | ""


Ce tableau permet d' alimenter une page Web qui est en fait un formulaire PERL
Certains champs sont en lecture seul (comme le champ correspondant à la variable $ref_routeur->{feuillet} et d' autres en lecture/ecriture comme le champ $ref_routeur->{type_site}.

Je souhaite crée un code perl, qui sera automatiquement exécuté lors de mon arrivée sur ce formulaire, ce script contiendra deux tableaux SitesA et SiteB écrit en dur dans mon script.

A mon arrivée sur la page web, le script dois comparer la variable $ref_routeur->{feuillet} de mon formulaire avec le contenu de mes deux tableaux.
Si la variable $ref_routeur->{feuillet} est stockée dans le tableau SiteA, la variable $ref_routeur->{type_site} prendra une valeur donnée. Si c'est dans le tableau Site B, la valeur alors affectée sera différente.

ensuite, le forcekey, ne servira qu'à "bloquer le champ en lecture seul" après affectation de la valeur
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
17 juin 2013 à 11:45
visiblement quelque chose manque encore car même avec ce script ne fonctionne pas

Mon script est un exemple d'usage de l'opérateur ~~ pour rechercher si un array contient une valeur. Il n'est pas destiné à être intégré tel quel dans ton code (dont, visiblement on n'a qu'une partie).

Je ne connais pas "forceKey" en Perl. Et Perldoc non plus : http://perldoc.perl.org/search.html?q=forceKey. Ta syntaxe $self->forceKey(-key=>"{type_site}"); ressemble à l'appel à une méthode définie dans un objet Perl, qui doit être définit dans ton code. Je ne peux pas t'aider sur cette partie, car je ne sais pas de quoi il s'agit. Si tu sais ce que tu fais sur cette partie, c'est bien. De même, "$ref_routeur" ressemble aussi à un objet Perl, dont tu utilises le champ "feuillet".

Sinon, pour le reste du descriptif de ce que tu veux faire, c'est assez simple, sur la base du code que tu as posté, d'intégrer ma proposition. Cela donne le code simple suivant, que je ne peux pas tester, car je n'ai pas ton environnement d'exécution :

### Tableau des sites A ###
my @SitesA = (
        "CD04K7S2B8",
        "CD04KU7HG5"
        );

### Tableau des sites B ###
my @SitesB = (
        "CD04K7UFCC",
        "CD15SDFRG5"
        );

my $Feuillet = $ref_routeur->{feuillet};
my $Site = $ref_routeur->{type_site};

if (/$Feuillet/ ~~ @SitesA)
{
    $Site = 'Site_Central';
    $self->forceKey(-key=>"{type_site}");
}

if (/$Feuillet/ ~~ @SitesB)
{
    $Site = 'Site_Distant';
    $self->forceKey(-key=>"{type_site}");
}

Dal
0