Работа в Perl с функциями printf и sprintf

В Perl есть функции printf и sprintf, которые иногда бывают очень удобны в работе.

Пример:

printf('Hello, %s.', 'Bob'); # выводет на экран строку 'Hello, Bob.'

Разница между printf и sprintf заключается в том что printf выводит результат на экран, а sprintf возвращает значение. Это возвращаемое значение можно, например, сохранить в переменной:

my $bar = sprintf('Hello, %s.', 'Bob');
# теперь в переменной $bar содержится строка 'Hello, Bob.'

%s — это плейсхолдер, который просто подставляет вместо себя значение, но есть более интересные плейсхолдеры, некоторые из которых можно настраивать. Примеры:

# добавить нули перед числом
sprintf('%03d', 7); # 007
sprintf('%03d', 70); # 070
sprintf('%03d', 700); # 700
sprintf('%03d', 7000); # 7000

# округлисть число до нужной точности
sprintf('%0.2f', 3.1415926); # 3.14
sprintf('%0.3f', 3.1415926); # 3.142
sprintf('%0.4f', 3.1415926); # 3.1416

# перевести десятичное число в двоичное
sprintf('%b', 123); # 1111011
sprintf('%05b', 2); # 00010

# перевести десятичное число в восьмеричное
sprintf('%o', 8); # 10
sprintf('%o', 100); # 144

# перевести десятичное число в шестнадцатеричное
sprintf('%x', 255); # 'ff'
sprintf('%X', 255); # 'FF'

В плейсхолдере %s тоже можно указывать числа. И еще можно указать знак минус, чтобы выравнивание было по левому краю (эту фичу очень удобно использовать для того чтобы выводить данные в виде таблиц). Пример:

say '1234567890 1234567890';
say sprintf '%10s %10s', 'asdf', 'asdf';
say sprintf '%-10s %-10s', 'asdf', 'asdf';

Это выведет на экран:

1234567890 1234567890
      asdf       asdf
asdf       asdf

Кроме этого у плейсхолдера %s есть интересная возможность менять порядок:

sprintf('%s - %s', 'one', 'two'); # 'one - two'
sprintf('%2$s - %1$s', 'one', 'two'); # 'two - one'

Полная документация про эти функции есть на сайте perldoc.perl.org:

Иван Бессарабов
ivan@bessarabov.ru

5 мая 2015

Edit this post on GitHub