Как сделать вертикальное выравнивание строк текста в 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, '' ) }
}