需要有关perl程序的帮助

时间:2011-04-15 23:21:10

标签: arrays perl loops hash shift

好的,所以我正在尝试使用哈希,如果数组中的任何字符串包含哈希中的键(不是值实际键名),则将其丢弃。否则打印出字符串。此问题与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;

这是Works,并打印出类似这样的内容:

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

我理解为什么它不起作用,因为它是循环通过键,其中一些是假的,一些是积极的,我只是想不出如何让它做我想要的,请假设我可能想要你10键。我知道有些方法可以在不使用散列键值的情况下进行排除,但这是我想要完成的。

我也尝试过@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 个答案:

答案 0 :(得分:3)

你需要的是:

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

无论您在扫描hExcludes的密钥时发生了什么,代码在第一个密钥上遇到last并且不再处理。您需要设置一个标志并继续迭代,直到没有更多的键要设置,或找到匹配项。然后,您可以打印出不匹配的值。