Проблема в этой строке:
foreach $line ($dflines) {
Вы выполняете только одну итерацию, поскольку это не массив, а скаляр.Когда вы print "$line"
фактически печатаете все захваченные вами строки, но я думаю, это выглядит так, как будто вы напечатали много значений в цикле.В следующей части:
my @values = split(' ',$line);
my ($MBsize, $MBused, $MBavail, $dir) =
($values[1], $values[2], $values[3], $values[5]);
print "MBsize=$MBsize MBused=$MBused MBavail=$MBavail dir=$dir\n";
Вы используете только первые несколько значений разбиения, но остальная часть этой строки также там.Другими словами, @values
содержит все ожидаемые значения.Диапазон 0..5 содержит первую строку, 6..10 - следующую и т. Д.Так как вы используете только первые 6 значений, вы их не видите.
Быстрое решение может быть сделано:
foreach $line (split /\n/, $dflines) {
Что могло бы сломать ваш ввод, как вы ожидалиэто будет.
Несколько советов:
Всегда use warnings; use strict;
И вы должны использовать некоторые надлежащие функции Perl:
for my $line (split /\n/, $dflines) {
print $line;
my @values = split ' ', $line;
printf "MBsize=%s MBused=%s MBavail=%s dir=%s\n", @values[1,2,3,5];
}
Itпохоже, что вы хотите напечатать строки MBsize ...
после обычного вывода.Если это так, вы можете просто сохранить строки в массиве и напечатать после цикла:
my @print;
for my $line (split /\n/, $dflines) {
print $line;
my @values = split ' ', $line;
push @print, sprintf "MBsize=%s MBused=%s MBavail=%s dir=%s\n", @values[1,2,3,5];
} # note ----^ sprintf instead
print @print;