Arrays Perl数组循环

Arrays Perl数组循环,arrays,loops,perl,process,status,Arrays,Loops,Perl,Process,Status,我有一个数组,我想在其中检查以下检查中的元素是否返回某个值,如果匹配条件,则将其从数组中删除。继续循环槽阵列,直到所有元素都消失 foreach$temp(@inputs); { my$check=&checkStatus($temp,$server); 如果($勾选ne“Z”); 打印“$temp失败!\n”; } 如果您有办法等待任何项目的状态发生更改,那就最好了 例如,如果您正在处理流程,则可以使用 my %children = map { $_ => 1 } @pids; whi

我有一个数组,我想在其中检查以下检查中的元素是否返回某个值,如果匹配条件,则将其从数组中删除。继续循环槽阵列,直到所有元素都消失

foreach$temp(@inputs);
{
my$check=&checkStatus($temp,$server);
如果($勾选ne“Z”);
打印“$temp失败!\n”;
}

如果您有办法等待任何项目的状态发生更改,那就最好了

例如,如果您正在处理流程,则可以使用

my %children = map { $_ => 1 } @pids;

while (%children) {
   my $pid = wait();
   my $status = $?;

   delete($children{$pid});

   if    ( $status & 0x7F ) { warn("Child $pid killed by signal ".( $status & 0x7F )."\n"); }
   elsif ( $status >> 8   ) { warn("Child $pid exited with error ".( $status >> 8 )."\n"); }
   else                     { print("Child $pid exited successfully\n"); }
}
否则,您将需要进行投票

use Time::HiRes qw( sleep );  # Time::HiRes::sleep supports fractional durations.

my %foos = map { $_ => 1 } @foo_ids;

while (%foos) {
   for my $foo_id (keys(%foos)) {
      if (checkStatus($foo_id, $server) eq 'Z') {
         delete($foos{$foo_id});
         # ...?
      }
   }

   sleep(0.1);  # To avoid using 100% CPU.
}
请注意,在这两种情况下,您都可以使用哈希元素的值来包含有关该对象的信息

 # When creating the foos.
 $foos{$foo_id} = $foo;


奥列格,问题的描述不是很清楚

您的代码不会从数组中删除任何内容。我假设您希望遍历数组,并且仅当元素满足某些条件时才打印数据

请参阅下面的示例,其中我在存储服务器场报告的温度的阵列中进行模拟

#!/usr/bin/perl -CS
#
# vim: ai:ts=4:sw=4
#

use strict;
use warnings;
use feature 'say';

my $max_temp = 36;      # maximum permited termperature

my @data = <DATA>;      # fill array with some data

for (@data) {
    next if /^\s*$/;        # skip empty lines

    chomp;
    my($s,$t) = split ',';

    say chr(0x267F) . " $s temp=$t" if $t > $max_temp;
}


__DATA__
server1,32
server2,30
server3,42
server4,32
server5,37
server6,36
server7,30
按照@Shawn的建议,您可以使用:

@inputs_wo_z = grep { checkStatus($_, $server) ne "Z" } @inputs;
这里,
grep
计算提供给它的最后一个表达式,即
checkStatus(…)
是否返回非Z。默认情况下,
@inputs
数组的每个元素都被分配给
$\ucode>内部
grep
返回条件为true的数组的所有元素


请注意,在这里调用方法之前不必使用
&
,因为您使用的是括号。有关详细信息,请参见,并由@ikegami解释。

提示:使用
grep
。我添加了一段代码,它不是一个工作代码,而是我正在查找的代码。checkStatus将用于检查进程的进度,返回“Z”可能需要几个小时,在这个示例中我需要睡眠命令吗?我误解了你的问题。我已经替换了我的答案。
♿ server3 temp=42
♿ server5 temp=37
@inputs_wo_z = grep { checkStatus($_, $server) ne "Z" } @inputs;