Я думаю, что ваша строка формата для unknown немного отключена.
Вот мой образец:
foreach $longitude (1,2.12345678,undef) {
if (defined $longitude){
printf ("|%-8s %.6f|\n","",$longitude);
}else{
$longitude2 = "<unknown>";
printf ("| %16s|\n",$longitude2);
}
}
И вывод (с " %16s"
для неизвестного формата. Я добавил вертикальные полосы, чтобы четко видеть выравнивание):
| 1.000000|
| 2.123457|
| <unknown>|
P.S. Если вы посмотрите на пример выравнивания по сравнению с тем, что вы создали на самом деле, кажется, что состояние <unknown>
также может быть неправильно выровнено. Чтобы проверить, используйте тот же трюк, который я сделал выше, заключив строку формата для каждого поля в |
, чтобы увидеть, где заканчивается одно поле и начинается другое.