0

我在远程设备上有一个与此类似的文本文件:

 D0-23-DB-31-04-3E%20192.168.4.42%20dnat
 68-A8-6D-0C-38-B2%20192.168.4.40%20dnat

我创建了一个小的 Ruby 脚本来将其转换为字符串并将其发布到我的 Rails 应用程序:

 def chilli_list
  hash = File.open("/tmp/client_list", "rb").read
  return hash
 end

然后输出如下所示:

"D0-23-DB-31-04-3E%20192.168.4.42%20dnat\n68-A8-6D-0C-38-B2%20192.168.4.40%20dnat\n" 

我需要一点一点地提取信息并显示在视图中。到目前为止,我还没有走多远。我尝试了以下是可以的:

str = "D0-23-DB-31-04-3E%20192.168.4.42%20dnat\n68-A8-6D-0C-38-B2%20192.168.4.40%20dpass\n" 

str.each_line do |line|
  puts line.split(" ").first
  puts line.split(" ").second
end

这是最好的方法还是有更好的方法?

最后也是最重要的一点,我还需要对字符串进行一些计算。我可以用 来计算行数str.lines.count,但我需要的是计算上== nat例中第三个值所在的行数。

我该怎么办?

4

1 回答 1

2

首先,这里是如何从 HTML 编码转换回普通字符串:

require 'uri'
URI.decode('D0-23-DB-31-04-3E%20192.168.4.42%20dnat') # => "D0-23-DB-31-04-3E 192.168.4.42 dnat"

以下是将整个字符串分解为单独的解码行的方法:

"D0-23-DB-31-04-3E%20192.168.4.42%20dnat\n68-A8-6D-0C-38-B2%20192.168.4.40%20dnat\n".split("\n")
  .map{ |l| URI.decode(l) }

这导致 IRB 中的这个数组:

[
    [0] "D0-23-DB-31-04-3E 192.168.4.42 dnat",
    [1] "68-A8-6D-0C-38-B2 192.168.4.40 dnat"
]

添加.count{ |l| l[/ dnat$/] }到上一个命令的末尾,您将获得计数:

"D0-23-DB-31-04-3E%20192.168.4.42%20dnat\n68-A8-6D-0C-38-B2%20192.168.4.40%20dnat\n".split("\n")
  .map{ |l| URI.decode(l) }
  .count{ |l| l[/ dnat$/] }

哪个返回2

您也可以通过直接计算出现次数来简化整个过程'nat'

"D0-23-DB-31-04-3E%20192.168.4.42%20dnat\n68-A8-6D-0C-38-B2%20192.168.4.40%20dnat\n".scan('nat').count

这也返回2

于 2012-08-14T19:19:38.430 回答