Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule
Tk::TableMatrix, mais cela n'a pas d'importance) :
Soient deux chaînes, $old_value et $new_value, différant d'un
caractère, en plus ou en moins.
$ix_curseur est la position du curseur d'insertion "avant"
Je cherche à déterminer la position du curseur d'insertion "après"
(dans $new_value) si $new_value est validée, que l'on ait rajouté ou
supprimé un caractère.
Pour le moment, j'utilise le code suivant :
my $longueur;
my $shift;
if (length($old_value) <= length($new_value)) {
$longueur = length($old_value);
shift = 0;
} else {
$longueur = length($new_value);
$shift = 1;
}
for ($i=0; $i<$longueur; $i++) {
last if substr($old_value, 0, $i) ne substr($new_value, 0, $i);
}
$ix_curseur -= $shift; # nouvelle valeur de la position
Ce code fonctionne, il n'est pas complètement testé. Cependant je
voudrais savoir si une regexp pourrait faire plus simplement (plus
élégamment) ce que je cherche à faire.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
jeanpierre.vidal
(Jean-Pierre Vidal) wrote in message news:...
Bonjour,
Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule Tk::TableMatrix, mais cela n'a pas d'importance) : Soient deux chaînes, $old_value et $new_value, différant d'un caractère, en plus ou en moins. $ix_curseur est la position du curseur d'insertion "avant"
Je cherche à déterminer la position du curseur d'insertion "après" (dans $new_value) si $new_value est validée, que l'on ait rajouté ou supprimé un caractère.
Pour le moment, j'utilise le code suivant : my $longueur; my $shift; if (length($old_value) <= length($new_value)) { $longueur = length($old_value); shift = 0;
pardon : $shift = 0;
} else { $longueur = length($new_value); $shift = 1; } for ($i=0; $i<$longueur; $i++) { last if substr($old_value, 0, $i) ne substr($new_value, 0, $i); } $ix_curseur -= $shift; # nouvelle valeur de la position
Ce code fonctionne, il n'est pas complètement testé. Cependant je voudrais savoir si une regexp pourrait faire plus simplement (plus élégamment) ce que je cherche à faire.
Merci pour vos suggestions,
Jean-Pierre
jeanpierre.vidal@free.fr (Jean-Pierre Vidal) wrote in message news:<da7645dd.0311161146.3d7713ce@posting.google.com>...
Bonjour,
Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule
Tk::TableMatrix, mais cela n'a pas d'importance) :
Soient deux chaînes, $old_value et $new_value, différant d'un
caractère, en plus ou en moins.
$ix_curseur est la position du curseur d'insertion "avant"
Je cherche à déterminer la position du curseur d'insertion "après"
(dans $new_value) si $new_value est validée, que l'on ait rajouté ou
supprimé un caractère.
Pour le moment, j'utilise le code suivant :
my $longueur;
my $shift;
if (length($old_value) <= length($new_value)) {
$longueur = length($old_value);
shift = 0;
pardon : $shift = 0;
} else {
$longueur = length($new_value);
$shift = 1;
}
for ($i=0; $i<$longueur; $i++) {
last if substr($old_value, 0, $i) ne substr($new_value, 0, $i);
}
$ix_curseur -= $shift; # nouvelle valeur de la position
Ce code fonctionne, il n'est pas complètement testé. Cependant je
voudrais savoir si une regexp pourrait faire plus simplement (plus
élégamment) ce que je cherche à faire.
Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule Tk::TableMatrix, mais cela n'a pas d'importance) : Soient deux chaînes, $old_value et $new_value, différant d'un caractère, en plus ou en moins. $ix_curseur est la position du curseur d'insertion "avant"
Je cherche à déterminer la position du curseur d'insertion "après" (dans $new_value) si $new_value est validée, que l'on ait rajouté ou supprimé un caractère.
Pour le moment, j'utilise le code suivant : my $longueur; my $shift; if (length($old_value) <= length($new_value)) { $longueur = length($old_value); shift = 0;
pardon : $shift = 0;
} else { $longueur = length($new_value); $shift = 1; } for ($i=0; $i<$longueur; $i++) { last if substr($old_value, 0, $i) ne substr($new_value, 0, $i); } $ix_curseur -= $shift; # nouvelle valeur de la position
Ce code fonctionne, il n'est pas complètement testé. Cependant je voudrais savoir si une regexp pourrait faire plus simplement (plus élégamment) ce que je cherche à faire.
Merci pour vos suggestions,
Jean-Pierre
dominix
Jean-Pierre Vidal wrote:
Bonjour,
Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule Tk::TableMatrix, mais cela n'a pas d'importance) : Soient deux chaînes, $old_value et $new_value, différant d'un caractère, en plus ou en moins. $ix_curseur est la position du curseur d'insertion "avant"
Je cherche à déterminer la position du curseur d'insertion "après" (dans $new_value) si $new_value est validée, que l'on ait rajouté ou supprimé un caractère.
Pour le moment, j'utilise le code suivant : my $longueur; my $shift; if (length($old_value) <= length($new_value)) { $longueur = length($old_value); shift = 0; } else { $longueur = length($new_value); $shift = 1; } for ($i=0; $i<$longueur; $i++) { last if substr($old_value, 0, $i) ne substr($new_value, 0, $i); } $ix_curseur -= $shift; # nouvelle valeur de la position
Ce code fonctionne, il n'est pas complètement testé. Cependant je voudrais savoir si une regexp pourrait faire plus simplement (plus élégamment) ce que je cherche à faire.
Merci pour vos suggestions,
Jean-Pierre
je ne suis pas sur du tout d'avoir bien compris, toutefois je suggere a la place de tout ça:
Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule
Tk::TableMatrix, mais cela n'a pas d'importance) :
Soient deux chaînes, $old_value et $new_value, différant d'un
caractère, en plus ou en moins.
$ix_curseur est la position du curseur d'insertion "avant"
Je cherche à déterminer la position du curseur d'insertion "après"
(dans $new_value) si $new_value est validée, que l'on ait rajouté ou
supprimé un caractère.
Pour le moment, j'utilise le code suivant :
my $longueur;
my $shift;
if (length($old_value) <= length($new_value)) {
$longueur = length($old_value);
shift = 0;
} else {
$longueur = length($new_value);
$shift = 1;
}
for ($i=0; $i<$longueur; $i++) {
last if substr($old_value, 0, $i) ne substr($new_value, 0, $i);
}
$ix_curseur -= $shift; # nouvelle valeur de la position
Ce code fonctionne, il n'est pas complètement testé. Cependant je
voudrais savoir si une regexp pourrait faire plus simplement (plus
élégamment) ce que je cherche à faire.
Merci pour vos suggestions,
Jean-Pierre
je ne suis pas sur du tout d'avoir bien compris,
toutefois je suggere a la place de tout ça:
Il s'agit d'un contrôle de frappe "au fil de l'eau" (dans une cellule Tk::TableMatrix, mais cela n'a pas d'importance) : Soient deux chaînes, $old_value et $new_value, différant d'un caractère, en plus ou en moins. $ix_curseur est la position du curseur d'insertion "avant"
Je cherche à déterminer la position du curseur d'insertion "après" (dans $new_value) si $new_value est validée, que l'on ait rajouté ou supprimé un caractère.
Pour le moment, j'utilise le code suivant : my $longueur; my $shift; if (length($old_value) <= length($new_value)) { $longueur = length($old_value); shift = 0; } else { $longueur = length($new_value); $shift = 1; } for ($i=0; $i<$longueur; $i++) { last if substr($old_value, 0, $i) ne substr($new_value, 0, $i); } $ix_curseur -= $shift; # nouvelle valeur de la position
Ce code fonctionne, il n'est pas complètement testé. Cependant je voudrais savoir si une regexp pourrait faire plus simplement (plus élégamment) ce que je cherche à faire.
Merci pour vos suggestions,
Jean-Pierre
je ne suis pas sur du tout d'avoir bien compris, toutefois je suggere a la place de tout ça:
Je réexpose le problème : Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple entre le 'b' et le 'c'. Premier cas, on enlève un caractère après le curseur, cela donne par exemple 'abde'. Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'. On cherche la nouvelle position du curseur, elle est "avant la fin de chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde', avant 'cde' pour 'abcde' et 'abxcde')
Mon nouvel algo : sub index { my ($old_value, $new_value) = @_; my $ix = -1; $ix-- while (substr($old_value, $ix) eq substr($new_value, $ix)); return ++$ix + length $new_value; }
Ma question d'origine se résume à "peut-on trouver, au moyen des regexp, la longueur d'une chaîne commune à deux autres chaînes et se trouvant à la fin de ces dernières"
Mais peut-être est-ce une question à poser sur un autre groupe, fwp par exemple ?
Jean-Pierre
"dominix" <dominix"at"despammed.com> wrote in message news:<3fba96c8$0$255$626a54ce@news.free.fr>...
Jean-Pierre Vidal wrote:
Bonjour,
[snip]
Merci pour vos suggestions,
Jean-Pierre
je ne suis pas sur du tout d'avoir bien compris,
toutefois je suggere a la place de tout ça:
Je réexpose le problème :
Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple
entre le 'b' et le 'c'.
Premier cas, on enlève un caractère après le curseur, cela donne par
exemple 'abde'.
Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'.
On cherche la nouvelle position du curseur, elle est "avant la fin de
chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde',
avant 'cde' pour 'abcde' et 'abxcde')
Mon nouvel algo :
sub index {
my ($old_value, $new_value) = @_;
my $ix = -1;
$ix-- while (substr($old_value, $ix) eq substr($new_value, $ix));
return ++$ix + length $new_value;
}
Ma question d'origine se résume à "peut-on trouver, au moyen des
regexp, la longueur d'une chaîne commune à deux autres chaînes et se
trouvant à la fin de ces dernières"
Mais peut-être est-ce une question à poser sur un autre groupe, fwp
par exemple ?
Je réexpose le problème : Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple entre le 'b' et le 'c'. Premier cas, on enlève un caractère après le curseur, cela donne par exemple 'abde'. Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'. On cherche la nouvelle position du curseur, elle est "avant la fin de chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde', avant 'cde' pour 'abcde' et 'abxcde')
Mon nouvel algo : sub index { my ($old_value, $new_value) = @_; my $ix = -1; $ix-- while (substr($old_value, $ix) eq substr($new_value, $ix)); return ++$ix + length $new_value; }
Ma question d'origine se résume à "peut-on trouver, au moyen des regexp, la longueur d'une chaîne commune à deux autres chaînes et se trouvant à la fin de ces dernières"
Mais peut-être est-ce une question à poser sur un autre groupe, fwp par exemple ?
Jean-Pierre
dominix
Jean-Pierre Vidal wrote:
"dominix" <dominix"at"despammed.com> wrote
Jean-Pierre Vidal wrote:
[snip]
Je réexpose le problème : Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple entre le 'b' et le 'c'. Premier cas, on enlève un caractère après le curseur, cela donne par exemple 'abde'. Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'. On cherche la nouvelle position du curseur, elle est "avant la fin de chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde', avant 'cde' pour 'abcde' et 'abxcde')
Mon nouvel algo : sub index { my ($old_value, $new_value) = @_; my $ix = -1; $ix-- while (substr($old_value, $ix) eq substr($new_value, $ix)); return ++$ix + length $new_value; }
Ma question d'origine se résume à "peut-on trouver, au moyen des regexp, la longueur d'une chaîne commune à deux autres chaînes et se trouvant à la fin de ces dernières"
Mais peut-être est-ce une question à poser sur un autre groupe, fwp par exemple ?
je comprend mieux le probleme, et je pense que c'est le bon NG pour la question. IMHO les RE ne sont pas bonne a tout faire. j'aurais entrevu une solution avec map ou splice mais je trouve ta solution tres elegante. peut etre un bon golfeur pourra compacter encore un peu, mais bon ...
-- dominix
Jean-Pierre Vidal wrote:
"dominix" <dominix"at"despammed.com> wrote
Jean-Pierre Vidal wrote:
[snip]
Je réexpose le problème :
Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple
entre le 'b' et le 'c'.
Premier cas, on enlève un caractère après le curseur, cela donne par
exemple 'abde'.
Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'.
On cherche la nouvelle position du curseur, elle est "avant la fin de
chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde',
avant 'cde' pour 'abcde' et 'abxcde')
Mon nouvel algo :
sub index {
my ($old_value, $new_value) = @_;
my $ix = -1;
$ix-- while (substr($old_value, $ix) eq substr($new_value, $ix));
return ++$ix + length $new_value;
}
Ma question d'origine se résume à "peut-on trouver, au moyen des
regexp, la longueur d'une chaîne commune à deux autres chaînes et se
trouvant à la fin de ces dernières"
Mais peut-être est-ce une question à poser sur un autre groupe, fwp
par exemple ?
je comprend mieux le probleme, et je pense que c'est le bon NG pour
la question.
IMHO les RE ne sont pas bonne a tout faire. j'aurais entrevu une
solution avec map ou splice mais je trouve ta solution tres elegante.
peut etre un bon golfeur pourra compacter encore un peu, mais bon ...
Je réexpose le problème : Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple entre le 'b' et le 'c'. Premier cas, on enlève un caractère après le curseur, cela donne par exemple 'abde'. Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'. On cherche la nouvelle position du curseur, elle est "avant la fin de chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde', avant 'cde' pour 'abcde' et 'abxcde')
Mon nouvel algo : sub index { my ($old_value, $new_value) = @_; my $ix = -1; $ix-- while (substr($old_value, $ix) eq substr($new_value, $ix)); return ++$ix + length $new_value; }
Ma question d'origine se résume à "peut-on trouver, au moyen des regexp, la longueur d'une chaîne commune à deux autres chaînes et se trouvant à la fin de ces dernières"
Mais peut-être est-ce une question à poser sur un autre groupe, fwp par exemple ?
je comprend mieux le probleme, et je pense que c'est le bon NG pour la question. IMHO les RE ne sont pas bonne a tout faire. j'aurais entrevu une solution avec map ou splice mais je trouve ta solution tres elegante. peut etre un bon golfeur pourra compacter encore un peu, mais bon ...
-- dominix
jeanpierre.vidal
"dominix" <dominix"at"despammed.com> wrote in message news:<3fbf443b$0$27014$...
Jean-Pierre Vidal wrote:
"dominix" <dominix"at"despammed.com> wrote
Jean-Pierre Vidal wrote:
[snip]
Je réexpose le problème : Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple entre le 'b' et le 'c'. Premier cas, on enlève un caractère après le curseur, cela donne par exemple 'abde'. Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'. On cherche la nouvelle position du curseur, elle est "avant la fin de chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde', avant 'cde' pour 'abcde' et 'abxcde')
Mon nouvel algo : sub index { my ($old_value, $new_value) = @_; my $ix = -1; $ix-- while (substr($old_value, $ix) eq substr($new_value, $ix)); return ++$ix + length $new_value; }
Ma question d'origine se résume à "peut-on trouver, au moyen des regexp, la longueur d'une chaîne commune à deux autres chaînes et se trouvant à la fin de ces dernières"
Mais peut-être est-ce une question à poser sur un autre groupe, fwp par exemple ?
je comprend mieux le probleme, et je pense que c'est le bon NG pour la question. IMHO les RE ne sont pas bonne a tout faire. j'aurais entrevu une solution avec map ou splice mais je trouve ta solution tres elegante. peut etre un bon golfeur pourra compacter encore un peu, mais bon ...
merci dominix, c'est vrai que les RE ne sont pas bonne a tout faire, mais plus j'avance dans l'apprentissage de perl, plus je m'aperçois que j'en utilise :)
Jean-Pierre
"dominix" <dominix"at"despammed.com> wrote in message news:<3fbf443b$0$27014$626a54ce@news.free.fr>...
Jean-Pierre Vidal wrote:
"dominix" <dominix"at"despammed.com> wrote
Jean-Pierre Vidal wrote:
[snip]
Je réexpose le problème :
Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple
entre le 'b' et le 'c'.
Premier cas, on enlève un caractère après le curseur, cela donne par
exemple 'abde'.
Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'.
On cherche la nouvelle position du curseur, elle est "avant la fin de
chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde',
avant 'cde' pour 'abcde' et 'abxcde')
Mon nouvel algo :
sub index {
my ($old_value, $new_value) = @_;
my $ix = -1;
$ix-- while (substr($old_value, $ix) eq substr($new_value, $ix));
return ++$ix + length $new_value;
}
Ma question d'origine se résume à "peut-on trouver, au moyen des
regexp, la longueur d'une chaîne commune à deux autres chaînes et se
trouvant à la fin de ces dernières"
Mais peut-être est-ce une question à poser sur un autre groupe, fwp
par exemple ?
je comprend mieux le probleme, et je pense que c'est le bon NG pour
la question.
IMHO les RE ne sont pas bonne a tout faire. j'aurais entrevu une
solution avec map ou splice mais je trouve ta solution tres elegante.
peut etre un bon golfeur pourra compacter encore un peu, mais bon ...
merci dominix, c'est vrai que les RE ne sont pas bonne a tout faire,
mais plus j'avance dans l'apprentissage de perl, plus je m'aperçois
que j'en utilise :)
"dominix" <dominix"at"despammed.com> wrote in message news:<3fbf443b$0$27014$...
Jean-Pierre Vidal wrote:
"dominix" <dominix"at"despammed.com> wrote
Jean-Pierre Vidal wrote:
[snip]
Je réexpose le problème : Soit une chaîne 'abcde' que l'on édite. Le curseur est par exemple entre le 'b' et le 'c'. Premier cas, on enlève un caractère après le curseur, cela donne par exemple 'abde'. Deuxième cas, on insère le caractère 'x', cela donne 'abxcde'. On cherche la nouvelle position du curseur, elle est "avant la fin de chaîne commune aux deux chaînes" (avant 'de' pour 'abcde' et 'abde', avant 'cde' pour 'abcde' et 'abxcde')
Mon nouvel algo : sub index { my ($old_value, $new_value) = @_; my $ix = -1; $ix-- while (substr($old_value, $ix) eq substr($new_value, $ix)); return ++$ix + length $new_value; }
Ma question d'origine se résume à "peut-on trouver, au moyen des regexp, la longueur d'une chaîne commune à deux autres chaînes et se trouvant à la fin de ces dernières"
Mais peut-être est-ce une question à poser sur un autre groupe, fwp par exemple ?
je comprend mieux le probleme, et je pense que c'est le bon NG pour la question. IMHO les RE ne sont pas bonne a tout faire. j'aurais entrevu une solution avec map ou splice mais je trouve ta solution tres elegante. peut etre un bon golfeur pourra compacter encore un peu, mais bon ...
merci dominix, c'est vrai que les RE ne sont pas bonne a tout faire, mais plus j'avance dans l'apprentissage de perl, plus je m'aperçois que j'en utilise :)