7

printf式に変数を含めるにはどうすればよいですか?

これが私の例です:

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

ここ$colsで、は列の数であり、$_は文字列です。

このステートメントは、「無効な変換」警告になります。

問題は、変数を切り刻むのを忘れてしまったことです。ああ。みんな、ありがとう。

4

6 に答える 6

11

補間$colsされた変数は、数値、たとえば10のように見えるので、

"%${cols}s"

補間し、と同等である必要があります

"%10s"

これは有効なフォーマット文字列です。

ただし、数値または有効なフォーマット文字列以外の場合は$cols警告が表示されます。

たとえば、次の場合:

$cols = "w";

その結果"%ws"、フォーマット文字列になります-引用したエラーが発生します:

Invalid conversion in printf: "%w"

有効なフォーマット情報はここにあります。

于 2010-02-17T21:08:40.477 に答える
9

私はあなたの特定の問題を理解しました。あなたのコードは正しいです。ただし、次$colsのように、ユーザー入力から読み取った数値である可能性があります。

my $cols = <STDIN>;

これは機能し、数値のコンテキストでは数値のよう$colsに見えますが、問題は、ここでは数値のコンテキストに表示され$cols ないことです。これは文字列コンテキストにあります。つまり、に展開する代わりに"%5s"、フォーマット文字列をに展開し"%5\ns"ます。そこにある改行は、フォーマット文字列をいじくり回しています。

読んだコードを次のように変更します$cols

chomp(my $cols = <STDIN>);

chomp他の入力の読み取りにも使用できるため、のドキュメントを参照してください。

于 2010-02-17T21:11:06.223 に答える
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)

を介して取得されたフィールド幅*が負の場合、フラグと同じ効果があり-ます:左揃え。

例えば:

#! /usr/bin/perl

use warnings;
use strict;

my $cols = 10;
$_ = "foo!";
printf "%*s\n", $cols, $_;
print "0123456789\n";

出力:

      foo!
0123456789

プラグマを有効にすると、warnings数値以外の幅の引数に対する警告が表示されます。

于 2010-02-17T21:27:31.480 に答える
3

現在の方法が機能するはずです

perl -e'my $cols=500; $_="foo"; printf "%${cols}s\n\n", $_;'
于 2010-02-17T21:03:53.783 に答える
1

以下は私のために働くようです:

#!/bin/perl5.8 -w
use strict;
my $cols = 5;
my $a = "3";
printf "%${cols}d\n", $a;

収量

28$ ./test.pl
    3

29$ 
于 2010-02-17T21:08:11.627 に答える
1

私はあなたの問題を再現することはできません。次のコードは正常に機能します。

use strict;
use warnings;

my $cols=40;
while (<>) {
    printf "%${cols}s\n", $_;
}

少なくとも40列の幅を使用して入力行を印刷します。

于 2010-02-17T21:08:34.497 に答える