Lou*_*Lou 7 variables perl printf interpolation
如何在printf表达式中包含变量?
这是我的例子:
printf "%${cols}s", $_;
$cols列数在哪里,$_是一个字符串.
该语句导致"无效转换"警告.
问题最终是我忘记了变量.嘎.感谢大家.
mar*_*ton 11
你的插值变量$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.
(最小)宽度
参数通常被格式化为仅显示给定值所需的宽度.您可以通过在此处放置一个数字来覆盖宽度,或者从下一个参数(带
*)或从指定的参数(例如*2$)获取宽度:Run Code Online (Sandbox Code Playgroud)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启用编译,你会看到非数字宽度参数警告.