首页 > 解决方案 > Perl 数组循环

问题描述

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

foreach $temp (@inputs);
    {
        my $check = &checkStatus($temp, $server);
        if ($check ne "Z");
        print "$temp failed!\n";
    }

标签: arraysloopsperlprocessstatus

解决方案


如果您有办法等待任何项目的状态发生变化,那将是最好的。

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

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;

 # When waiting the foos.
 my $foo = delete($foos{$foo_id});

推荐阅读