如何在Perl中选择相关行?
我需要帮助修改这个Perl代码。我可以获得主机上所有服务的列表。但是,我只对那些如何在Perl中选择相关行?,perl,conditional,Perl,Conditional,我需要帮助修改这个Perl代码。我可以获得主机上所有服务的列表。但是,我只对那些红色(已停止)的服务发送电子邮件感兴趣。我不确定我在哪里设置了这个条件(也许是在foreach中) 现在输出: Service: AeLookupSvc - Green - Auto Service: Alerter - Red - Disabled Service: ALG - Red - Manual Service: AppMgmt - Green - Manual Perl代码: my @servstat
红色
(已停止)的服务发送电子邮件感兴趣。我不确定我在哪里设置了这个条件(也许是在foreach中)
现在输出:
Service: AeLookupSvc - Green - Auto
Service: Alerter - Red - Disabled
Service: ALG - Red - Manual
Service: AppMgmt - Green - Manual
Perl代码:
my @servstat = ("Red","Green");
my $computer = "localhost";
my $winsvcs;
my $wmiObj = Win32::OLE->GetObject("winmgmts:\\\\$computer\\root\\CIMV2")
or die "WMI connection failed.\n";
#get all services
my $servSet = $wmiObj->ExecQuery("SELECT * FROM Win32_Service", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly);
foreach my $serv (in $servSet) {
my $sname = $serv->{name};
my $sstate = $serv->{started};
my $ssmode = $serv->{startmode};
$winsvcs .= "Service: " . $sname . " - " . $servstat[$sstate] . " - " . $ssmode . "\n";
}
您可以在SQL查询中处理该条件(只返回相关的行-红色的行)。这可能是最好的处理方法;它限制了DBMS和客户机之间发送的数据(这在单机或LAN连接上可能不太重要,但在WAN连接上确实很重要) 或者,您可以在
for
循环中使用测试,以便仅当$sstate
为0(相当于红色)时,才将相关信息添加到$winsvcs
请注意,
操作符可能是必需的(特别是如果需要嵌入函数调用的结果),但在显示的代码中并不真正需要。您甚至可以不使用3个循环变量,但这一行会变得相当长
$winsvcs .= "Service: $serv->{name} - $servstat[$serv->{started}] - $serv->{startmode}\n";
这两种方法都会奏效。我建议修改SQL而不是循环,但选择权在你。@cjd143SD:正如你所看到的,我演示了如何修改,但你的技术也可以很好地工作。我收到的错误消息
不是数组引用
,指的是每个$serv(@{$servSet})的
@cjd143SD:我说我在处理$servSet
时做了一个假设;你刚刚证明了我的假设是错误的。我看到这个包在(COLLECTION)中有一个方法,所以你原来的循环控制代码还可以;事实远非如此。这就是Perl:TMTOWTDI的奇妙之处(有多种方法可以做到这一点)。我为我的误导道歉,谢谢。不需要道歉。这都是我自己学习perl的一部分。我喜欢这种语言。这真的是我的第一个编程语言。我看到了很多关于如何做事情的例子,所以我拿我能得到的:-)
foreach my $serv (in $servSet)
{
next if $serv->{started};
my $sname = $serv->{name};
my $sstate = $serv->{started};
my $ssmode = $serv->{startmode};
$winsvcs .= "Service: $sname - $servstat[$sstate] - $ssmode\n";
}
$winsvcs .= "Service: $serv->{name} - $servstat[$serv->{started}] - $serv->{startmode}\n";