2

出力の書式設定を担当する Perl コードがあります。問題は、各文字列の特定の文字 (/ としましょう) の前に配置するタブの正しい数を計算する必要があることです。したがって、さまざまな長さの行を取得する代わりに、固定長の文字列を取得したいと思います (ただし、最大として最長を使用して、できるだけ短くします)。これにどのようにアプローチすればよいですか?

出力の例 (形式はコメントアウト、生の配列のみ):

Long title with some looong words / short text
Another title / another short text

私はこのようにそれを必要とします:

title with some looong words / short text
Different title              / another short text

これは私の最初の試みでしたが、特定の 1 文字の後にタブを使用する必要はありませんでした。

my $text = Text::Format->new;

$text->rightAlign(1);
$text->columns(65);
$text->tabstop(4);

$values[$i] = $text->format(@values[$i]);
4

3 に答える 3

2

Perl でテキストをフォーマットするには、一般に受け入れられている 2 つの方法があるため、列を並べます。

  • とを使用printfsprintfます。これはおそらく最も一般的な方法です。
  • Perl フォーマット機能を使用します。行をどのように表示するかを定義してから、writeを使用してその形式に出力します。

ここ数年、Perl Format 仕様のものを使用している人を見たことがありません。Perl は主にスーパー awk の代替言語 (実用的な抽出とレポート言語) として使用されていたため、Perl 3.x の全盛期には大きな機能でし。しかし、メカニズムはまだそこにあり、きっと楽しく学べるはずです。


次に、クエリの 2 番目の部分です。テキストを単に書式設定するだけでなく、タブで書式設定する必要があります。

幸いなことに、Perl にはText::Tabsという組み込みモジュールがあります。これは、1 つまたは 2 つのあいまいなタスクを実行するモジュールの 1 つですが、それらをうまく実行します。

実際にText::Tabsは、2 つのタスクを適切に処理することはできませんが、適切に処理します。

sprintfPerl の書式設定機能を使用してレポートを作成します。レポート全体を配列に保存します。Text::TabsNL を処理しないため、配列でなければなりません。次に、unexpand関数を使用して、その配列内のスペースをタブ付きの別の配列に置き換えます。

WORD 'O WARNING :Text::Tabs非常に悪いこと$tabstopをします: 許可を求めずに変数をプログラムにインポートします。という変数を使用する場合は$tabstop、それを変更する必要があります。$tabstopタブが表すスペースの数を設定できます。デフォルトでは 8 に設定されています。

于 2012-11-07T18:44:59.717 に答える
0

モジュールText::Tableが役立つかもしれません。

#!/usr/bin/perl
use warnings;
use strict;

use Text::Table;

my @array = ('Long title with some looong words', 'short text',
             'Another title',                     'another short text');

my $table = Text::Table::->new(q(), \' / ', q()); # Define the separator.
$table->add(shift @array, shift @array) while @array;
print $table;
于 2012-11-07T15:17:53.567 に答える
0

ドキュメントで見つけたものから Text::Format は段落の書式設定のみを行います。あなたが望むのは表形式です。そのための基本的なアプローチは、データを行と列ごとにテキストのマトリックスに分割し、列ごとに最も長い要素を見つけ、それを使用して固定幅のデータを出力することです。例えば:

my @values = (
    'Long title with some looong words / short text',
    'Another title / another short text',
);

# split values into per-column text
my @text = map { [ split '\s*(/)\s*', $_ ] } @values;

# find the maximum width of each column
my @width;
foreach my $line (@text) {
    for my $i (0 .. $#$line) {
        no warnings 'uninitialized';
        my $l = length $line->[$i];
        $width[$i] = $l if $l > $width[$i];
    }
}

# build a format string using column widths
my $format = join ' ', map { "%-${_}s" } @width;
$format .= "\n";

# print output in columns
printf $format, @$_ foreach @text;

これにより、以下が生成されます。

Long title with some looong words / short text        
Another title                     / another short text
于 2012-11-07T15:28:18.383 に答える