Bonjour,

J'ai un fichier texte texte.csv à valeurs séparées par des points-virgules :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
"Jean";"Martin";"0123456789";"0600000000";
"Pierre";"Dupond";"987654321";"0611111111";
Je cherche à remplacer toutes les chaînes de caractères et tous les chiffres par des chaînes aléatoires et des chiffres aléatoires. J'ai écrit le code suivant :

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
 
#!/usr/bin/perl -w
 
if (!open(FIC,"$ARGV[0]")) {
	print "impossible d'ouvrir $ARGV[0]";
	exit(1);
}
 
my @t;
my @colonne;
 
while (defined($l=<FIC>)) {
	@entree=split(/;/,$l);
	$no_col=0;
	foreach $cellule (@entree) {
		$t[$.][$no_col]=$cellule;
		$no_col++;
	}
}
 
my @lettres = ( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" ); 
 
for my $i (1..scalar(@t)-1) {
	for my $j (0..$no_col-1) {
		$_=$t[$i][$j];
		s/[[:alpha:]]/$lettres[int(rand(scalar(@lettres)-1))]/g;
		s/[0-9]/int(rand(9))/g;
		$t[$i][$j]=$_;
	}
}
 
for $i (1..scalar(@t)-1) {
	for $j (0..$no_col-1) {
		print "$t[$i][$j];";
	}
	print "\n";
}
J'obtiens la sortie suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
$ perl remplacement.pl texte.csv
"qqqq";"jjjjjj";"int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))";"int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))";
;
"jjjjjj";"eeeeee";"int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))";"int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))int(rand(9))";
;
1. Les expressions régulières semblent ne pas évaluer les fonctions (ici, la fonction int(rand(9))). Y a-t-il un moyen de les forcer à le faire ?

2. À l'intérieur d'une même expression régulière, la fonction rand() n'est calculée qu'une fois. Peut-on la forcer à se rafraîchir, par exemple en insérant le troisième terme de l'expression régulière au sein d'une boucle, quelque chose du type s/[[:alpha:]]/for my $k (0..length($t[$i][$j]) { ... }/g ? Mais je ne vois pas trop comment on pourrait faire...

3. Pourriez-vous me donner une façon d'écrire ce programme, éventuellement plus concise, plus propre ou plus "perlish" ?

4. Pourquoi Perl me met-il des "\0;" à chaque fois que je sors de la boucle indexée par $j ?

5. J'aurais pu écrire scalar(@t)-1 de la façon suivante : $#t. Mais comment écrire le dernier indice de $t[$i] ? $#{$t[$i]} ?


Merci d'avance,
endreillie