あなたの引用はオフです。あなたのシェルは混乱してしまうので
perl -E 'say sprintf(q{%1$s%2$s is not %1$s and not %2$s}, "foo", "bar");'
foobar is not foo and not bar
あなたは-e
のための二重引用符""
を使用することはできません。そこには一重引用符が必要です。しかし、printf
パターンに二重引用符を使用して%1$s
という構文を使用すると、Perlは$s
を補間しようとしますが、これはうまくいきません。したがって、引用符で囲まれていないq{}
を使用するか、単一引用符''
を\'
でエスケープしてください。または、$
をエスケープします。
あなたはuse strict
をオンにしuse warnings
場合は、表示されます:単一引用符-e
ため''
とパターンのための二重引用符""
てい
$ perl -E 'use strict; use warnings; say sprintf("%1$s%2$s is not %1$s and not %2$s", "foo", "bar");'
Global symbol "$s" requires explicit package name at -e line 1.
Global symbol "$s" requires explicit package name at -e line 1.
Global symbol "$s" requires explicit package name at -e line 1.
Global symbol "$s" requires explicit package name at -e line 1.
Execution of -e aborted due to compilation errors.
。
$ perl -E "use strict; use warnings; say sprintf('%1$s%2$s is not %1$s and not %2$s', 'foo', 'bar');"
Invalid conversion in sprintf: "%1 " at -e line 1.
Invalid conversion in sprintf: "%2" at -e line 1.
%2 is not %1 and not %2
は今、シェルがあるため、二重引用符""
の$s
を補間することを試みました。だからPerlはそれを見ない。パターンが理解できない"%1 %2 is not %1 and not %2"
と見なします。 (%
はPerlで二重引用符で囲まれた文字列で補間されません)。
@HunterMcMillen、あなたは関数を作成するような意味ですか? '%1 $ s%2 $ sは%1 $ sではなく%2 $ s '、' foo '、' bar ');} ppp();" 「これは?」これはうまくいかない。 – Kirby