Arrays 需要perl程序的帮助吗
好的,我尝试获取一个散列,如果数组中的任何字符串在散列中包含keynot值,则丢弃它。否则打印出字符串。此问题与findHidden子例程的一部分有关。我尝试了很多不同的事情,我会在下面评论我的问题。我肯定有人有答案,总是在堆栈溢出时得到答案:Arrays 需要perl程序的帮助吗,arrays,perl,loops,hash,shift,Arrays,Perl,Loops,Hash,Shift,好的,我尝试获取一个散列,如果数组中的任何字符串在散列中包含keynot值,则丢弃它。否则打印出字符串。此问题与findHidden子例程的一部分有关。我尝试了很多不同的事情,我会在下面评论我的问题。我肯定有人有答案,总是在堆栈溢出时得到答案: #!/usr/bin/perl # Configure use strict; use warnings; use Data::Dumper; # sub findHidden; sub GetInfo; sub defineHash; #######
#!/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;
另外,请记住,只有当我添加第三个…或更多键时,事情才会停止工作
%hExcludes = map { $_, 1 } (
'spamd','.nfs','key3' # If I add another key here, it breaks
);
您需要的是:
@hidden = `find $_[0] -iname ".*"`;
for(@hidden) {
undef $isExcluded;
foreach $key (keys % hExcludes) {
if ($_ =~ /$key/){
$isExcluded=1;
last;
}
}
if( ! $isExcluded ) {
print "$_";
}
}
无论在扫描hExcludes键时发生了什么,代码在第一个键上遇到了最后一个键,不再处理。您需要设置一个标志并继续迭代,直到没有更多的键需要设置,或者找到匹配项为止。然后,您可以打印出不匹配的值。您只需说出它的含义即可?一个提示:您正在替换其值在正则表达式中包含元字符的变量,即.nfs。您可能需要编写/\Q$key\E/以提供报价。-1您发布的代码不可能工作,因为它甚至无法编译。您应该确保发布与您运行的代码完全相同的代码!问题,您认为这种方法比不使用散列键进行匹配快吗?实际上您并没有真正使用散列键,因为将散列放入其中的唯一用途是创建一个唯一正则表达式数组以再次进行测试。通过使用散列,您可以免费获得唯一的测试,但必须花费时间从散列创建一个数组,然后才能使用它。如果所需的测试是匹配显式文件名,即测试是$\u==$key,那么它可以更快地写入,因为存在$hExcludes{$\u},并且避免了内部循环。有意义的是,唯一的问题是我需要一个If不包含显式匹配。
@hidden = `find $_[0] -iname ".*"`;
for(@hidden) {
undef $isExcluded;
foreach $key (keys % hExcludes) {
if ($_ =~ /$key/){
$isExcluded=1;
last;
}
}
if( ! $isExcluded ) {
print "$_";
}
}