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

时间:2010-02-17 20:58:29

标签: perl variables printf interpolation

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

这是我的例子:

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

其中$cols是列数 $_是一个字符串。

该声明会导致“无效转化”警告。

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

6 个答案:

答案 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列宽度打印任何输入行。