【问题标题】:Ruby script to read file line by line and do if statments with puts?Ruby脚本逐行读取文件并使用puts执行if语句?
【发布时间】:2014-08-21 17:33:16
【问题描述】:

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

这是我尝试过的代码:

输入.txt:

SWITCH
ROUTER
FIREWALL
ROUTER
ROUTER
FIREWALL
SWITCH
SWITCH

Ruby 代码:

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 语句绑定了==,但它只显示第一行的结果,没有警告。

【问题讨论】:

    标签: ruby file if-statement line-by-line


    【解决方案1】:
    • 请正确缩进代码
    • 如错误消息所示,您必须使用== 而不是= 进行比较(= 是变量赋值)
    • type_equipment 末尾有一个换行符,您可以使用String#chomp 删除它
    • 条件将最后一个表达式作为返回值,因此您可以在 if 前面写一个 puts,而不是在块内重复它
    • 我建议使用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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 不,这只会输出 1 个结果:SWITCH,BMC_COMPUTERSYSTEM,Network,Switch,Ethernet Switch
      • 我不确定,但我通常会像这样遍历 ruby​​ 中的文件:alvinalexander.com/blog/post/ruby/…
      • 我认为它不起作用,因为type_equipment 末尾有一个换行符。
      • 你可以做 type_equipment.delete("\n")==var then
      • “我认为它不起作用,因为 type_equipment 末尾有一个换行符”。当从文件中读取记录时,foreach 去除尾随的换行符。
      【解决方案3】:

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

      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

      【讨论】:

        猜你喜欢
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 2015-07-27
        • 2011-05-22
        相关资源
        最近更新 更多