Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中选择相关行?_Perl_Conditional - Fatal编程技术网

如何在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

我需要帮助修改这个Perl代码。我可以获得主机上所有服务的列表。但是,我只对那些
红色
(已停止)的服务发送电子邮件感兴趣。我不确定我在哪里设置了这个条件(也许是在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";