Ваше цитирование отключено.
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{}
или избегайте одиночных котировок ''
с \'
. Или уберите $
s.
Если вы включите use strict
и use warnings
вы увидите:
$ 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.
Это одинарные кавычки ''
для -e
и двойные кавычки ""
для шаблона.
$ 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, вы имеете в виду, как создать функцию? 'perl -e 'sub ppp() {printf ('% 1 $ s% 2 $ s не% 1 $ s, а не% 2 $ s ',' foo ',' bar ');} ppp();" 'как это? .. Это не работает. – Kirby