在 Cool 中§

有关 方法 sprintf,请参阅主要文档 in context

method sprintf(*@args)

根据许多语言中常见的 格式指令 系列返回一个字符串;对象将是格式字符串,而提供的参数将按照格式进行格式化。

"% 6s".sprintf('Þor').say# OUTPUT: «   Þor␤» 

在独立例程中§

有关 例程 sprintf,请参阅主要文档 in context

multi sprintf(Cool:D $format*@args)

根据下面描述的格式返回一个字符串。所使用的格式是调用方(如果以方法形式调用)或第一个参数(如果作为例程调用)。

sprintf"%s the %d%s""þor"1"st").put# OUTPUT: «þor the 1st␤» 
sprintf"%s is %s""þor""mighty").put;   # OUTPUT: «þor is mighty␤» 
"%s's weight is %.2f %s".sprintf"Mjölnir"3.3392"kg").put;
# OUTPUT: «Mjölnir's weight is 3.34 kg␤» 
# OUTPUT: «Mjölnir's weight is 3.34 kg␤»

此函数与 C 库的 sprintfprintf 函数基本相同。这两个函数之间的唯一区别在于 sprintf 返回一个字符串,而 printf 函数写入文件句柄。sprintf 返回一个 Str,而不是一个文字。

扫描 $format 以查找 % 字符。任何 % 都会引入一个格式标记。指令指导参数的使用(如果有)。当使用 % 以外的指令时,它指示如何将传递的下一个参数格式化为要创建的字符串中。格式标记中也可以使用参数索引。它们采用 N$ 形式,并在下面更详细地解释。

$format 可以定义为用单引号或双引号括起来。双引号的 $format 字符串在扫描之前进行插值,并且任何插值值包含 % 字符的嵌入式字符串都会导致异常。例如

my $prod = "Ab-%x-42";
my $cost = "30";
sprintf("Product $prod; cost: \$%d"$cost).put;
# OUTPUT: «Your printf-style directives specify 2 arguments, but 1 argument was supplied␤» 
          «  in block <unit> at <unknown file> line 1␤»

在处理未知输入时,你应该避免使用这种语法,方法是将所有变量放入 *@args 数组,并在 $format 中为每个变量设置一个 %。如果你需要在格式字符串中包含一个 $ 符号(即使作为参数索引),请对其进行转义或使用单引号形式。例如,以下任何一种形式都可以正常工作,不会出错

sprintf("2 x \$20 = \$%d"2*20).put# OUTPUT: «2 x $20 = $40␤» 
sprintf('2 x $20 = $%d'2*20).put;   # OUTPUT: «2 x $20 = $40␤» 

总之,除非你需要非常特殊的东西,否则通过使用单引号格式字符串并在格式字符串中不使用插值字符串,你将遇到更少的意外问题。

[1]