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.

==forステートメントも関連付けましたifが、最初の行の結果のみが表示され、警告は表示されません。

4

3 に答える 3

2
main.rb:6: warning: found = in conditional, should be ==

答えは目の前にあります。

2 つのものを比較するときは、 を使用します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 に答える