好的,所以我正在尝试使用哈希,如果数组中的任何字符串包含哈希中的键(不是值实际键名),则将其丢弃。否则打印出字符串。此问题与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
);
答案 0 :(得分:3)
你需要的是:
@hidden = `find $_[0] -iname ".*"`;
for(@hidden) {
undef $isExcluded;
foreach $key (keys % hExcludes) {
if ($_ =~ /$key/){
$isExcluded=1;
last;
}
}
if( ! $isExcluded ) {
print "$_";
}
}
无论您在扫描hExcludes的密钥时发生了什么,代码在第一个密钥上遇到last
并且不再处理。您需要设置一个标志并继续迭代,直到没有更多的键要设置,或找到匹配项。然后,您可以打印出不匹配的值。