页面上有两种perl格式

时间:2016-10-14 10:33:34

标签: perl

我继承了快速连续两次使用格式的perl代码。这是一个MWE。

#!/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() - 类似的功能,但是上个世纪的格式是我忘记了我曾经知道的它们,我在网上找到的所有例子每个程序只使用一种格式。我错过了什么?

请注意,在此特定时刻,在此项目中,用其他内容替换格式不是可行的选择。

2 个答案:

答案 0 :(得分:2)

_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;

答案 1 :(得分:1)

_TOP格式将写在每个页面的顶部。您可以通过将$-设置为0来强制新页面。不幸的是,它会为您提供form-feed character(十进制的ASCII字符12)。如果只进入屏幕,那可能不是问题。

第2段中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