printf式に変数を含めるにはどうすればよいですか?
これが私の例です:
printf "%${cols}s", $_;
ここ$cols
で、は列の数であり、$_
は文字列です。
このステートメントは、「無効な変換」警告になります。
問題は、変数を切り刻むのを忘れてしまったことです。ああ。みんな、ありがとう。
printf式に変数を含めるにはどうすればよいですか?
これが私の例です:
printf "%${cols}s", $_;
ここ$cols
で、は列の数であり、$_
は文字列です。
このステートメントは、「無効な変換」警告になります。
問題は、変数を切り刻むのを忘れてしまったことです。ああ。みんな、ありがとう。
補間$cols
された変数は、数値、たとえば10のように見えるので、
"%${cols}s"
補間し、と同等である必要があります
"%10s"
これは有効なフォーマット文字列です。
ただし、数値または有効なフォーマット文字列以外の場合は$cols
、警告が表示されます。
たとえば、次の場合:
$cols = "w";
その結果"%ws"
、フォーマット文字列になります-引用したエラーが発生します:
Invalid conversion in printf: "%w"
有効なフォーマット情報はここにあります。
私はあなたの特定の問題を理解しました。あなたのコードは正しいです。ただし、次$cols
のように、ユーザー入力から読み取った数値である可能性があります。
my $cols = <STDIN>;
これは機能し、数値のコンテキストでは数値のよう$cols
に見えますが、問題は、ここでは数値のコンテキストに表示され$cols
ないことです。これは文字列コンテキストにあります。つまり、に展開する代わりに"%5s"
、フォーマット文字列をに展開し"%5\ns"
ます。そこにある改行は、フォーマット文字列をいじくり回しています。
読んだコードを次のように変更します$cols
。
chomp(my $cols = <STDIN>);
chomp
他の入力の読み取りにも使用できるため、のドキュメントを参照してください。
*
可変幅を明確に示すために、常にフォーマット指定子で使用してください。printf "%s", $str
これは、ではなく使用するアドバイスに似ていprintf $str
ます。
(最小)幅
引数は通常、指定された値を表示するために必要な幅だけになるようにフォーマットされます。ここに数値を入力して幅を上書きするか、次の引数(を使用
*
)または指定された引数(例を使用*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
数値以外の幅の引数に対する警告が表示されます。
現在の方法が機能するはずです
perl -e'my $cols=500; $_="foo"; printf "%${cols}s\n\n", $_;'
以下は私のために働くようです:
#!/bin/perl5.8 -w
use strict;
my $cols = 5;
my $a = "3";
printf "%${cols}d\n", $a;
収量
28$ ./test.pl
3
29$
私はあなたの問題を再現することはできません。次のコードは正常に機能します。
use strict;
use warnings;
my $cols=40;
while (<>) {
printf "%${cols}s\n", $_;
}
少なくとも40列の幅を使用して入力行を印刷します。