【问题标题】:help with perl foreach loopperl foreach 循环的帮助
【发布时间】:2011-10-20 04:41:58
【问题描述】:

我需要帮助确定在哪里拨打我的send_mail ()。我目前将它放在代码中的位置,它会针对每个条件发送一封电子邮件,并且它发送的每封电子邮件都会添加另一条记录作为集合的一部分。我只对发送一封包含收集记录的电子邮件感兴趣,即显示的最后一封电子邮件(msg4)。我可以在同一个循环中执行此操作吗?我不确定。

示例: (msg1)

Service: MST Engine  - Stopped - Manual

(msg2):

Service: MST Engine  - Stopped - Manual
Service: MST Logging   - Stopped - Manual

(msg3):

Service: MST Engine  - Stopped - Manual
Service: MST Logging   - Stopped - Manual
Service: MST Server  - Stopped - Manual

(msg4):(只对这封邮件感兴趣)

Service: MST Engine  - Stopped - Manual
Service: MST Logging   - Stopped - Manual
Service: MST Server  - Stopped - Manual
Service: MST Formatter  - Stopped - Manual

这是我设置条件的主要部分: (我使用的 Win32::OLE 包有一个方法 in(COLLECTION)。所以它不是数组引用。)

foreach my $serv (in $servSet) 
{
    next if $serv->{started};
    my $sname  = $serv->{name};
    my $sstate = $serv->{started};
    my $ssmode = $serv->{startmode};
    $winsvcs .= "Service: $sname  - $servicestate[$sstate] - $ssmode\n";
    send_email();
 }

【问题讨论】:

    标签: perl foreach


    【解决方案1】:

    将 send_email 调用移出循环,否则它将在每次通过循环时调用它。我假设该函数只是发送 $winsvcs 的内容。

    my $winsvcs = '';
    foreach my $serv (in $servSet) {
        next if $serv->{started};
        my $sname  = $serv->{name};
        my $sstate = $serv->{started};
        my $ssmode = $serv->{startmode};
        $winsvcs .= "Service: $sname  - $servicestate[$sstate] - $ssmode\n";
    
    }
    send_email();
    

    【讨论】:

    • 感谢您澄清这一点。它现在工作正常。如果我只想过滤特定服务的输出怎么办?例如,只对Engine | Logging |Server 感兴趣。我会为此使用正则表达式吗?再次感谢。
    • 您可以通过添加另一个“下一个”行来过滤它。例如,如果你想过滤掉“Logging”,你可以添加“next if $sname eq 'Logging';
    • 经过一整天的测试。我看到的是如果我有一个空集(基本上没有$winsvcs 的记录,它发送的电子邮件当然是一个空/没有消息正文。如果没有正文或@987654324,我该如何更改@ 是空的,不要调用 send_email?如果没有什么要报告的,我不想要电子邮件。再次感谢。
    • if ( $winsvcs ) { send_email(); }
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多