2011-04-15 65 views
-1

好吧,所以我想采取一个散列,如果在数组中的任何字符串包含密钥(不值实际的密钥名称)在哈希丢弃它。否则打印出字符串。这个问题与findHidden子例程的一部分有关。我尝试了很多不同的东西,我会在下面评论我遇到的问题。我敢肯定有人有一个答案,总是拿一个在堆栈溢出:)需要帮助的Perl程序

#!/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

你只需要说出你的意思是什么“它打破”?一个提示:你正在替代其值在正则表达式中包含元字符的变量,即“.nfs”。您可能需要编写/ \ Q $ key \ E /以提供报价。 – Ingo 2011-04-15 23:32:06

+3

-1你发布的代码不可能“工作”,因为它甚至没有编译。您应该确保发布与您运行的代码完全相同的代码! – tadmc 2011-04-16 00:06:37

回答

3

你需要的是这样的:

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

无论通过hExcludes的按键您的扫描发生,代码的第一个关键遇到last,并没有处理任何更多。你需要设置一个标志并继续迭代,直到没有更多的键被设置,或者找到匹配。然后你可以打印出不匹配的值。

+0

你真棒,像魅力一样工作 – noledgeispower 2011-04-16 00:07:10

+0

问题,你认为这种方法比不使用散列键匹配更快吗? – noledgeispower 2011-04-16 00:08:27

+0

实际上你并没有真正使用散列键,因为你只需要使用散列就可以创建一个独特的正则表达式数组来再次测试。通过使用散列,您可以免费获得独特的测试,但必须花费时间从散列创建数组,然后才能使用它。 如果所需的测试是匹配显式文件名,那测试就是'$ _ == $ key',那么它可以被写得更快,因为'exists $ hExcludes {$ _}'并且避免了内部循环。 – 2011-04-16 08:19:45