Скрипт Ruby для чтения файла строка за строкой и делает ли настройки с путами?

Я пытаюсь написать сценарий, который будет заполнять карту оборудования с помощью if отчёты в текстовом файле.

Вот код, который я пробовал:

input.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,

Я также связал == для if операторы, но он отображает результат только для первой строки без предупреждений.

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
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

Чтобы упростить поддержку кода при добавлении нового оборудования или удалении существующего, рассмотрите использование хэша:

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.

Другие вопросы по тегам