【问题标题】:How can I use Perl's format function?如何使用 Perl 的格式化功能?
【发布时间】:2026-02-23 23:25:02
【问题描述】:

我正在按照 Perl - Formats 上的教程学习 Perl 格式化,但是当我在我的 IDE 中键入他们的示例时:

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

我得到错误:

Scalar found where operator expected at .\qb.pl line 7, near "$name $age"
        (Missing operator before $age?)
syntax error at .\qb.pl line 7, near "$name $age"
Execution of .\qb.pl aborted due to compilation errors.

我正在使用为 MSWin32-x64-multi-thread 构建的 Perl 5,版本 30,Subversion 2 (v5.30.2)。

【问题讨论】:

    标签: function perl format


    【解决方案1】:

    当我在 5.24 上运行您的代码时,我看到以下警告消息:

    不推荐使用无逗号变量列表...

    它也指向$name $age 行。

    当我启用diagnostics 时,我得到了这样的解释:

    (D deprecated) The values you give to a format should be
    separated by commas, not just aligned on a line.
    

    当我按如下方式添加逗号时:

    $name,$age
    

    警告消失了,我得到了这个输出:

    ===================================
    Ali                     20
      2000.00
    ===================================
    ===================================
    Raza                    30
      2500.00
    ===================================
    ===================================
    Jaffer                  40
      4000.00
    ===================================
    

    根据perl5280delta,此警告在 5.28 中成为错误。

    【讨论】:

      【解决方案2】:

      您的第一个错误是认为格式是可以解决您的问题的有用工具。几乎只要我一直在使用 Perl,格式就基本上被忽略了。您可能会发现使用Perl6::Form 是一种更好的方法。

      您的第二个错误是认为 Tutorials Point 是获取任何信息的好地方。那里的教程是由似乎对他们的主题几乎一无所知的人编写的,并且(正如您在此处看到的那样)示例中充满了拼写错误,使它们几乎毫无用处。

      如果您决定使用 Perl 格式,那么 perlform 手册页将是最好的起点。

      【讨论】:

      • 哦,真的吗?为什么他们会被忽视?另外,什么是更好的学习资源?
      • 它们在很大程度上被忽略了,因为它们太难使用并且不是很灵活。如果您正在寻找更好的 Perl 教程,那么 learn.perl.org 是一个不错的起点。
      • 我不认为格式很难使用,而且它们对于产生漂亮的打印输出非常有用,但是,是的,Perl6::Form 更灵活并且有更多的格式可用于与字符串不同类型的数据的选项。
      • 不幸的是,Tutorials Point 的 SEO 非常好。
      【解决方案3】:

      也许下面的代码示例更容易阅读。输出也更容易一目了然:

      use strict;
      use warnings;
      
      my($name, $age, $salary);
      
      while(<DATA>) {
          ($name, $age, $salary) = split;
          write;
      }
      
      format STDOUT_TOP =
       Employee               Age      Salary
      ----------------------------------------
      .
      
      format STDOUT =
       @<<<<<<<<<<<<<<<<<<<<<< @<<   @#####.##
      $name, $age, $salary
      .
      
      __DATA__
      Ali        20    2000.00
      Raza       30    2500.00
      Jaffer     40    4000.00
      

      输出

       Employee               Age      Salary
      ----------------------------------------
       Ali                     20      2000.00
       Raza                    30      2500.00
       Jaffer                  40      4000.00
      

      提供输入数据的方法有很多种。其中之一是保存相关数据的哈希。

      use strict;
      use warnings;
      
      my %employees = (
          Ali       => { age => 20, salary => 2000.00},
          Raza      => { age => 30, salary => 2500.00},
          Jaffer    => { age => 40, salary => 4000.00}
          );
      
      my($name, $age, $salary);
      
      for $name (sort keys %employees) {
          ($age, $salary) = @{$employees{$name}}{qw/age salary/};
          write;
      }
      
      format STDOUT_TOP =
       Employee               Age      Salary
      ----------------------------------------
      .
      
      format STDOUT =
       @<<<<<<<<<<<<<<<<<<<<<< @<<   @#####.##
      $name, $age, $salary
      .
      

      输出

       Employee               Age      Salary
      ----------------------------------------
       Ali                     20      2000.00
       Jaffer                  40      4000.00
       Raza                    30      2500.00
      

      【讨论】: