Нужна помощь с программой Perl - PullRequest
0 голосов
/ 16 апреля 2011

Хорошо, поэтому я пытаюсь взять хеш, и если какая-либо строка в массиве содержит ключ (не значение фактического имени ключа) в хэше, отбросьте его. Еще распечатать строку. Эта проблема связана с частью подпрограммы findHidden. Я пробовал много разных вещей, я прокомментирую ниже, где у меня есть проблемы. Я уверен, что у кого-то есть ответ, всегда получайте его при переполнении стека:)

#!/usr/bin/perl
# Configure
use strict;
use warnings;
use Data::Dumper;
#
sub findHidden;
sub GetInfo; 
sub defineHash;
##############

$passwd = '/etc/passwd';
%info = ();

sub GetInfo {
        die "Cannot open: $passwd"
        unless (open(PW,$passwd));
        while(<PW>) {
                chomp;
                my ($uname,$junk1,$junk2,$junk3,$domain,$home) = split(':', $_);
                next unless ($home =~ /vs/);
                %info = (
                        domain  => $domain,
                        home    => "$home/",
                        tmp     => "$home/tmp",
                        htdocs  => "$home/www/htdocs",
                        cgibin  => "$home/www/cgi\-bin",
                );
                print "\n" . $info{domain} . "\n";
                print "+"x40,"\n\n";
                findHidden($info{tmp});
        }
}
sub findHidden {
        defineHash;
        print "Searching " . $_[0] . "\n";
        print "-"x30,"\n\n";
        @hidden = `find $_[0] -iname ".*"`;
        for(@hidden) {
                foreach $key (keys % hExcludes) {
                        if ($_ =~ /$key/){    #
                                last;         # This portion is 
                        }else{                # Only an issue when using more
                                print "$_";   # than 2 keys in my hash.
                                last;
                        }
                }
        }
}
sub defineHash {
        %hExcludes = ();
        %hExcludes = map { $_, 1 } (
                'spamd','.nfs'     # If I add another key here, it breaks.
        );

        %knownExploits = 
                ( );
        print Dumper \%hExcludes;
}
GetInfo;

Это работает, и печатает что-то вроде этого:

/ somedir / TMP / .testthis
/ somedir / TMP / .sdkfbsdif
/ somedir / tmp / .asdasdasd

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

Я также пытался использовать shift @hidden, как показано ниже, но безрезультатно.

                foreach $key (keys % hExcludes) {
                        if ($_ =~ /$key/){    #
                                last;         #
                                shift @hidden;# This portion is 
                        }else{                # Only an issue when using more
                                print "$_";   # than 2 keys in my hash.
                                last;
                        }

Кроме того, имейте в виду, что все перестает работать, когда я добавляю третий ... или больше ключей.

        %hExcludes = map { $_, 1 } (
                'spamd','.nfs','key3'     # If I add another key here, it breaks
        );

1 Ответ

3 голосов
/ 16 апреля 2011

Вам нужно следующее:

    @hidden = `find $_[0] -iname ".*"`;
    for(@hidden) {
        undef $isExcluded;
        foreach $key (keys % hExcludes) {
            if ($_ =~ /$key/){
                $isExcluded=1;
                last;
            }
        }
        if( ! $isExcluded ) {
            print "$_";
        }
    }

Что бы ни происходило при сканировании с помощью ключей hExclude, код обнаружил last на первом ключе и больше не обрабатывался.Вам нужно установить флаг и продолжать итерацию, пока либо не останется ключей для установки, либо не будет найдено совпадение.Затем вы можете распечатать значения, которые не были сопоставлены.

...