如何在写入期间使用perl执行动态格式化?

时间:2011-02-03 07:13:46

标签: perl

我的格式如下所示:

format STDOUT =
------------------------------------
|Field1      | Field2     | Field3 |
------------------------------------
|@<<<<<<<<<<| @<<<<<<<<<<<| @<<<<< |~~
shift(@list1),shift(@list2),shift(@list3)
------------------------------------
.
write STDOUT;

所以问题如下:

  1. 是否可以使值列表动态显示? 例如如果列表1包含12个元素,并且如果定义了$ flag1,则只打印元素0..10而不是全部12.我尝试将$ flag作为参数传递给生成报告的子。但是,最后定义的FORMAT似乎始终优先,最后一次写入时,无论条件是什么,都应用最后一种格式。
  2. 是否可以使用相同的过程添加/隐藏字段。例如如果定义了$ flag2,那么在列表中添加一个额外的字段Field4?

3 个答案:

答案 0 :(得分:0)

对我而言,你似乎立刻做了很多事。

在格式化输出之前,请创建对该标志的检查 根据标志创建标量(例如,数组的前10个元素)。 然后将字符串放在输出中。

你也可以制作一个标量,它是Field4的整数表+条目 如果设置了标志2,则在if语句中将标量连接到输出。

最好采取许多措施正确地完成工作,而不是试图“聪明” 并用几行代码完成所有步骤。

答案 1 :(得分:0)

通过黑客攻击内部, man perlform 访问格式 内部

          use Carp;
           sub swrite {
               croak "usage: swrite PICTURE ARGS" unless @_;
               my $format = shift;
               $^A = "";
               formline($format,@_);
               return $^A;
           }

           $string = swrite(<<'END', 1, 2, 3);
        Check me out
        @<<<  @|||  @>>>
        END
           print $string;

答案 2 :(得分:0)

我不认为格式功能非常适合动态方法 - 您可以尝试使用sprintfpack模板。它们的格式是简单的字符串,更容易在运行中构建。