【问题标题】:How do I do vertical alignment of lines of text in Perl?如何在 Perl 中垂直对齐文本行?
【发布时间】:2009-11-16 09:43:42
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 如果这是家庭作业,您应该将其添加为标签。
  • @voyager,没有冒犯,但是是什么让你认为这是作业?它看起来像家庭作业吗?我不确定。但是不,这绝对不是功课。
  • 完全跑题了,但是这种翻译方法是一个坏主意。语言很少能一字不差地相互匹配。
  • @Telemachus,好吧,我承认翻译这不是一个好主意。但我也在使用修改过的 Lingua::Han::PinYin 模块,它可以自动检索汉字的拼音(发音)。我需要做一些垂直对齐。
  • @Mike:太棒了,我把你的例子也照搬了。

标签: perl text-alignment


【解决方案1】:

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

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

或者,更花哨的是,使用标志位:

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

【讨论】:

  • 对于仍在阅读“Learning Perl”的人来说,您的回答不是很直接。
  • @ysth,感谢分享代码。但是好像有问题。添加代码后,Perl 给了我这个: arg 1 拼接的类型必须是数组(不是空操作)在 C:\test.pl 第 13 行,靠近 "'' )" C:\test.pl 的执行由于中止编译错误。
  • @Ether,虽然我还在读 Llama 的书。基本上我可以理解@ysth 在他的代码中写的内容。三元运算符、拼接函数、&& 等都包含在本书中。但无论如何,谢谢你的好意:)
  • @ysth,感谢更新代码。它按预期工作。非常感谢:)
  • @ysth,给定的 when 构造似乎不起作用。我添加了使用 5.010;然后运行代码,Perl 给了我这个: Use of uninitialized value $i in array element at C:\test.pl line 11. Use of uninitialized value $i in array element at C:\test.pl line 11. I am English 事实上 Je suis anglais , en fait.
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2014-11-03
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多