Perl:获取键值

用户4839151

我正在尝试从模块内部的哈希中获取键值:

Module.pm

...
my $logins_dump = "tmp/logins-output.txt";
system("cat /var/log/secure | grep -n -e 'Accepted password for' > $logins_dump");
open (my $fh, "<", $logins_dump) or die "Could not open file '$logins_dump': $!";

sub UserLogins {
    my %user_logins;
    while (my $array = <$fh>) {
        if ($array =~ /Accepted\s+password\s+for\s+(\S+)/) {
            $user_logins{$1}++;
         }
    }
    return \%user_logins;
}

sub CheckUserLogins {
    my $LoginCounter;
    my $UsersToCheck = shift @_;
    if (exists %{UserLogins()}{$UsersToCheck}){
        $LoginCounter = %{UserLogins{$UsersToCheck}}; #How many logins?
    }
    else {
        $LoginCounter = "0";
    }
    return \$LoginCounter;
}

Script.pl

$UserLoginCounter = Module::CheckUserLogins($UsersToPass);

我将用户名传递给脚本,并检查用户名是否在哈希中(如果存在),我需要返回登录数,这是我想做的$LoginCounter由于某些原因,脚本仅返回0或undef。

清醒

好吧,对于初学者-您还CheckUserLogins没有CheckLoginAttempts

假设这只是一个错字-UserLogins返回哈希引用-一个标量值。您可能会0发现exists检查是否失败。

如果确实存在,则可以执行以下操作:

$LoginCounter = %{UserLogins{$UsersToCheck}};

这是无效的。你有strictwarnings打开吗?因为您正在尝试将散列分配给标量,所以它不会做您想要的事情。

您可能是说:

$LoginCounter = ${UserLogins()} -> {$UsersToCheck};

它从中取消引用UserLogins,然后查找键。

但是,我可能会以不同的方式处理您的问题-它只会在执行您的操作时起作用一次,因为每次调用UserLogins它都会创建一个新的哈希,但不会回退$fh

所以我建议:

use strict;
use warnings;

{
    my %userlogins;

    sub inituserlogins {
        open( my $fh, "<", '/var/log/secure' )
            or die "Could not open file: $!";
        while ( my $array = <$fh> ) {
            if ( $array =~ /Accepted\s+password\s+for\s+(\S+)/ ) {
                $userlogins{$1}++;
            }
        }
        close($fh);
    }

    sub CheckUserLogins {
        my ($UsersToCheck) = @_;
        inituserlogins() unless %userlogins;
        return $userlogins{$UsersToCheck} ? $userlogins{$UsersToCheck} : 0;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章