3

句読点を除いて、2行のテキストが単語ごとに対応しているとします。それらを垂直に配置するにはどうすればよいですか?

例えば:

$ line1="私は実際には英語です";
$ line2 = "Je suis anglais、en fait";

出力を次のようにします。

実は私は英語です
Je suis anglais、enfait。

SOに投稿された以前の質問への回答と、LearningPerlの「formattedOutputwith 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、enfait。

誰かがこの問題を解決するためのヒントや提案を親切に教えてもらえますか?

ありがとう :)

更新しました

@ysthは私を正しい軌道に乗せてくれました!再度感謝します:)私は自分の日付がどのように見えるかを知っているので、このサンプルでは、​​次のコード行を追加するだけです。

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

Perlの学習では、スプライス関数を使用して配列の途中で項目を削除または追加できることを簡単に説明しています。おかげで、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, '' );
        }
    }
}

または、フラグビットをアンパッサンで使用すると、もう少し凝ったものになります。

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 に答える