ruby - 如果值不在另一个哈希中,则从循环中的哈希中删除值

标签 ruby linux

我有一个循环,它读取 linux proc 文件并解析运行 PHP 进程的 utime 值。我将这些值存储到哈希(域名和 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

最佳答案

问题解决了!我刚刚在循环结束之前添加了一个 vhostnames.clear 并且代码现在可以正常工作了!

从散列中删除值的工作代码是这个 bla.delete_if {|key, value|不是 vhostnames.include?(key)}

感谢@JagdeepSingh 的帮助。

关于ruby - 如果值不在另一个哈希中,则从循环中的哈希中删除值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51762867/

相关文章:

ruby-on-rails - 在 Ruby 中返回 true 或错误消息

ruby-on-rails - 如何获取八达通分片的数据库连接?

java - "Connected"UDP套接字接收ICMP端口不可达

linux - Docker:--ipc=主机和安全

ruby-on-rails - 如何使用 Devise 访问 "soft delete"用户

ruby - Nokogiri:如何解析文本片段?

linux - shell脚本中的top命令

android - adb pull 在 bash 脚本中的奇怪行为

linux - NFS 缓存清理命令?

ruby - RSpec 管道破裂