Ruby脚本逐行读取文件并使用puts执行if语句?

Posted

技术标签:

【中文标题】Ruby脚本逐行读取文件并使用puts执行if语句?【英文标题】:Ruby script to read file line by line and do if statments with puts? 【发布时间】: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 语句绑定了==,但它只显示第一行的结果,没有警告。

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于Ruby脚本逐行读取文件并使用puts执行if语句?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ruby 逐行读取、编辑和写入文本文件

使用for循环bash脚本逐行读取文件[重复]

Linux shell脚本流程控制

python 逐行读取txt文件里的词, 并反复搜索 如何实现?

Ruby文件的输入与输出

shell ps -ef命令逐行读取