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

时间:2009-11-15 06:58:07

标签: 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 Output with 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";

不满意。输出是这样的:

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

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

1 个答案:

答案 0 :(得分: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, '' );
        }
    }
}

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

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