Что является заменой для `write` и` format` в Perl 5? - PullRequest
2 голосов
/ 09 ноября 2010

Для простого форматирования вывода я обычно использую printf, где я использовал write / format во времена Perl 4. Однако иногда это кажется самым простым решением для переменного числа строк вывода на запись данных.Например,

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

my ($lorem, $aprille);

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

while(<DATA>) {
  ($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 занимает три строк.

Что такое эквивалентный лаконичный perl5ish способ сделатьВыше без использования записи и форматирования?

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

Главное, что perl5 добавил выше format и write в perl4, это 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;
}

Код для динамического построения format на основе текущей ширины экрана может быть красивее, но все же полезен.

2 голосов
/ 09 ноября 2010

Основная проблема с форматами - это зависимость от глобальных переменных. Другие проблемы с форматами см. На стр. 449 - 454 Perl Best Practices .

Современное решение будет Perl6::Form. Это бэкпорт того, что они планируют на Perl 6.

Ниже приводится приблизительный перевод кода вашего формата на Perl6::Form. Я не очень хорошо знаю Perl6::Form, поэтому могут быть способы сделать его лучше или вернее вашему первоначальному примеру:

#!/usr/bin/perl

use strict;
use warnings;

use Perl6::Form;

while(<DATA>) {
    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.
...