2


0

Perl 5の write`と format`の置き換えは何ですか?

単純な出力フォーマットでは、Perl 4の時代にwrite / formatを使用していたprintfを使用する傾向があります。 ただし、データレコードごとの出力行の可変数に対する最も簡単な解決策のように思われることもあります。 例えば

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

my ($lorem, $aprille);

format =
@# ^<<<<<<<<<<<<<<<<<<<<<<<< | ^<<<<<<<<<<<<<<<<<<
$.,$aprille                  , $lorem
   ^<<<<<<<<<<<<<<<<<<<<<<<< | ^<<<<<<<<<<<<<<<<<< ~~
   $aprille                  , $lorem
                             |
.

while() {
  ($aprille, $lorem) = split(/\|/, $_, 2);
  write;
}

__DATA__
WHAN that Aprille with his shoures soote       |Lorem ipsum dolor sit amet,
The droghte of Marche hath perced to the roote,|consectetur adipisicing elit,
And bathed every veyne in swich licour,        |sed do eiusmod tempor
Of which vertu engendred is the flour;         |incididunt ut labore et dolore
Whan Zephirus eek with his swete breeth        |magna aliqua. Ut enim ad minim
Inspired hath in every holt and heeth          |veniam, quis nostrud
The tendre croppes, and the yonge sonne        |exercitation exercitation
Hath in the Ram his halfe cours y-ronne,       |ullamco laboris nisi ut ali-
And smale fowles maken melodye,                |quip ex ea commodo conse-
That slepen al the night with open ye,         |quat. Duis aute irure dolor
So priketh hem nature in hir corages:          |in reprehenderit in volup-
Than longen folk to goon on pilgrimages,       |tate velit esse cillium dol-
And palmers for to seken straunge strondes,    |ore eu fugiat nulla pariatur.
To ferne halwes, couthe in sondry londes;      |Lorem ipsum dolor sit amet,
And specially, from every shires ende          |consectetur adipisicing elit,
Of Engelond, to Caunterbury they wende,        |sed do eiusmod tempor
The holy blisful martir for to seke,           |incididunt ut labore et dolore
That hem hath holpen, whan that they were seke.|magna aliqua. Ut enim ad minim
And now for something completely different. Nice plumage.|Norwegian blue.

プロデュース

   1 WHAN that Aprille with    | Lorem ipsum dolor
     his shoures soote         | sit amet,
                               |
   2 The droghte of Marche     | consectetur
     hath perced to the roote, | adipisicing elit,
                               |
   3 And bathed every veyne in | sed do eiusmod
     swich licour,             | tempor
  ...
  19 And now for something     | Norwegian blue.
     completely different.     |
     Nice plumage.             |

レコード19は_three_行を占めることに注意してください。

書き込みとフォーマットを使用せずに上記を行うための同等の簡潔なperl5ishの方法は何ですか?

2 Answer


3


perl5がperl4の「format」と「write」の上に追加した主なものは「formline」です。 「$ ^ A」、数値形式、パッケージスコープなど、他にもいくつかの便利な機能がありますが、これらは主に重要ではありません。 現在のフォーマットディレクティブのセットは、perl4のビットより少しだけ大きいです:

@    start of regular field
^    start of special field
<    pad character for left justification
|    pad character for centering
>    pad character for right justification
#    pad character for a right justified numeric field
0    instead of first #: pad number with leading zeroes
.    decimal point within a numeric field
...  terminate a text field, show "..." as truncation evidence
@*   variable width field for a multi-line value
^*   variable width field for next line of a multi-line value
~    suppress line with all fields empty
~~   repeat line until all fields are exhausted

その他のあまり知られていない拡張機能には、LC_NUMERICローカルのサポート、 `{}`区切りブロックを使用して位置合わせを支援できること、および `\ r`を使用して強制的に改行することが含まれます。

私は今でも時々 `format`を使用しています。 ここに、ほんの数週間前に書いたプログラムの一部を示します。

sub init_screen() {
    our %Opt;
    my  $cols;

    if ($Opt{width}) {
         $cols  = $Opt{width};
    }
    elsif (am_unixy()) {
        ($cols) = `stty size 2>&1` =~ /^\d+ (\d+)$/;
    }
    else {
         # FALLTHROUGH to ||= init on next line
    }

    $cols ||= 80; # non-unix or stty error
    $cols  -=  2;

    my $format  = "format STDOUT = \n"
                . '    ^'    . '<' x ($cols-4) . "\n"
                . '$_' . "\n"
                . "       ^" . "<" x ($cols-6) . "~~\n"
                . '$_' . "\n"
                . ".\n"
                . "1;" # for true eval return
                ;

    eval($format) || die;
}

現在の画面幅に基づいて「フォーマット」を動的に構築するためのコードはもっときれいかもしれませんが、それでも便利です。


2


フォーマットの主な問題は、グローバル変数への依存です。 フォーマットに関するその他の問題については、http://oreilly.com/catalog/9780596001735 [Perl Best Practices]の449〜454ページを参照してください。

最新のソリューションは、http://search.cpan.org/dist/Perl6-Form/Form.pm [`Perl6

Form`]になります。 これは、Perl 6で計画していることのバックポートです。

次に、フォーマットコードを `Perl6

Form`に大まかに翻訳します。 私は `Perl6 :: Form`をよく知らないので、元の例をより良くしたり、より正確にしたりする方法があるかもしれません。

#!/usr/bin/perl

use strict;
use warnings;

use Perl6::Form;

while() {
    my ($aprille, $lorem) = split(/\|/, $_, 2);
    print form(
        "{>} {[[[[[[[[[[[[[[[[[[[[[[[[} | {[[[[[[[[[[[[[[[[[[}",
        $.,  $aprille,                  $lorem,
        "                               |                     ",
    );
}

__DATA__
WHAN that Aprille with his shoures soote       |Lorem ipsum dolor sit amet,
The droghte of Marche hath perced to the roote,|consectetur adipisicing elit,
And bathed every veyne in swich licour,        |sed do eiusmod tempor
Of which vertu engendred is the flour;         |incididunt ut labore et dolore
Whan Zephirus eek with his swete breeth        |magna aliqua. Ut enim ad minim
Inspired hath in every holt and heeth          |veniam, quis nostrud
The tendre croppes, and the yonge sonne        |exercitation exercitation
Hath in the Ram his halfe cours y-ronne,       |ullamco laboris nisi ut ali-
And smale fowles maken melodye,                |quip ex ea commodo conse-
That slepen al the night with open ye,         |quat. Duis aute irure dolor
So priketh hem nature in hir corages:          |in reprehenderit in volup-
Than longen folk to goon on pilgrimages,       |tate velit esse cillium dol-
And palmers for to seken straunge strondes,    |ore eu fugiat nulla pariatur.
To ferne halwes, couthe in sondry londes;      |Lorem ipsum dolor sit amet,
And specially, from every shires ende          |consectetur adipisicing elit,
Of Engelond, to Caunterbury they wende,        |sed do eiusmod tempor
The holy blisful martir for to seke,           |incididunt ut labore et dolore
That hem hath holpen, whan that they were seke.|magna aliqua. Ut enim ad minim
And now for something completely different. Nice plumage.|Norwegian blue.