我有一个循环,该循环读取linux proc文件并解析utime值以运行PHP进程。我将这些值存储到哈希(域名和utime值)中。在第二个数组中,我仅保留实际运行PHP进程的域名。我需要做的是,当没有为特定域运行的PHP进程时(例如,域在第一个循环运行中只有1个php进程正在运行,但已经完成,而在第二个循环运行中,没有用于该域的更多PHP进程。域),我想从存储域名和utime的哈希中删除该记录。我希望它足够清楚。
我尝试了以下两种方法,但是都没有用,在输出中我仍然可以看到没有进程正在运行的域(在第一次循环运行之前运行)。
bla.delete_if {|key, value| not vhostnames.include?(key)}
bla.each{|k,_| bla.delete(k) if not vhostnames.include?(k)}
完整代码是:
bla = {}
vhostnames = []
loop do
# Here I find PHP processes and parse domain name of PHP process
....
# This is first array when I store only domain names for PHP process is running for now
vhostnames << vhostname
# Here I parse content of proc file
...
# Here I save or update value to hash
if not bla.has_key?(vhostname)
bla[vhostname] = utime_proc
else
bla.each do |key,value|
if key == vhostname
bla[key] = value + utime_proc
end
end
end
# Here is the place where I try to exclude value from array
# None of these two rows works as expected
# bla.delete_if {|key, value| not vhostnames.include?(key)}
# bla.each{|k,_| bla.delete(k) if not vhostnames.include?(k)}
# Here I print it out
bla.sort_by {|k,v| v}.reverse.each do |k,v|
puts "#{k} ---> #{v}"
end
# End loop
end
答案 0 :(得分:0)
问题解决了!我刚刚在循环结束前添加了vhostnames.clear
,现在代码可以正常工作了!
从哈希中删除值的工作代码是bla.delete_if {|key, value| not vhostnames.include?(key)}
谢谢@JagdeepSingh的帮助。