2016-10-14 4 views
3

У меня есть унаследованный Perl-код, который использует форматы дважды в быстрой последовательности. Вот MWE.Два perl-формата на странице

#!/usr/bin/perl 

use FileHandle; 
use strict; 
use warnings; 

sub table { 
    my ($name, $val); 

    format_name STDOUT "FMT1"; 
    format_top_name STDOUT "FMT1_TOP"; 

    ($name, $val) = ("Item1", 42); write; 
    ($name, $val) = ("Item2", 100); write; 

format FMT1_TOP = 
Name   | Cost 
-------------+------- 
. 

format FMT1 = 
@>>>>>>>>>>> | @<<<< 
$name,   $val 
. 
} 

print "Data 1\n"; table; print "\n"; 
print "Data 2\n"; table; 

Проблема, которую я вижу в том, что Perl, очевидно, думает, что оба набора данных являются частью одной и той же таблицы и не печатает новый заголовок таблицы. Таким образом, выход я получаю это:

Data 1 
Name   | Cost 
-------------+------- 
     Item1 | 42 
     Item2 | 100 

Data 2 
     Item1 | 42 
     Item2 | 100 

Я ожидал увидеть:

Data 1 
Name   | Cost 
-------------+------- 
     Item1 | 42 
     Item2 | 100 

Data 2 
Name   | Cost 
-------------+------- 
     Item1 | 42 
     Item2 | 100 

Я уверен, что должна быть какой-то close_format подобной функции, что я пропускаю в конце table(), но форматы так в прошлом веке, что я забыл, что я когда-то знал о них, и все примеры, которые я могу найти в Интернете, используют только один формат для каждой программы. Что мне не хватает?

Обратите внимание, что заменяя форматы чем-то другим, не является жизнеспособным вариантом в этом проекте в этой конкретной точке.

ответ

3

_TOP - тип заголовка страницы. Perl-интерпретатор печатает его в верхней части дескриптора файла.

Использовать $~, чтобы сообщить интерпретатору Perl, что FMT1_TOP - формат печати, который следует использовать при вызове write.

#!/usr/bin/perl 

use FileHandle; 
use strict; 
use warnings; 

sub table { 
    my ($name, $val); 

$~ = "FMT1_TOP"; 
write; 
    format_name STDOUT "FMT1"; 
    format_top_name STDOUT "FMT1_TOP"; 
    ($name, $val) = ("Item1", 42); write; 
    ($name, $val) = ("Item2", 100); write; 

format FMT1_TOP = 
Name   | Cost 
-------------+------- 
. 

format FMT1 = 
@>>>>>>>>>>> | @<<<< 
$name,   $val 
. 
} 

print "Data 1\n"; table; print "\n"; 
print "Data 2\n"; table; 
+0

Извините, но я не уверен, как это отвечает на мой вопрос. Можете ли вы быть более ясными о том, чего не хватает в моем коде? Что мне нужно для того, чтобы сделать первую часть обработки для второй таблицы? –

+0

Это тип заголовка, который интерпретирует интерпретатор perl' в верхней части STDOUT. Однажды. –

+1

OP, похоже, знает об этом и использует его именно для этого. Но они хотят использовать его не один раз. – simbabque

1

Формат _TOP будет написан в верхней части каждой страницы. Вы можете принудительно создать новую страницу, установив $- на 0. К сожалению, это дает вам form-feed character (символ ASCII 12 в десятичной системе). Если это происходит только на экране, это, вероятно, не проблема.

Это отражено в write во втором абзаце.

Обработка верхней части формы обрабатывается автоматически: если на текущей странице для отформатированной записи недостаточно места, страница продвигается путем записи фида формы, а формат форматирования используется для форматирования заголовок новой страницы перед записью записывается. [...] Количество строк, оставшихся на текущей странице, находится в переменной $ -, которая может быть установлена ​​на 0, чтобы создать новую страницу.

Это, как вы можете это сделать:

sub table { 
    my ($name, $val); 

    $- = 0; # <-- here 

    format_name STDOUT "FMT1"; 
    format_top_name STDOUT "FMT1_TOP"; 

    ($name, $val) = ("Item1", 42); write; 
    ($name, $val) = ("Item2", 100); write; 

format FMT1_TOP = 
Name   | Cost 
-------------+------- 
. 

format FMT1 = 
@>>>>>>>>>>> | @<<<< 
$name,   $val 
. 
} 

Выход в моем IDE отображает символ.

screenshot of output in Komodo IDE X

Мой терминал не делает. Вместо этого отображается новая строка. Но принтер понял бы, что это новая страница.

Data 1 
Name   | Cost 
-------------+------- 
     Item1 | 42 
     Item2 | 100 

Data 2 

Name   | Cost 
-------------+------- 
     Item1 | 42 
     Item2 | 100 
Смежные вопросы