关于 perl:在 printf 中对数组元素进行字符串插值的正确方法

Proper way to string interpolate an array element within printf

在研究 Schwartz 的 Learning Perl 时,我遇到了一个练习,我应该接受许多用户输入字符串,其中第一个输入是确定其他字符串的右对齐输出的宽度。

换句话说,输入:

1
2
3
10
apple
boy

输出应该是:

1
2
3
       10
    apple
      boy

输出右对齐 10.

我尝试使用数组来解决问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use strict;
use warnings;
my @array;
while (<>) {
    chomp($_);
    push @array, $_ ;
}

while (@array) {
    printf ("%$array[0]s \
"
, shift @array);
}

但是在正确格式化和打印 \\'10\\' 之后,我得到了错误:

1
2
3
4
5
6
7
8
9
$ perl test.pl
10
apple
boy
        10
Invalid conversion in printf:"%a" at test.pl line 11, <> line 3.
%apples
Argument"boy" isn't numeric in printf at test.pl line 11, <> line 3.
0oys

我尝试了多种方法,通过将数组元素括在大括号中来强制对其进行插值,但所有这些都导致了错误。在 printf 中对数组元素进行字符串插值的正确方法是什么(如果这是正确的术语)?


这里有一种更 Perlish 的写法,它避免了必须执行显式的 shift。这更多的是我的意思,因为格式控制变量从一开始就不是 @array 的一部分:

1
2
3
4
5
6
7
8
use strict;
use warnings;

my ( $length, @array ) = <>;
chomp( $length, @array );

printf"%${length}s\
"
, $_ for ( $length, @array );