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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
| #!/usr/bin/perl
use warnings;
use strict;
use utf8;
ActiverAccents();
print "Usage : \n\nperl argv.pl F1 | F2\n\n";
print "\nARGV @ARGV\n\n";
my $Fonc = $ARGV[0];
eval("$Fonc()");
sub F1 {
print "Activation F1\n";
}
sub F2 {
print "Activation F2\n";
}
print "\n";
# Lolo78 # http://www.developpez.net/forums/d1469246/autres-langages/perl/langage/utiliser-variable-appeler-routine/#post7962807
# Le petit problème est que faire un eval sur du texte provenant de l'extérieur est une faille de sécurité.
# Je serais d'avis de créer une table de distribution (un hash ou un tableau contenant des référérences à des fonctions.
my %dist = (
"test_1" => sub {print "TEST_01";},
"test_2" => sub {print "TEST_02";},
# ...
);
# Appel
$dist{test_1}->();
print "\n\n";
# Si les tests sont numérotés comme dans ton exemple, tu peux même construire la table dynamiquement avec un compteur. C'est encore plus simple.
# Unix # perl -E '$distrib{"test_$_"} = sub {say "TEST_$_";} for 1..9; say "$_ => $distrib{$_}" for sort keys %distrib; say ""; $distrib{"test_$_"}->() for 1..5'
# Win # perl -E "$distrib{qq'test_$_'} = sub {say qq'TEST_$_';} for 1..9; say qq'$_ => $distrib{$_}' for sort keys %distrib; say qq''; $distrib{qq'test_$_'}->() for 1..5"
=pod
test_1 => CODE(0x600068558)
test_2 => CODE(0x600068558)
test_3 => CODE(0x600068558)
test_4 => CODE(0x600068558)
test_5 => CODE(0x600068558)
test_6 => CODE(0x600068558)
test_7 => CODE(0x600068558)
test_8 => CODE(0x600068558)
test_9 => CODE(0x600068558)
TEST_1
TEST_2
TEST_3
TEST_4
TEST_5
=cut
my ( %distrib ) = ();
for (1..9) {
$distrib{"test_$_"} = sub {print "Test avec $_";};
}
for (sort keys %distrib) {
print "$_ => $distrib{$_}\n";
}
print "\n\n";
# Utilisation en boucle OK
for (4..8) {
$distrib{"test_$_"}->();
print "\n";
}
print "\n";
# Utilisation simple OK
for (3) {
$distrib{"test_$_"}->();
print "\n";
}
print "\n";
# Celui-ci plante : Use of uninitialized value $_ in concatenation (.) or string at argv.pl line 62.
my $Num = 4;
$distrib{"test_$Num"}->();
print "\n\n";
#############################
for my $Num (1..9) {
$distrib{"test_$Num"} = sub {print "Test avec $Num";};
}
for (sort keys %distrib) {
print "$_ => $distrib{$_}\n";
}
print "\n";
# Utilisation en boucle OK
for (4..8) {
$distrib{"test_$_"}->();
print "\n";
}
print "\n\n";
# Utilisation simple OK
for (3) {
$distrib{"test_$_"}->();
print "\n";
}
print "\n";
# Celui-ci aussi est enfin OK
$Num = 4;
$distrib{"test_$Num"}->();
print "\n\n";
#==============================================================
# Pour avoir les accents sur la console DOS
# http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
#==============================================================
sub ActiverAccents {
my $encodage;
# Windows
if ( lc($^O ) eq 'mswin32') {
eval {
my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
$encodage = "cp$codepage";
foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
binmode $h, ":encoding($encodage)";
}
};
}
else {
$encodage = `locale charmap`;
eval {
foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
binmode $h, ":encoding($encodage)";
}
};
}
return $encodage;
}
###############
# Date et Heure
sub date {
my $time = shift || time; #$time par defaut vaut le time actuel
my ( $seconde, $minute, $heure, $jour, $mois, $annee, $jour_semaine, $jour_annee, $heure_hiver_ou_ete )
= localtime($time);
$mois += 1;
$annee += 1900;
# On rajoute 0 si le chiffre est compris entre 1 et 9
foreach ( $seconde, $minute, $heure, $jour, $mois, $annee ) { s/^(\d)$/0$1/; }
return "Le $jour/$mois/$annee à $heure:$minute:$seconde";
} |
Partager