0

我正在尝试编写一个脚本,该脚本将通过if在文本文件上使用语句来填写设备映射。

这是我尝试过的代码:

输入.txt:

SWITCH
ROUTER
FIREWALL
ROUTER
ROUTER
FIREWALL
SWITCH
SWITCH

红宝石代码:

IO.foreach("input.txt") do |type_equipment|
  if type_equipment = "SWITCH"
    puts "SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch"
  elsif type_equipment = "ROUTER"
    puts "ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router"
  elsif type_equipment = "FIREWALL"
    puts "FIREWALL,BMC_COMPUTERSYSTEM,Network,Appliance,Firewall"
  end
end

代码运行,但输出如下:

SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
main.rb:6: warning: found = in conditional, should be ==
main.rb:4: warning: found = in conditional, should be ==
main.rb:2: warning: found = in conditional, should be ==

我希望它评估文件中的每一行,如果它与if语句匹配,则输出关联的puts.

我还绑定了==forif语句,但它只显示第一行的结果,没有警告。

4

3 回答 3

3
  • 请正确缩进您的代码
  • 正如错误消息所暗示的,您必须使用==而不是=进行比较(=是变量赋值)
  • 末尾有一个换行符type_equipment,您可以使用String#chomp
  • puts条件将最后一个表达式作为返回值,因此您可以在前面写一个,if而不是在块内重复它
  • 我建议使用case而不是重复的if语句

这些建议将导致:

IO.foreach("input.txt") do |type_equipment|
  puts case type_equipment.chomp
    when "SWITCH"   then "SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch"
    when "ROUTER"   then "ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router"
    when "FIREWALL" then "FIREWALL,BMC_COMPUTERSYSTEM,Network,Appliance,Firewall"
  end
end
于 2014-08-21T18:03:57.750 回答
2
main.rb:6: warning: found = in conditional, should be ==

答案就在你面前。

比较您使用的两件事时var1==var2

var1=var2是一个赋值运算符,它设置的值var1等于 的值var2,所以你的代码应该是:

IO.foreach("input.txt") do |type_equipment|
if type_equipment == "SWITCH"
  puts "SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch"
 elsif type_equipment == "ROUTER"
  puts "ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router"
 elsif type_equipment == "FIREWALL"
   puts "FIREWALL,BMC_COMPUTERSYSTEM,Network,Appliance,Firewall"
  end
end
于 2014-08-21T17:40:30.750 回答
0

为了在添加新设备或停用现有设备时更容易维护您的代码,请考虑使用哈希:

hash = {"SWITCH" => "SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch",
        "ROUTER" => "ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router",
        "FIREWALL" => "FIREWALL,BMC_COMPUTERSYSTEM,Network,Appliance,Firewall"}

equipment =
"SWITCH
ROUTER
FIREWALL
ROUTER
PINGER
ROUTER
FIREWALL
SWITCH
SWITCH"

equipment.each_line do |l|
  equip = l.strip
  puts hash[equip] if hash.key?(equip)
end
  # SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
  # ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router
  # ...
  # SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch

或者,如果您愿意:

equipment.each_line do |l|
  equip = l.strip
  puts (hash.key?(equip) ? hash[equip] : "***What the heck is a '#{equip}'??")
end
  # SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
  # ...
  # ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router
  # ***What the heck is a 'PINGER'??
  # ROUTER,BMC_COMPUTERSYSTEM,Network,Router,Ethernet Router
  # ...
  # SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch

您可以使用String#chomp而不是String#strip,但我选择了后者,因为它会删除前后的所有空格以及换行符。从文件读取时,您将需要使用枚举器IO#foreach

于 2014-08-21T18:38:07.993 回答