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