Как сделать вертикальное выравнивание строк текста в Perl?

Предположим, что две строки текста соответствуют друг другу слово за словом, за исключением знаков препинания. Как мне сделать их вертикальное выравнивание?

Например:

$ line1 = "Я на самом деле английский";
$line2 = "Je suis anglais, en fait";

Я хочу, чтобы вывод был таким:

Я на самом деле английский
Je suis anglais, на самом деле.

Я придумал следующий код, основанный на том, что я узнал из ответов на мои предыдущие вопросы, опубликованные в SO, и раздела "Форматированный вывод с printf" в 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";

Это не удовлетворяет. Выход такой:

Я на самом деле английский
Je suis anglais, на самом деле.

Может кто-нибудь любезно дать мне несколько советов и предложений для решения этой проблемы?

Спасибо:)

обновленный

@ysth отправил меня на правильный путь! Еще раз спасибо:) Поскольку я знаю, как выглядит моя собственная дата, для этого примера все, что мне нужно сделать, это добавить следующую строку кода:

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

Изучение Perl кратко упоминает, что функция склейки может использоваться для удаления или добавления элементов в середине массива. Теперь спасибо, я снова расширил свой запас знаний Perl:)

1 ответ

Решение

Из вашего примера вывода кажется, что вы пытаетесь добавить дополнительные пустые строковые элементы, где в одном массиве есть только знаки препинания, а в другом нет. Это довольно просто сделать:

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, '' );
        }
    }
}

Или, что более интересно, используя биты флага en passant:

given ( $array1[$i] =~ /\w/ + 2 * $array2[$i] =~ /\w/ ) {
    when (1) { splice( @array1, $i, 0, '' ) }
    when (2) { splice( @array2, $i, 0, '' ) }
}
Другие вопросы по тегам