Пытаясь понять, почему моя программа не выводит текст так, как я хочу, обнаружил баг в одной из стандартных функций языка Перл. Подробности под катом - понятны будут только тем, кто знает Перл.
Баг в функции sprintf. Он проявляется, когда при выводе строки (аргумент %s), которая к тому же содержит широкие символы в UTF-8 (напр. русские буквы), используются одновременно оба ограничения на длину - минимальное и максимальное - и они равны. Ниже копирую вывод моей тест-программы, которая изолирует баг, и демонстрирует, при каких вызовах функции он происходит.
Первые две пары вызовов printf демонстрируют баг, остальные - его отсутствие при других аргументах.
printf('%-3.3s', 'абвгд'): |абв | printf('%-3.3s', '01234'): |012| printf('%3.3s', 'абвгд'): | абв| printf('%3.3s', '01234'): |012| printf('%3s', 'абвгд'): |абвгд| printf('%3s', '01234'): |01234| printf('%.3s', 'абвгд'): |абв| printf('%.3s', '01234'): |012| printf('%3.4s', 'абвгд'): |абвг| printf('%3.4s', '01234'): |0123|
Проверил, что баг содержится и в самой последней версии языка. Теперь надо посмотреть, сколько осталось пороха в пороховницах и насколько будет легко его починить...