如何在Perl中垂直对齐文本行?

Mik*_*ke 3 perl text-alignment

假设除了标点符号之外,两行文本逐字逐句对应.如何对它们进行垂直对齐?

例如:

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

我希望输出如下:

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

我根据我在SO上发布的先前问题的答案以及Learning Perl的"使用printf格式化输出"部分所学到的内容,提出了以下代码.

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";
Run Code Online (Sandbox Code Playgroud)

这并不令人满意.输出是这样的:

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, '');
    }
}
Run Code Online (Sandbox Code Playgroud)

学习Perl简要提到splice函数可用于删除或添加数组中间的项目.谢谢,我再次扩大了我的Perl知识库:)

yst*_*sth 5

从您的示例输出中,您似乎要做的是添加额外的空字符串元素,其中只有一个数组中的标点符号而不是另一个数组中的标点符号.这很简单:

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, '' );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,更有趣,使用标志位en passant:

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

  • 对于仍在阅读"学习Perl"的人来说,你的答案并不是那么简单. (2认同)