Arrays Perl:乘法循环、1哈希和正则表达式

Arrays Perl:乘法循环、1哈希和正则表达式,arrays,regex,perl,hash,perl-data-structures,Arrays,Regex,Perl,Hash,Perl Data Structures,我陷入了循环(while&foreach)和AoH背后的逻辑。我有关于循环和散列数组的基本知识,但我不太明白如何将它们组合成一个简单的解决方案。我的任务是检查普通用户的密码期限,如果它早于n-天(最后一部分对我来说没问题,我知道如何解决它,使用GetOptions等) 为此,我想出了一个解决方案: 1将文件/etc/passwd加载到脚本中,执行正则表达式搜索以查找常规用户。Linux类系统中的普通用户的ID为1000或更高,因此我使用这个正则表达式来查找: /(\w+[:]x[:]1[0-9]

我陷入了循环(while&foreach)和AoH背后的逻辑。我有关于循环和散列数组的基本知识,但我不太明白如何将它们组合成一个简单的解决方案。我的任务是检查普通用户的密码期限,如果它早于n-天(最后一部分对我来说没问题,我知道如何解决它,使用GetOptions等)

为此,我想出了一个解决方案:

1将文件/etc/passwd加载到脚本中,执行正则表达式搜索以查找常规用户。Linux类系统中的普通用户的ID为1000或更高,因此我使用这个正则表达式来查找:

/(\w+[:]x[:]1[0-9]{3}/

2将正则表达式的结果加载到数组中:

my (@Usernames, %pwdsettings);
while (my $pwdsettings = <$fh2>) {
    if ($pwdsettings =~ /(\w+)[:]x[:]1[0-9]{3}/) {
    $pwdsettings{"Username"} = $1;
    push (@Usernames, \%pwdsettings);
    }
}
4打开
$pwdsett_dump
,然后执行第二次正则表达式搜索以获取上次密码更改的日期。之后,将结果加载到数组(AoH)内的现有哈希中:


输出时需要附加文件,即使用“>>”而不是“>”,这将覆盖文件。
system(“chage-l$\u>$pwdsett\u dump”)
在循环中运行时,每次循环执行时都会覆盖它。 使用:

foreach(@Usernames){
系统(“chage-l$\u>>$pwdsett\u转储”)
}
########示例脚本
#!/usr/bin/perl
严格使用;
使用警告;
my$usernames_dump=“/etc/passwd”;

打开(my$fh2),您需要在输出时附加文件,意思是使用“>>”而不是“>”,这将覆盖文件。
system(“chage-l$\u>$pwdsett\u dump”)
在循环中运行时,每次循环执行时都会覆盖它。 使用:

foreach(@Usernames){
系统(“chage-l$\u>>$pwdsett\u转储”)
}
########示例脚本
#!/usr/bin/perl
严格使用;
使用警告;
my$usernames_dump=“/etc/passwd”;

打开(my$fh2,“>”这是您仅获得1个用户输出的原因。感谢您的回答,但当
@Usernames
传递到foreach循环时,它仍会生成
sh:1:语法错误:“(
@Usernames
意外,因为
@Usernames
哈希(0x21455d0)哈希(0x21612c0)
组成(出于某些该死的原因)
。我对
chage
一无所知,但我怀疑您希望
$\u
成为第一个循环中出现的
$1
。在这种情况下,将
推送(@Usernames,\%pwdsettings);
更改为
推送(@Usernames,$1);
'>'您仅获得1个用户输出的原因。感谢您的回答,但当
@Usernames
传递到foreach循环时,它仍会生成
sh:1:语法错误:“(
@Usernames
意外,因为
@Usernames
哈希(0x21455d0)哈希(0x21612c0)
(出于某些该死的原因)
。我对
chage
一无所知,但我怀疑您希望
$\u
成为第一个循环中出现的
$1
。在这种情况下,将
推送(@Usernames,\%pwdsettings);
更改为
推送(@Usernames,$1);
'>'您仅获得1个用户输出的原因。感谢您的回答,但当
@Usernames
传递到foreach循环时,它仍会生成
sh:1:语法错误:“(
@Usernames
意外,因为
@Usernames
哈希(0x21455d0)哈希(0x21612c0)
(出于某些该死的原因)
。我对
chage
一无所知,但我怀疑您希望
$\u
成为第一个循环中出现的
$1
。在这种情况下,将
推送(@Usernames,\%pwdsettings);
更改为
推送(@Usernames,$1)
my $pwdsett_dump = "tmp/pwdsett-dump.txt";
...
foreach (@Usernames) {
    system("chage -l $_ > $pwdsett_dump")
}
open (my $fh3, "<", $pwdsett_dump) or die "Could not open file '$pwdsett_dump': $!";
while (my $array = <$fh3>) {
    if ($array =~ /^Last\s+password\s+change\s+:\s(\w{3})\s+(\d{2}),\s+(\d{4})/) {
        $pwdsettings{"Month"} = $1;
        $pwdsettings{"Day"} = $2;
        $pwdsettings{"Year"} = $3;
    }
}
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $pwdsett_dump = "tmp/pwdsett-dump.txt";
my $usernames_dump = "tmp/usernames-dump.txt";
system("cat /etc/passwd > $usernames_dump");
open (my $fh2, "<", $usernames_dump) or die "Could not open file '$usernames_dump': $!";

my (@Usernames, %pwdsettings);
while (my $pwdsettings = <$fh2>) {
    if ($pwdsettings =~ /(\w+)[:]x[:]1[0-9]{3}/) {
    $pwdsettings{"Username"} = $1;
    push (@Usernames, \%pwdsettings);
    }
}

foreach (@Usernames) {
    system("chage -l $_ > $pwdsett_dump")
}
open (my $fh3, "<", $pwdsett_dump) or die "Could not open file '$pwdsett_dump': $!";
while (my $array = <$fh3>) {
    if ($array =~ /^Last\s+password\s+change\s+:\s(\w{3})\s+(\d{2}),\s+(\d{4})/) {
    $pwdsettings{"Month"} = $1;
    $pwdsettings{"Day"} = $2;
    $pwdsettings{"Year"} = $3;
    }
}

print Dumper \@Usernames;
foreach (@Usernames) {
    system("chage -l $_ >> $pwdsett_dump")
}
########sample script
#!/usr/bin/perl

use strict;
use warnings; 

my $usernames_dump = "/etc/passwd";
open (my $fh2, "<", $usernames_dump) or die "Could not open file '$usernames_dump': $!";

my @pwdsettings;
my $i =0;
my @pwdsett_dump;
while (<$fh2>) {

if ($_ =~ /(\w+)[:]x[:]1[0-9]{3}/) {
my @user = split(/:/, $_);
 $pwdsettings[$i] = $user[0];
 $pwdsett_dump[$i] = `chage -l $user[0]|grep Last`;
 $pwdsett_dump[$i] =~ s/Last.*://;
 $pwdsett_dump[$i] =~ s/,//;
 my @m = split(/ /,$pwdsett_dump[$i]);
 print "$user[0]\t Date: $m[2] Month: $m[1] Year: $m[3]\n";
 $i++;
   }
 }
 Output: testuser Date: 12 Month: May Year: 2015