Bonjour,
J'ai un fichier texte texte.csv à valeurs séparées par des points-virgules :
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 "Jean";"Martin";"0123456789";"0600000000"; "Pierre";"Dupond";"987654321";"0611111111";
J'obtiens la sortie suivante :
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"; }
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 ?
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))"; ;
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
Partager