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列の幅を使用して入力行を印刷します。