Perl 格式



  • 格式

    Perl 使用称为 “格式” 的书写模板来输出报告。要使用 Perl 的格式功能,必须先定义一种格式,然后才能使用该格式写入格式化的数据。
  • 定义格式

    以下是定义Perl格式的语法-
    
    format FormatName =
    fieldline
    value_one, value_two, value_three
    fieldline
    value_one, value_two
    . 
    
    
    此处的 FormatName 表示格式的名称。Fieldline 是具体的方式,数据应该被格式化。值行表示将输入到字段行中的值。您用一个句点结束格式。下一个字段行可以包含任何文本或字段持有人。字段持有人拥有存放数据的空间,这些数据将在以后放置。字段持有人的格式为-
    
    @<<<<
    
    
    该字段保持符是左对齐的,字段空间为5。您必须对@符号和<符号进行计数,才能知道该字段中的空格数。其他领域持有人包括-
    
    @>>>> right-justified
    @|||| centered
    @####.## numeric field holder
    @* multiline field holder
    
    
    一个示例格式是-
    
    format EMPLOYEE =
    ===================================
    @<<<<<<<<<<<<<<<<<<<<<< @<< 
    $name $age
    @#####.##
    $salary
    ===================================
    .
    
    
    在此示例中,$name将在22个字符的空间内写为左对齐,而在该年龄之后,将在两个空间内写。
  • 使用格式

    为了调用此格式声明,我们将使用write关键字-
    
    write EMPLOYEE;
    
    
    问题在于格式名称通常是打开的文件句柄的名称,而write语句会将输出发送到该文件句柄。由于我们希望将数据发送到STDOUT,因此必须将EMPLOYEE与STDOUT文件句柄相关联。但是,首先,我们必须使用select()函数确保STDOUT是我们选择的文件句柄。
    
    select(STDOUT);
    
    
    然后,通过使用特殊变量$〜或$FORMAT_NAME来设置STDOUT的新格式名称,将EMPLOYEE与STDOUT关联起来,如下所示-
    
    $~ = "EMPLOYEE";
    
    
    现在,当我们执行write()时,数据将被发送到STDOUT。记住:如果要用其他文件句柄而不是STDOUT编写报告,则可以使用select()函数选择该文件句柄,其余逻辑将保持不变。让我们来看下面的例子。在这里,我们有硬编码的值,仅用于显示用法。在实际使用中,您将从文件或数据库中读取值以生成实际报告,并且可能需要将最终报告再次写入文件。
    
    format EMPLOYEE =
    ===================================
    @<<<<<<<<<<<<<<<<<<<<<< @<< 
    $name $age
    @#####.##
    $salary
    ===================================
    .
    
    select(STDOUT);
    $~ = EMPLOYEE;
    
    @n = ("Ali", "Raza", "Jaffer");
    @a  = (20,30, 40);
    @s = (2000.00, 2500.00, 4000.000);
    
    $i = 0;
    foreach (@n) {
       $name = $_;
       $age = $a[$i];
       $salary = $s[$i++];
       write;
    }
    
    
    尝试一下
  • 定义报表标题

    一切看起来都很好。但是您可能会对在报表中添加标题感兴趣。此标题将打印在每页顶部。做到这一点非常简单。除了定义模板之外,您还必须定义标题并将其分配给$^或$FORMAT_TOP_NAME变量-
    
    format EMPLOYEE =
    ===================================
    @<<<<<<<<<<<<<<<<<<<<<< @<< 
    $name $age
    @#####.##
    $salary
    ===================================
    .
    
    format EMPLOYEE_TOP =
    ===================================
    Name                    Age
    ===================================
    .
    
    select(STDOUT);
    $~ = EMPLOYEE;
    $^ = EMPLOYEE_TOP;
    
    @n = ("Ali", "Raza", "Jaffer");
    @a  = (20,30, 40);
    @s = (2000.00, 2500.00, 4000.000);
    
    $i = 0;
    foreach (@n) {
       $name = $_;
       $age = $a[$i];
       $salary = $s[$i++];
       write;
    }
    
    
    尝试一下
    现在您的报告看起来像-
    
    ===================================
    Name                    Age
    ===================================
    ===================================
    Ali                     20
      2000.00
    ===================================
    ===================================
    Raza                    30
      2500.00
    ===================================
    ===================================
    Jaffer                  40
      4000.00
    ===================================
    
    
  • 定义分页

    如果您的报告占用一页以上,该怎么办?您有一个解决方案,只需使用$%或$FORMAT_PAGE_NUMBER 变量以及标题,如下所示-
    
    format EMPLOYEE_TOP =
    ===================================
    Name                    Age Page @<
                                     $%
    ===================================                               
    .
    现在您的输出将如下所示:
    
    ===================================
    Name                    Age Page 1
    ===================================
    ===================================
    Ali                     20
      2000.00
    ===================================
    ===================================
    Raza                    30
      2500.00
    ===================================
    ===================================
    Jaffer                  40
      4000.00
    ===================================
    
    
  • 页面上的行数

    您可以使用特殊变量$=(或$FORMAT_LINES_PER_PAGE)设置每页的行数,默认情况下,$=将为60。
  • 定义报告页脚

    虽然$^或$FORMAT_TOP_NAME包含当前页眉格式的名称,但是没有相应的机制可以自动为页脚执行相同的操作。如果您有固定大小的页脚,则可以通过在每个write()之前检查变量$-或$FORMAT_LINES_LEFT来获取页脚,并在必要时使用定义如下的另一种格式自己打印页脚-
    
    format EMPLOYEE_BOTTOM =
    End of Page @<
                $%
    .
    
    
    有关与格式相关的完整变量集,请参考 Perl特殊变量 部分。