| 12
 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