Perl может сделать это следующим образом:
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my %hostFiles = qw( filecheck.pl 1 hostscript.pl 1 awesomeness.txt 1);
# ssh + backticks + ls, not the greatest way to do this, but that's another Q
my @files =`ssh $ARGV[0] "ls -a ~/Desktop"`;
# get rid of the newlines
chomp @files;
#grep returns the matching element of @files
my %existing = map { $_ => 1} grep {exists($hostFiles{$_})} @files;
print Dumper([grep { !exists($existing{$_})} keys %hostFiles]);
Data :: Dumper - это служебный модуль, я использую его для отладки или в демонстрационных целях.
Если вы хотите напечататьВ списке вы можете сделать что-то вроде этого:
{
use English;
local $OFS = "\n";
local $ORS = "\n";
print grep { !exists($existing{$_})} keys %hostFiles;
}
$ ORS - это разделитель выходной записи (он печатается после любой печати), а $ OFS - это разделитель выходного поля, который печатается между аргументами печати.См. perlvar .Вы можете избежать использования "английского", но имена переменных будут выглядеть ужаснее.Блок и локальный, так что вам не нужно сохранять и восстанавливать значения специальных переменных.
Если вы хотите записать в файл, результат будет выглядеть примерно так:
{
use English;
local $OFS = "\n";
local $ORS = "\n";
open F, ">host_$ARGV[0].log";
print F grep { !exists($existing{$_})} keys %hostFiles;
close F;
}
Конечно, вы также можете сделать это «классическим» способом, циклически проходя по массиву инапечатайте каждый элемент:
open F, ">host_$ARGV[0].log";
for my $missing_file (grep { !exists($existing{$_})} keys %hostFiles) {
use English;
local $ORS = "\n";
print F "File is missing: $missing_file"
}
close F;
Это позволяет вам делать больше вещей с именем файла, например, вы можете переадресовать его на хост.