如何使用Perl';s printf的值可能是数字或字符串时?

如何使用Perl';s printf的值可能是数字或字符串时?,perl,printf,Perl,Printf,我正在尝试输出一个如下所示的文档(更多信息,请参阅): 我认为您的未知格式字符串有点不正确 这是我的样本: foreach $longitude (1,2.12345678,undef) { if (defined $longitude){ printf ("|%-8s %.6f|\n","",$longitude); }else{ $longitude2 = "<unknown>"; printf ("| %16s|\n",$longitude2)

我正在尝试输出一个如下所示的文档(更多信息,请参阅):


我认为您的未知格式字符串有点不正确

这是我的样本:

foreach $longitude (1,2.12345678,undef) {
  if (defined $longitude){
     printf ("|%-8s %.6f|\n","",$longitude);
  }else{
    $longitude2 = "<unknown>";
    printf ("| %16s|\n",$longitude2);
  } 
}

另外,看看您的示例对齐与您实际生成的代码,似乎状态
也可能不对齐。要进行验证,请使用我在上面使用的相同技巧,将每个字段的格式字符串括在
|
中,以查看一个字段的结束位置和另一个字段的开始位置。

这些问题的技巧是尽可能减少分支和重复的代码。内置的没有那么特别。它需要一个格式参数和一个列表,所以你只需要给它正确的东西,然后调用它一次。此外,您可以通过使用“s
looks\u like\u number
之类的工具来更精确地进行检查,以确保您的数据更接近您的预期:

use Scalar::Util qw(looks_like_number);

while( <DATA> ) 
    {
    chomp(my $longitude = $_ );

    my( $format, @arguments ) = do {
        looks_like_number $longitude ?
            ( "|%-8s %.6f|\n", '', $longitude )
              :
            ( "| %16s|\n",        '<unknown>' )
        };

    printf $format, @arguments;
    }

__END__
1
2.12345678
undef
0

fred
使用标量::Util qw(看起来像数字);
而()
{
chomp(我的$经度=$);
我的($format,@arguments)=do{
看起来像_number$经度?
(“|%-8s%.6f|\n”,“经度,”$longitude)
:
(“|%16s |\n”,”)
};
printf$格式,@arguments;
}
__结束__
1.
2.12345678
未定义
0
弗雷德

现在您有了一个
printf
,不需要额外的
$longitude2
变量。您可以使用
printf
玩一些额外的技巧,这样您就可以自动调整列的大小,但我们现在不担心这一点。:)

就我个人而言,我会通过同样的打印

 # You can choose prefered way of laying out the logic !
     $text = sprintf ("%.6f",$longitude); 
 # or 
     $text = '<unknown>' ;
然后,如果16变为20,则两个位在步骤中自适应

foreach $longitude (1,2.12345678,undef) {
  if (defined $longitude){
     printf ("|%-8s %.6f|\n","",$longitude);
  }else{
    $longitude2 = "<unknown>";
    printf ("| %16s|\n",$longitude2);
  } 
}
|         1.000000|
|         2.123457|
|        <unknown>|
use Scalar::Util qw(looks_like_number);

while( <DATA> ) 
    {
    chomp(my $longitude = $_ );

    my( $format, @arguments ) = do {
        looks_like_number $longitude ?
            ( "|%-8s %.6f|\n", '', $longitude )
              :
            ( "| %16s|\n",        '<unknown>' )
        };

    printf $format, @arguments;
    }

__END__
1
2.12345678
undef
0

fred
 # You can choose prefered way of laying out the logic !
     $text = sprintf ("%.6f",$longitude); 
 # or 
     $text = '<unknown>' ;
 printf ("| %16s|\n",$text);