2010-10-01 2 views
0
  • J'ai 5 fichiers Perl qui sont des scripts de vérification pour 5 états différents de mon environnement.Dois-je utiliser des sous-programmes imbriqués dans Perl?

    Chacun d'entre eux a au moins quelques sous-programmes.

  • Jusqu'à maintenant, le nombre d'états était limité à 5 et ceux-ci fonctionnaient bien. Mais maintenant, j'ai 20 autres états de l'environnement et donc 20 autres scripts Perl selon le design actuel. Je veux déplacer tous les cinq scripts vers un seul script qui prend l'état comme argument et possède 5 sous-programmes différents pour 5 états différents. De cette façon, quand j'ai besoin d'ajouter une vérification pour un autre état, je vais juste devoir définir un nouveau sous-programme au lieu d'un tout nouveau script Perl. Le problème est qu'il s'agira d'utiliser des sous-programmes imbriqués (qui sont known to run into issues), ou de dérouler les sous-programmes eux-mêmes.

Par exemple,

scripts originaux

$ cat verify1.pl 
sub a1 { 
    ... 
} 
sub b1 { 
    ... 
} 
a1(); b1(); a1(); 
$ cat verify2.pl 
sub a2 { 
    ... 
} 
sub b2 { 
    ... 
} 
sub c2 { 
    ... 
} 
a2(); b2(); c2(); a2(); 
$ 

scénario consolidé

$ cat verify.pl 
sub one { 
    ... 
} 
sub two { 
    ... 
} 
my ($arg) = @ARGV; 
if ($arg == 1) { 
    one(); # should do what verify1.pl did 
} 
elsif ($arg == 2) { 
    two(); # should do what verify2.pl did 
} 
$ 

Que dois-je faire pour résoudre ce problème?

+1

Non sûr, mais ce lien n'est probablement pas pertinent, sauf si vous utilisez actuellement mod_perl. Rappelez-vous simplement d'activer les avertissements et vous devriez aller bien .. –

Répondre

6
sub one { 
    do 'verify1.pl'; 
} 
sub two { 
    do 'verify2.pl'; 
} 

À long terme, cependant, il est préférable de convertir vos scripts en modules afin de gérer la complexité d'une manière moderne et sain d'esprit.

+1

+1 pour le conseil d'utiliser le module. Voir http://perldoc.perl.org/perlmod.html#Perl-Modules comme référence (mais pas comme un tutoriel). – dolmen

2

Vous pouvez placer les sous-programmes normalement comme ils devraient l'être.

sub a1 { 
    ... 
} 
sub b1 { 
    ... 
} 
sub a2 { 
    ... 
} 
sub b2 { 
    ... 
} 
sub c2 { 
    ... 
} 
sub one { 
    a1(); b1(); a1(); 
} 
sub two { 
    a2(); b2(); c2(); a2(); 
} 
my ($arg) = @ARGV; 
if ($arg == 1) { 
    one(); # should do what verify1.pl did 
} 
elsif ($arg == 2) { 
    two(); # should do what verify2.pl did 
} 
1

Je résoudrais cela en plaçant simplement tous les sous-programmes dans un fichier et en renommant tout conflit. Cependant, il semble que votre problème est que vous êtes en train de coder en dur pour chaque situation de validation possible que vous pourriez rencontrer. Le meilleur moyen est de trouver un processus où vous pouvez construire des pipelines de validation de façon dynamique. Puisque je ne sais pas ce dont vous avez besoin, je ne sais pas si quelque chose comme Data::Constraint ou les autres modules de validation serait bon pour vous. Il est extrêmement difficile de donner des conseils utiles avec si peu d'informations dans la question.

Questions connexes