Returns a string formatted by the usual printf
conventions of the C
library function sprintf
. See below for more details
and see sprintf(3) or printf(3) on your system for an explanation of
the general principles.
For example:
Perl does its own sprintf
formatting: it emulates the C
function sprintf(3), but doesn't use it except for floating-point
numbers, and even then only standard modifiers are allowed.
Non-standard extensions in your local sprintf(3) are
therefore unavailable from Perl.
Unlike printf
, sprintf
does not do what you probably mean when you
pass it an array as your first argument.
The array is given scalar context,
and instead of using the 0th element of the array as the format, Perl will
use the count of elements in the array as the format, which is almost never
useful.
Perl's sprintf
permits the following universally-known conversions:
- %% a percent sign
- %c a character with the given number
- %s a string
- %d a signed integer, in decimal
- %u an unsigned integer, in decimal
- %o an unsigned integer, in octal
- %x an unsigned integer, in hexadecimal
- %e a floating-point number, in scientific notation
- %f a floating-point number, in fixed decimal notation
- %g a floating-point number, in %e or %f notation
In addition, Perl permits the following widely-supported conversions:
- %X like %x, but using upper-case letters
- %E like %e, but using an upper-case "E"
- %G like %g, but with an upper-case "E" (if applicable)
- %b an unsigned integer, in binary
- %B like %b, but using an upper-case "B" with the # flag
- %p a pointer (outputs the Perl value's address in hexadecimal)
- %n special: *stores* the number of characters output so far
- into the next argument in the parameter list
Finally, for backward (and we do mean "backward") compatibility, Perl permits these unnecessary but widely-supported conversions:
- %i a synonym for %d
- %D a synonym for %ld
- %U a synonym for %lu
- %O a synonym for %lo
- %F a synonym for %f
Note that the number of exponent digits in the scientific notation produced
by %e
, %E
, %g
and %G
for numbers with the modulus of the
exponent less than 100 is system-dependent: it may be three or less
(zero-padded as necessary). In other words, 1.23 times ten to the
99th may be either "1.23e99" or "1.23e099".
Between the %
and the format letter, you may specify several
additional attributes controlling the interpretation of the format.
In order, these are:
An explicit format parameter index, such as 2$
. By default sprintf
will format the next unused argument in the list, but this allows you
to take the arguments out of order:
one or more of:
- space prefix non-negative number with a space
- + prefix non-negative number with a plus sign
- - left-justify within the field
- 0 use zeros, not spaces, to right-justify
- # ensure the leading "0" for any octal,
- prefix non-zero hexadecimal with "0x" or "0X",
- prefix non-zero binary with "0b" or "0B"
For example:
- printf '<% d>', 12; # prints "< 12>"
- printf '<%+d>', 12; # prints "<+12>"
- printf '<%6s>', 12; # prints "< 12>"
- printf '<%-6s>', 12; # prints "<12 >"
- printf '<%06s>', 12; # prints "<000012>"
- printf '<%#o>', 12; # prints "<014>"
- printf '<%#x>', 12; # prints "<0xc>"
- printf '<%#X>', 12; # prints "<0XC>"
- printf '<%#b>', 12; # prints "<0b1100>"
- printf '<%#B>', 12; # prints "<0B1100>"
When a space and a plus sign are given as the flags at once, a plus sign is used to prefix a positive number.
When the # flag and a precision are given in the %o conversion, the precision is incremented if it's necessary for the leading "0".
This flag tells Perl to interpret the supplied string as a vector of
integers, one for each character in the string. Perl applies the format to
each integer in turn, then joins the resulting strings with a separator (a
dot .
by default). This can be useful for displaying ordinal values of
characters in arbitrary strings:
Put an asterisk *
before the v
to override the string to
use to separate the numbers:
You can also explicitly specify the argument number to use for
the join string using something like *2$v
; for example:
- printf '%*4$vX %*4$vX %*4$vX', # 3 IPv6 addresses
- @addr[1..3], ":";
Arguments are usually formatted to be only as wide as required to
display the given value. You can override the width by putting
a number here, or get the width from the next argument (with *
)
or from a specified argument (e.g., with *2$
):
If a field width obtained through *
is negative, it has the same
effect as the -
flag: left-justification.
You can specify a precision (for numeric conversions) or a maximum
width (for string conversions) by specifying a .
followed by a number.
For floating-point formats except g
and G
, this specifies
how many places right of the decimal point to show (the default being 6).
For example:
For "g" and "G", this specifies the maximum number of digits to show, including those prior to the decimal point and those after it; for example:
- # These examples are subject to system-specific variation.
- printf '<%g>', 1; # prints "<1>"
- printf '<%.10g>', 1; # prints "<1>"
- printf '<%g>', 100; # prints "<100>"
- printf '<%.1g>', 100; # prints "<1e+02>"
- printf '<%.2g>', 100.01; # prints "<1e+02>"
- printf '<%.5g>', 100.01; # prints "<100.01>"
- printf '<%.4g>', 100.01; # prints "<100>"
For integer conversions, specifying a precision implies that the output of the number itself should be zero-padded to this width, where the 0 flag is ignored:
- printf '<%.6d>', 1; # prints "<000001>"
- printf '<%+.6d>', 1; # prints "<+000001>"
- printf '<%-10.6d>', 1; # prints "<000001 >"
- printf '<%10.6d>', 1; # prints "< 000001>"
- printf '<%010.6d>', 1; # prints "< 000001>"
- printf '<%+10.6d>', 1; # prints "< +000001>"
- printf '<%.6x>', 1; # prints "<000001>"
- printf '<%#.6x>', 1; # prints "<0x000001>"
- printf '<%-10.6x>', 1; # prints "<000001 >"
- printf '<%10.6x>', 1; # prints "< 000001>"
- printf '<%010.6x>', 1; # prints "< 000001>"
- printf '<%#10.6x>', 1; # prints "< 0x000001>"
For string conversions, specifying a precision truncates the string to fit the specified width:
You can also get the precision from the next argument using .*
:
If a precision obtained through *
is negative, it counts
as having no precision at all.
- printf '<%.*s>', 7, "string"; # prints "<string>"
- printf '<%.*s>', 3, "string"; # prints "<str>"
- printf '<%.*s>', 0, "string"; # prints "<>"
- printf '<%.*s>', -1, "string"; # prints "<string>"
- printf '<%.*d>', 1, 0; # prints "<0>"
- printf '<%.*d>', 0, 0; # prints "<>"
- printf '<%.*d>', -1, 0; # prints "<0>"
You cannot currently get the precision from a specified number,
but it is intended that this will be possible in the future, for
example using .*2$
:
- printf '<%.*2$x>', 1, 6; # INVALID, but in future will print
- # "<000001>"
For numeric conversions, you can specify the size to interpret the
number as using l
, h
, V
, q
, L
, or ll
. For integer
conversions (d u o x X b i D U O
), numbers are usually assumed to be
whatever the default integer size is on your platform (usually 32 or 64
bits), but you can override this to use instead one of the standard C types,
as supported by the compiler used to build Perl:
- hh interpret integer as C type "char" or "unsigned
- char" on Perl 5.14 or later
- h interpret integer as C type "short" or
- "unsigned short"
- j interpret integer as C type "intmax_t" on Perl
- 5.14 or later, and only with a C99 compiler
- (unportable)
- l interpret integer as C type "long" or
- "unsigned long"
- q, L, or ll interpret integer as C type "long long",
- "unsigned long long", or "quad" (typically
- 64-bit integers)
- t interpret integer as C type "ptrdiff_t" on Perl
- 5.14 or later
- z interpret integer as C type "size_t" on Perl 5.14
- or later
As of 5.14, none of these raises an exception if they are not supported on
your platform. However, if warnings are enabled, a warning of the
printf
warning class is issued on an unsupported conversion flag.
Should you instead prefer an exception, do this:
- use warnings FATAL => "printf";
If you would like to know about a version dependency before you start running the program, put something like this at its top:
- use 5.014; # for hh/j/t/z/ printf modifiers
You can find out whether your Perl supports quads via Config:
For floating-point conversions (e f g E F G
), numbers are usually assumed
to be the default floating-point size on your platform (double or long double),
but you can force "long double" with q
, L
, or ll
if your
platform supports them. You can find out whether your Perl supports long
doubles via Config:
You can find out whether Perl considers "long double" to be the default floating-point size to use on your platform via Config:
It can also be that long doubles and doubles are the same thing:
The size specifier V
has no effect for Perl code, but is supported for
compatibility with XS code. It means "use the standard size for a Perl
integer or floating-point number", which is the default.
Normally, sprintf() takes the next unused argument as the value to
format for each format specification. If the format specification
uses *
to require additional arguments, these are consumed from
the argument list in the order they appear in the format
specification before the value to format. Where an argument is
specified by an explicit index, this does not affect the normal
order for the arguments, even when the explicitly specified index
would have been the next argument.
So:
- printf "<%*.*s>", $a, $b, $c;
uses $a
for the width, $b
for the precision, and $c
as the value to format; while:
- printf '<%*1$.*s>', $a, $b;
would use $a
for the width and precision, and $b
as the
value to format.
Here are some more examples; be aware that when using an explicit
index, the $
may need escaping:
If use locale
(including use locale 'not_characters'
) is in effect
and POSIX::setlocale() has been called,
the character used for the decimal separator in formatted floating-point
numbers is affected by the LC_NUMERIC locale. See perllocale
and POSIX.