假设除了标点符号之外,两行文字逐字逐句对应。如何对它们进行垂直对齐?
例如:
$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知识库存:)
答案 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, '' ) }
}