Вы хотите сделать эту строку формата вместо вашей:
printf ("%04.4s", $string);
Вам нужен .4, потому что это определяет максимальную длину.(4 в начале указывает только минимум)
вот вывод некоторых тестов:
$ perl -e "my \$string = \"my_string\";print sprintf(\"%04.4s\", 22);"
0022
$ perl -e "my \$string = \"my_string\";print sprintf(\"%04.4s\", \$string);"
my_s
$ perl -e "my \$string = \"my\";print sprintf(\"%04s\", \$string);"
00my
Вот вывод с использованием неверной строки формата.Как видите, строки не усекаются.
$ perl -e "my \$string = \"my_string\";print sprintf(\"%04s\", 22);"
0022
$ perl -e "my \$string = \"my_string\";print sprintf(\"%04s\", \$string);"
my_string