我正在尝试从模块内部的哈希中获取键值:
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}};
这是无效的。你有strict
并warnings
打开吗?因为您正在尝试将散列分配给标量,所以它不会做您想要的事情。
您可能是说:
$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] 删除。
我来说两句