Как сделать вертикальное выравнивание строк текста в Perl? - PullRequest
3 голосов
/ 15 ноября 2009

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

Например:

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

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

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

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

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

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

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

Спасибо:)

Обновлено

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

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

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

1 Ответ

5 голосов
/ 15 ноября 2009

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

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