-1

わかりましたので、ハッシュを取得しようとしています。配列内の文字列にキー (実際のキー名の値ではない) が含まれている場合は、ハッシュを破棄します。それ以外の場合は、文字列を出力します。この問題は、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個のキーが欲しいと思ってください. 除外にハッシュキー値を使用せずにそれを行う方法があることは知っていますが、それが私が達成したいことです。

また、以下のように @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;
                        }

また、3 つ目以降のキーを追加すると機能が停止することに注意してください。

        %hExcludes = map { $_, 1 } (
                'spamd','.nfs','key3'     # If I add another key here, it breaks
        );
4

1 に答える 1

3

必要なのはこれです:

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

hExcludesのキーを介したスキャンで何が起こっても、コードlastは最初のキーでaを検出し、それ以上処理しませんでした。フラグを設定し、設定するキーがなくなるか、一致するものが見つかるまで繰り返しを続ける必要があります。次に、一致しなかった値を出力できます。

于 2011-04-15T23:49:27.033 に答える