Скрипт 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.