创建固定宽度列时sprintf格式和打印不一致

时间:2013-12-19 21:23:29

标签: perl printf

(我已经发布到另一个网站,并将使用解决方案进行更新,但到目前为止仍在努力解答)

  
    
      
        
          
            

2013年12月19日下午7:06 PT ---我找到了解决方案,我在下面进行了更新。

          
        
      
    
  

我每行输出两项数据。第一列数据不是固定长度,我希望每次第二项数据在同一位置正确对齐,所以我使用sprintf格式化数据然后邮寄出数据

print命令输出说明数据格式正确。

然而,当我的电子邮件中的输出不同时,对齐完全错误。

我最初认为它是邮件程序(MIME :: Lite),但我不确定。

我之所以认为这是因为我使用eclipse Perl环境,当我查看调试变量列表时,我看到字符串的填充方式与我的电子邮件中的输出完全相同,但print语句显示数据正确对齐!!!

请帮助我了解这里发生了什么以及如何解决它。

use MIME::Lite;
$smtp = "mailserver";
$internal_email_address = 'myemailaddess';
$a = sprintf ("%-60s %-s\n", "the amount for Apple is ","34");
$b = sprintf ("%-60s %-s\n", "the amount for Lemons is", "7");
print $a;
print $b;
$c = $a.$b;
mailer( $internal_email_address,"issue", $c);

sub mailer {
    my ( $addr, $subj, $output ) = @_;

    print "$_\n" for $addr;
    print "$_\n" for $subj;
    print "$_\n" for $output;

    $msg = MIME::Lite->new(
        From    => 'xxxx',
        To      => $addr,
        Subject => $subj,
        Data    => $output
    );

    MIME::Lite->send( 'smtp', $smtp, Timeout => 60 );
    eval { $msg->send };
    $mailerror = "Status: ERROR email - MIME::Lite->send failed: $@\n" if $@;
    if ( $mailerror eq '' ) {
        $status = "Status: Mail sent\n";
    }
    else {
        $status = $mailerror;
    }
}

1 个答案:

答案 0 :(得分:1)

$a = sprintf ("%-10s %-s\n", "the amount for Apple is ","34");

参数"the amount for Apple is"对于格式说明符%-10s来说太长了,因此用于该参数的实际空间量将是字符串的长度。

您可以使用具有较大值的格式说明符(例如%-25s),以适应您可能适用的任何值。

或者,如果您希望sprintf以10个字符截断参数,请使用格式说明符%-10.10s