7

如何在 printf 表达式中包含变量?

这是我的例子:

printf "%${cols}s", $_;

where$cols是列数,$_是一个字符串。

该语句导致“无效转换”警告。

问题最终是我忘了咀嚼变量。嘎。感谢大家。

4

6 回答 6

11

您的插值变量$cols看起来应该是一个数字,比如 10,所以

"%${cols}s"

应该插值并等价于

"%10s"

这是一个有效的格式字符串。

$cols但是,如果不是数字有效格式字符串,您会收到警告。

例如,如果:

$cols = "w";

这将导致"%ws"格式字符串 - 给出您引用的错误:

Invalid conversion in printf: "%w"

可以在此处找到有效的格式信息。

于 2010-02-17T21:08:40.477 回答
9

我弄清楚了你的具体问题。你的代码是正确的。但是,我想$cols可能是从用户输入中读取的数字,如下所示:

my $cols = <STDIN>;

这可行,并且在数字上下文$cols中看起来是一个数字,但问题是这里$cols 没有出现在数字上下文中。它在字符串上下文中,这意味着"%5s"您的格式字符串不是扩展为 ,而是扩展为"%5\ns". 那里的换行符破坏了格式字符串。

将您阅读的代码更改为$cols

chomp(my $cols = <STDIN>);

请参阅 上的文档chomp,因为您可能还想将其用于其他输入读取。

于 2010-02-17T21:11:06.223 回答
6

始终*在格式说明符中使用以明确指示可变宽度!这类似于使用建议printf "%s", $str而不是printf $str.

perlfunc 文档中sprintf

(最小)宽度

参数通常被格式化为仅显示给定值所需的宽度。您可以通过在此处输入一个数字来覆盖宽度,或者从下一个参数(使用*)或从指定的参数(使用 eg *2$)获取宽度:

printf '<%s>', "a";       # prints "<a>"
printf '<%6s>', "a";      # prints "<     a>"
printf '<%*s>', 6, "a";   # prints "<     a>"
printf '<%*2$s>', "a", 6; # prints "<     a>"
printf '<%2s>', "long";   # prints "<long>" (does not truncate)

如果通过得到的字段宽度*为负数,则与标志的效果相同-:左对齐。

例如:

#! /usr/bin/perl

use warnings;
use strict;

my $cols = 10;
$_ = "foo!";
printf "%*s\n", $cols, $_;
print "0123456789\n";

输出:

      呸!
0123456789

warnings启用编译指示后,您将看到非数字宽度参数的警告。

于 2010-02-17T21:27:31.480 回答
3

您当前的方法应该有效

perl -e'my $cols=500; $_="foo"; printf "%${cols}s\n\n", $_;'
于 2010-02-17T21:03:53.783 回答
1

以下似乎对我有用:

#!/bin/perl5.8 -w
use strict;
my $cols = 5;
my $a = "3";
printf "%${cols}d\n", $a;

产量

28$ ./test.pl
    3

29$ 
于 2010-02-17T21:08:11.627 回答
1

我无法重现您的问题。以下代码工作正常:

use strict;
use warnings;

my $cols=40;
while (<>) {
    printf "%${cols}s\n", $_;
}

它使用至少 40 列宽度打印任何输入行。

于 2010-02-17T21:08:34.497 回答