2012-01-18 2 views
1

Что происходит:Проверка Дубли в массиве

Я ssh'd на моем локальный, Л.С. рабочего стола и принимать те элементы и поместить их в массив.

Я жестко запрограммировал короткий список элементов, и я сравниваю их с хешем, чтобы увидеть, нет ли чего-либо из хоста (см., Если что-то из a НЕ в b, и дайте мне знать).

Итак, выяснив это, когда я распечатываю «недостающие файлы», я получаю кучу дубликатов (см. Ниже), не уверен, что это связано с тем, как файлы проверяются в цикле, но я подумал, что лучше всего будет просто разобраться в данных и устранить обманы.

Когда я это делаю и распечатаю фиксированные данные, печатается только один файл, два отсутствуют.

Любая идея, почему?

#!/usr/bin/perl 

my $hostname = $ARGV[0]; 

my @hostFiles = ("filecheck.pl", "hostscript.pl", "awesomeness.txt"); 
my @output =`ssh $hostname "cd Desktop; ls -a"`; 

my %comparison; 
for my $file (@hostFiles) { 
    $comparison{$file} +=1; 
} 

for my $file (@output) { 
    $comparison{$file} +=2 
} 

for my $file (sort keys %comparison) { 
    @missing = "$file\n" if $comparison{$file} ==1; 
    #print "Extra file: $file\n" if $comparison{$file} ==2; 
    print @missing; 
} 

my @checkedMissingFiles; 

foreach my $var (@missing){ 
    if (! grep(/$var/, @checkedMissingFiles)){ 
     push(@checkedMissingFiles, $var); 
    } 
} 
print "\n\nThe missing Files without dups:\n @checkedMissingFiles\n"; 

Пароль:

awesomeness.txt ##This is what is printing after comparing the two arrays 
awesomeness.txt 
filecheck.pl 
filecheck.pl 
filecheck.pl 
hostscript.pl 
hostscript.pl 

The missing Files without dups: ##, что печатает после прополки дублирует hostscript.pl

ответ

2

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; 
} 

$ ПРС выходной разделитель записей (он напечатан после любой печати) и $ 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; 

Это позволяет вам делать больше вещей с именем файла, например, вы можете передать его на хост.

+0

Я думаю, что моя самая большая проблема заключается в сравнении файлов на хосте со списком выше.Я не хочу возвращать совпадающие элементы, но скорее найду, какие из% hostFiles не находятся в @files. – jackie

+0

мой плохой, я пропустил это. Ред. – Sorin

+1

Ahhh. Я читаю документацию Data :: Dumper, чтобы узнать, что еще он может сделать ... Что делать, если я не хочу «печатать» эти данные, а вместо этого писать в файл или отправлять информацию по электронной почте? – jackie

-1

@missing = "$ файл \ п" присваивает массив @missing, чтобы содержать один элемент, "$ file \ n". Он делает это каждый цикл, оставляя его с последним отсутствующим файлом.

Что вам нужно, это нажать (@missing, "$ file \ n").

1

Мне кажется, что переполнение списка обязательных запросов более важно, поскольку цикл поиска по списку существующих файлов не требуется, если вы не ищете файлы, которые существуют, но не нужны.

#!/usr/bin/perl 
use strict; 
use warnings; 
my @hostFiles = ("filecheck.pl", "hostscript.pl", "awesomeness.txt"); 
my @output =`ssh $ARGV[0] "cd Desktop; ls -a"`; 
chomp @output; 
my @missingFiles; 
foreach (@hostFiles) { 
    push(@missingFiles, $_) unless $_ ~~ @output; 
} 
print join("\n", "Missing files: ", @missingFiles); 
Смежные вопросы