Bonjour,
Je voudrais savoir s'il est possible de préciser le pas d'une liste en Perl comme c'est possible en Python et en Haskell.
Merci
Version imprimable
Bonjour,
Je voudrais savoir s'il est possible de préciser le pas d'une liste en Perl comme c'est possible en Python et en Haskell.
Merci
Pas sûr de bien comprendre ce que tu veux. Peux-tu donner un exemple de ce que tu cherches à faire.
Un exemple de boucle à porter par exemple :)
je me risque à une réponse:
en python il est possible de faire:
En Perl je n'ai jamais essayé mais je ne pense pas qu'on puisse le faire direstement (sans passer par une boucle for) ou faire quelque chose comme:Code:
1
2
3
4 l = range(1, 10) #[1, 2, 3, 4, 5, 6, 7, 8, 9] l[0:5] #[1, 2, 3, 4, 5] l[0:5:2] #[1, 3, 5] => le 3ème éléments étant le "pas" de lecture l[0:5:2] = [11, 13, 15] #l -> [11, 2, 13, 14, 15, 6, 7, 8, 9]
mais ce n'est peut être pas toujours applicable (à réfléchir)Code:my @result = grep {$_ % 2 == 0} @tableau; # ne récupère que les éléments de @tableau divisible par 2.
Edit: La proposition grep ne correspond pas à ta demande en fait. Je la laisse mais en fait regarde la valeur et non l'indice :aie:
Dans les versions récentes de Python, on peut aussi préciser le pas en ajoutant un : supplé-
mentaire et en indiquant le pas par un entier :
en Haskell :Code:
1
2
3 >>> animaux = ['girafe', 'tigre', 'singe', 'souris'] >>> animaux[0:3:2] ['girafe', 'singe']
Et donc je voulais savoir si ce système existe en Perl.Code:
1
2
3
4 ghci> [2,4..20] [2,4,6,8,10,12,14,16,18,20] ghci> [3,6..20] [3,6,9,12,15,18]
Je ne connais pas d'extension à l'opérateur range permettant de parcourir des tableaux par "pas".
Mais je peux facilement le faire avec map sur l'indice du tableau :
Code:
1
2$ perl -E '$pas = 2; @a=qw(a b c d e f g); say join ",", map $a[$pas*$_], 0 .. @a/$pas-1;' a,c,e
Bonjour,
une solution possible:
Code:
1
2
3$ perl -E '@a = a..z; say join " ", map $a[$_], grep $_%2==0, 0..$#a;' a c e g i k m o q s u w y
Bon j'ai résolu mon problème, en fait je pensais tellement à la boucle foreach que j'en ai oublié la boucle for comme en C
du coup pour par exemple avoir un pas de 10 dans une boucle de 0 à 90 je fais comme ça :
j'ai tilté en recherchant "step" sur cette page : http://hyperpolyglot.org/moreCode:
1
2
3
4 for (my $var = 0; $var <= 90; $var+=10) { print "$var\n"; }
merci et désolé :oops:
Il est assez rare en perl d'avoir besoin de travailler sur des indices de tableau, étant donné que les fonctions/opérateurs de liste sont souvent bien plus pratiques. Si c'est le cas d'usage que vous envisagez, il y a peut-être des solutions plus "perlish". A vous de voir si vous souhaitez en discuter en élargissant votre question.
ça m'intéresserais de connaître des techniques plus "perlish" effectivement oui.
Pour cela, il faudrait que tu élargisses le champs de ta question, en expliquant par exemple ce que tu veux faire de cet "indice" utilisé par "pas" (dans quel algorithme il s'insère).
Tu peux déjà essayer ceci:
OU:Code:
1
2
3
4
5
6
7
8
9
10
11
12 perl -E 'say map $_ * 10, 0..9;' 0 10 20 30 40 50 60 70 80 90
si, comme moi, tu as sur certaines plateformes une version trop ancienne de Perl pour avoir la fonction say.Code:
1
2perl -e 'print map { $_ * 10 , "\n" } 0..9;'
Ou un autre exemple utilisant une "tranche" de tableau:
Code:
1
2
3
4
5
6
7
8 $perl -e 'my @months = qw /jan fev mar apr may jun jul aug sep oct nov dec/; print join "\n", @months[map $_ * 2 , 0..5];' jan mar may jul sep nov