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

Lou*_*Lou 7 variables perl printf interpolation

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

这是我的例子:

printf "%${cols}s", $_;
Run Code Online (Sandbox Code Playgroud)

$cols列数在哪里,$_是一个字符串.

该语句导致"无效转换"警告.

问题最终是我忘记了变量.嘎.感谢大家.

mar*_*ton 11

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

"%${cols}s"
Run Code Online (Sandbox Code Playgroud)

应插入并等同于

"%10s"
Run Code Online (Sandbox Code Playgroud)

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

然而,如果$cols是一些其他的不是数字或有效的格式字符串,你会得到警告.

例如,如果:

$cols = "w";
Run Code Online (Sandbox Code Playgroud)

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

Invalid conversion in printf: "%w"
Run Code Online (Sandbox Code Playgroud)

有效的格式信息可以在这里找到.


Chr*_*utz 9

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

my $cols = <STDIN>;
Run Code Online (Sandbox Code Playgroud)

这是有效的,并且在数值上下文中$cols看起来是一个数字,但问题是这里$cols 没有出现在数值上下文中.它位于字符串上下文中,这意味着"%5s"您的格式字符串不会扩展到,而是扩展为"%5\ns".新行在那里弄乱了格式字符串.

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

chomp(my $cols = <STDIN>);
Run Code Online (Sandbox Code Playgroud)

请参阅文档chomp,因为您可能也想将其用于其他输入读取.


Gre*_*con 6

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

perlfunc文档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)
Run Code Online (Sandbox Code Playgroud)

如果通过的字段宽度*为负,则它具有与-标志相同的效果:左对齐.

例如:

#! /usr/bin/perl

use warnings;
use strict;

my $cols = 10;
$_ = "foo!";
printf "%*s\n", $cols, $_;
print "0123456789\n";
Run Code Online (Sandbox Code Playgroud)

输出:

      foo!
0123456789

通过warnings启用编译,你会看到非数字宽度参数警告.