Perl的printf宽度修改器在地图运算符中不起作用

时间:2018-08-09 17:18:07

标签: perl printf

为什么当我执行map{printf "%4s\n",File::Spec->rel2abs($_)}glob '*';print map{sprintf "%4s\n",File::Spec->rel2abs($_)}glob '*';时,在字符串的左侧输出4个空格字符?...

/var/www/html/Physics/Electronics/file1.txt
/var/www/html/Physics/Electronics/file2.txt
/var/www/html/Physics/Electronics/file3.txt
/var/www/html/Physics/Electronics/file4.txt

似乎我必须做map{print "\x{20}\x{20}\x{20}\x{20}",File::Spec->rel2abs($_),"\n"}glob '*';才能在字符串的左侧输出4个空格字符...

    /var/www/html/Physics/Electronics/file1.txt
    /var/www/html/Physics/Electronics/file2.txt
    /var/www/html/Physics/Electronics/file3.txt
    /var/www/html/Physics/Electronics/file4.txt

1 个答案:

答案 0 :(得分:5)

%4s(或%-4s)并不意味着“向此字符串添加4个空格”。这意味着“输出此字符串的最小字段宽度为4”,即,少于4个字符的字符串将用空格填充。另请参见perldoc -f sprintf

如果您想始终在开头添加4个空格,只需这样做

for my $file (glob '*') {
    print "    ", File::Spec->rel2abs($file), "\n";
}

for my $file (glob '*') {
    print " " x 4, File::Spec->rel2abs($file), "\n";
}

我在这里使用for是因为它在空白上下文中比map更清晰,更有效(您不收集结果列表,而只想输出一些内容)。另一方面,如果您只想转换列表,则

my @indented = map { " " x 4 . File::Spec->rel2abs($_) } glob '*';

会工作的。