3

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

例如:

$line1 = "其实我是英国人";
$line2 = "Je suis anglais , en fait";

我希望输出是这样的:

我其实是英国人
Je suis anglais, 既成事实。

根据我从之前在 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";

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

我其实是英国人
Je suis anglais , 既成事实。

有人可以给我一些提示和建议来解决这个问题吗?

谢谢 :)

更新

@ysth 让我走上了正确的道路!再次感谢:) 因为我知道我自己的日期是什么样的,对于这个示例,我所要做的就是添加以下代码行:

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

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

4

1 回答 1

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, '' ) }
}
于 2009-11-15T07:27:26.340 回答