Это имеет смысл создать хорошую структуру данных, чтобы вы могли запрашивать всю информацию о каждой файловой системе.
# column headers to be used as hash keys
my @headers = qw(name size used free capacity mount);
my @df = `df -k`;
shift @df; # get rid of the header
my %devices;
for my $line (@df) {
my %info;
@info{@headers} = split /\s+/, $line; # note the hash slice
$info{capacity} = _percentage_to_decimal($info{capacity});
$devices{ $info{name} } = \%info;
}
# Change 12.3% to .123
sub _percentage_to_decimal {
my $percentage = shift;
$percentage =~ s{%}{};
return $percentage / 100;
}
Теперь информация для каждого устройства представлена в хэше хэшей.
# Show how much space is free in device /dev/ad4s1e
print $devices{"/dev/ad4s1e"}{free};
Это не самый простой способ сделать это, но это наиболее полезный способ работы с информацией df, помещающий все это в одну красивую структуру данных, которую вы можете передавать по мере необходимости.Это лучше, чем разбивать все на отдельные переменные, и это метод, к которому вы должны привыкнуть.
ОБНОВЛЕНИЕ: Чтобы получить все устройства, которые имеют> 60% емкости, вы должны пройти через все значения вхэш и выберите те, которые имеют емкость более 60%.За исключением емкости хранится в виде строки типа «88%», и это не полезно для сравнения.Мы могли бы вырезать% здесь, но тогда мы будем делать это везде, где мы хотим его использовать.Лучше заранее нормализовать ваши данные, чтобы с ними было легче работать.Хранение отформатированных данных - это красный флаг.Поэтому я изменил приведенный выше код, который читает с df
, чтобы изменить емкость с 88% до 0,88.
Теперь с ним стало проще работать.
for my $info (values %devices) {
# Skip to the next device if its capacity is not over 60%.
next unless $info->{capacity} > .60;
# Print some info about each device
printf "%s is at %d%% with %dK remaining.\n",
$info->{name}, $info->{capacity}*100, $info->{free};
}
Я выбралиспользуйте здесь printf, а не интерполяцию, потому что это немного облегчает просмотр того, как будет выглядеть строка при выводе.