如何在 printf 表达式中包含变量?
这是我的例子:
printf "%${cols}s", $_;
where$cols
是列数,$_
是一个字符串。
该语句导致“无效转换”警告。
问题最终是我忘了咀嚼变量。嘎。感谢大家。
如何在 printf 表达式中包含变量?
这是我的例子:
printf "%${cols}s", $_;
where$cols
是列数,$_
是一个字符串。
该语句导致“无效转换”警告。
问题最终是我忘了咀嚼变量。嘎。感谢大家。
您的插值变量$cols
看起来应该是一个数字,比如 10,所以
"%${cols}s"
应该插值并等价于
"%10s"
这是一个有效的格式字符串。
$cols
但是,如果不是数字或有效格式字符串,您会收到警告。
例如,如果:
$cols = "w";
这将导致"%ws"
格式字符串 - 给出您引用的错误:
Invalid conversion in printf: "%w"
可以在此处找到有效的格式信息。
我弄清楚了你的具体问题。你的代码是正确的。但是,我想$cols
可能是从用户输入中读取的数字,如下所示:
my $cols = <STDIN>;
这可行,并且在数字上下文$cols
中看起来是一个数字,但问题是这里$cols
没有出现在数字上下文中。它在字符串上下文中,这意味着"%5s"
您的格式字符串不是扩展为 ,而是扩展为"%5\ns"
. 那里的换行符破坏了格式字符串。
将您阅读的代码更改为$cols
:
chomp(my $cols = <STDIN>);
请参阅 上的文档chomp
,因为您可能还想将其用于其他输入读取。
始终*
在格式说明符中使用以明确指示可变宽度!这类似于使用建议printf "%s", $str
而不是printf $str
.
(最小)宽度
参数通常被格式化为仅显示给定值所需的宽度。您可以通过在此处输入一个数字来覆盖宽度,或者从下一个参数(使用
*
)或从指定的参数(使用 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
启用编译指示后,您将看到非数字宽度参数的警告。
您当前的方法应该有效
perl -e'my $cols=500; $_="foo"; printf "%${cols}s\n\n", $_;'
以下似乎对我有用:
#!/bin/perl5.8 -w
use strict;
my $cols = 5;
my $a = "3";
printf "%${cols}d\n", $a;
产量
28$ ./test.pl
3
29$
我无法重现您的问题。以下代码工作正常:
use strict;
use warnings;
my $cols=40;
while (<>) {
printf "%${cols}s\n", $_;
}
它使用至少 40 列宽度打印任何输入行。