Я работаю над заданием, в котором мне нужно выровнять выходной текст по левому краю. Когда я тестирую программу, мне кажется, что вывод не выровняется. Также для GPA, если я пытаюсь выровнять текст, я теряю точность до 2 десятичных знаков. Вот мой код
#Calculating $semester_gpa
if ($credits_taken == 0) {
exit();
}
my $total = $semester_gpa /= $credits_taken;
#Output formatting
printf ("The student name is: %-6s\n",$user_name);
printf ("Credits taken: %-6s\n", $credits_taken);
printf ("Credits passed: %-6s\n", $credits_passed);
printf ("GPA: %-6s %.2f\n", $total);
Результат моей программы следующий

Что именно я делаю не так?
Вы уверены, что хотите /=?
Ваш последний printf получает только одну переменную, $total, которая, таким образом, форматируется как %-6s, а %.2f ничего не получает. Вы забыли еще одну переменную до $total, или не должно быть %-6s?


Вам не нужно использовать printf, если вы пытаетесь выровнять значения по левому краю, просто добавьте пробелы в строки меток. Под строкой метки я подразумеваю, например, "Credits taken: %s\n" (обратите внимание на пробелы между : и %)
$user_name = 'Jogi';
$credits_taken = 13;
$credits_passed = 9;
$semester_gpa = 4.329;
#Calculating $semester_gpa
if ($credits_taken == 0) {
exit();
}
my $total = $semester_gpa /= $credits_taken;
#Output formatting
printf ("The student name is: %s\n", $user_name);
printf ("Credits taken: %s\n", $credits_taken);
printf ("Credits passed: %s\n", $credits_passed);
printf ("GPA: %.2f\n", $total);
Даже если вы хотите выровнять по правому краю, вы все равно должны ставить пробелы в строках меток, чтобы код был ясным и легким для понимания:
printf ("The student name is: %10s\n", $user_name);
printf ("Credits taken: %10s\n", $credits_taken);
printf ("Credits passed: %10s\n", $credits_passed);
printf ("GPA: %10.2f\n", $total);
Обратите внимание на синтаксис %10.2f, который объединяет выравнивание по правому краю с десятичной точностью.
Чтобы сделать ширину выровненных полей динамической, вы можете использовать специальный * (звездочка) синтаксис для printf:
$width = 20;
printf ("The student name is: %*s\n", $width, $user_name);
printf ("Credits taken: %*s\n", $width, $credits_taken);
printf ("Credits passed: %*s\n", $width, $credits_passed);
printf ("GPA: %*.2f\n", $width, $total);
Вы даже можете сделать точность динамической, если хотите:
$width = 20;
$precision = 2;
printf ("GPA: %*.*f\n", $width, $precision, $total);
Похоже, ваш код выровнен по левому краю. Можете ли вы предоставить образец того, как вы хотите, чтобы результат выглядел?