我继承了快速连续两次使用格式的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()
- 类似的功能,但是上个世纪的格式是我忘记了我曾经知道的它们,我在网上找到的所有例子每个程序只使用一种格式。我错过了什么?
请注意,在此特定时刻,在此项目中,用其他内容替换格式不是可行的选择。
答案 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中的输出显示字符。
我的终端没有。它显示了一个新行。但是打印机会将其理解为新页面。
Data 1
Name | Cost
-------------+-------
Item1 | 42
Item2 | 100
Data 2
Name | Cost
-------------+-------
Item1 | 42
Item2 | 100