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知识库:)
从您的示例输出中,您似乎要做的是添加额外的空字符串元素,其中只有一个数组中的标点符号而不是另一个数组中的标点符号.这很简单:
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)
| 归档时间: |
|
| 查看次数: |
1553 次 |
| 最近记录: |