Perl,sprintf生成字符串的长度错了吗?

时间:2014-03-20 15:22:57

标签: perl printf

我正在创建一个字符串,需要用空格填充到每个字段的最大长度,如下所示:

my $string;

$string .= sprintf("%*s", $fieldlength->{FOO}, uc( $foo ) );
$string .= sprintf("%*s", $fieldlength->{BAR}, uc( $bar ) );

这是一堆记录的循环。 当我将$ string写入文件时,它看起来完全符合我的预期,一切都在正确的位置。当我打印$ string的长度时,它错了吗?

my $string;

$string .= sprintf("%*s", $fieldlength->{FOO}, uc( $foo ) );
warn length($string);
$string .= sprintf("%*s", $fieldlength->{BAR}, uc( $bar ) );
warn length($string);

在此示例中,$fieldlength->{FOO}100,警告返回40。我必须做些蠢事。

理想情况下,我喜欢某种标尺作为第一行标记*,每个字段应该是。因为我似乎无法准确地报告这是我被困的地方

1 个答案:

答案 0 :(得分:1)

我无法重现。以下给出了正确的值,甚至可以追溯到5.8.8。

use strict;
use warnings;

my $fieldlength;
$fieldlength->{FOO} = 100;
$fieldlength->{BAR} = 200;

my $foo = "foo";
my $bar = "bar";

my $string;
$string .= sprintf("%*s", $fieldlength->{FOO}, uc( $foo ) );
$string .= sprintf("%*s", $fieldlength->{BAR}, uc( $bar ) );

print(length($string), "\n");  # 300

与Perl中的错误相比,您的代码更容易出现问题。你的价值观并不是你认为的那样,等等。而不是声称一个变量包含一个值,告诉我们你给变量这个值。而不是说输出是不是它,向我们显示实际输出等。