2009-11-15 6 views
3

Supposons que deux lignes de texte correspondent l'une à l'autre mot par mot, à l'exception des signes de ponctuation. Comment puis-je faire un alignement vertical d'entre eux?Comment faire l'alignement vertical de lignes de texte en Perl?

Par exemple:

 
$line1 = "I am English in fact"; 
$line2 = "Je suis anglais , en fait"; 

Je veux que la sortie soit comme ceci:

 
I am  English  in fact 
Je suis anglais , en fait . 

Je suis venu avec le code suivant, en fonction de ce que j'ai appris des réponses à mes questions précédentes postées sur SO et la section "Sortie formatée avec printf" de Learning Perl.

use strict; 
use warnings; 

my $line1 = "I am English in fact"; 
my $line2 = "Je suis anglais , en fait."; 

my @array1 = split " ", $line1; 
my @array2= split " ", $line2; 

printf "%-9s" x @array1, @array1; 
print "\n"; 
printf "%-9s" x @array2, @array2; 
print "\n"; 

Ce n'est pas satisfaisant. La sortie est la suivante:

 
I  am  English in  fact 
Je  suis  anglais ,  en  fait. 

Quelqu'un peut-il me donner quelques conseils et suggestions pour résoudre ce problème?

Merci :)

Mise à jour

@ysth m'a envoyé sur la bonne voie! Merci encore :) Depuis que je sais ce que ma propre date ressemble, pour cet exemple, tout ce que je dois faire est d'ajouter la ligne de code suivante:

for (my $i = 0; $i < @Array1 && $i < @Array2; ++$i) { 
    if ($Array2[$i] =~ /,/) { 
     splice(@Array1, $i, 0, ''); 
    } 
} 

Learning Perl mentionne brièvement cette fonction d'épissure peut être utilisé pour enlever ou ajoutez des éléments au milieu du tableau. Maintenant, merci, j'ai encore élargi mon stock de connaissances Perl :)

+0

Dans ce travail, vous devez l'ajouter comme une balise. – voyager

+1

@voyager, ne vous offusquez pas, mais qu'est-ce qui vous fait penser que c'est des devoirs? cela ressemble-t-il à des devoirs? Je ne suis pas sûr. Mais non, ce n'est certainement pas des devoirs. – Mike

+1

Complètement hors-sujet, mais cette approche * à la traduction * est une mauvaise, mauvaise idée. Les langues se correspondent rarement si bien les unes aux autres. – Telemachus

Répondre

5

De votre sortie d'échantillon, il semble que vous essayez d'ajouter éléments de chaîne vides où il n'y a que la ponctuation dans un tableau mais pas dans L'autre. Ce est assez simple à faire:

for (my $i = 0; $i < @array1 && $i < @array2; ++$i) { 
    if ($array1[$i] =~ /\w/ != $array2[$i] =~ /\w/) { 
     if ($array1[$i] =~ /\w/) { 
      splice(@array1, $i, 0, ''); 
     } 
     else { 
      splice(@array2, $i, 0, ''); 
     } 
    } 
} 

Ou, un peu plus de fantaisie, en utilisant des morceaux de drapeau en passant:

given ($array1[$i] =~ /\w/ + 2 * $array2[$i] =~ /\w/) { 
    when (1) { splice(@array1, $i, 0, '') } 
    when (2) { splice(@array2, $i, 0, '') } 
} 
+2

Votre réponse n'est pas très simple à quelqu'un qui lit encore "Learning Perl". – Ether

+0

@ysth, merci de partager le code. Mais il semble y avoir un problème. Après avoir ajouté le code, Perl me donne ceci: Le type d'argument 1 à épisser doit être array (opération non nulle) à C: \ test.pl ligne 13 , près de "'')" Exécution de C: \ test. pl abandonné en raison d'erreurs de compilation. – Mike

+1

@Ether, bien que je suis toujours en train de lire le livre de Llama. Fondamentalement, je peux comprendre ce que @ysth a écrit dans son code. L'opérateur ternaire, la fonction d'épissage, le && etc etc sont tous couverts dans le livre.Mais de toute façon merci pour la gentillesse :) – Mike

Questions connexes