Хорошо, поэтому я пытаюсь взять хеш, и если какая-либо строка в массиве содержит ключ (не значение фактического имени ключа) в хэше, отбросьте его. Еще распечатать строку. Эта проблема связана с частью подпрограммы 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
);