2010-10-02 58 views
4

使用OptionParser進行字符串參數輸入和散列分配。讀入單個參數的多個變量的最佳方法是什麼?然後,我如何將這些分配給一個哈希引用?以下是我迄今爲止:Ruby:OptionParser:字符串Arg&Hash作業

large_skus = Hash.new 
small_skus = Hash.new 

OptionParser.new do |opts| 

opts.on("-b", "--brands bName1,bName2,bNameN", String, "Check specific brands by name") do |b| 
options[:brands] = b.split(",") 
end 

opts.on("-l", "--large lSku1,lSku2,lSkuN", String, "Large SKUs - List CSVs") do |l| 
options[:large_skus] = l.split(",") 
##For each sku given 
brandName = options[:brands] 
large_skus[brandName] = l[$sku].to_i 
## 
end 

opts.on("-s", "--small sSku1,sSku2,sSkuN", String, "Small SKUs - List CSVs") do |s| 
options[:small_skus] = s.split(",") 
##For each sku given 
brandName = options[:brands] 
small_skus[brandName] = s[$sku].to_i 
## 
end 

end.parse!(ARGV) 

回答

5

鑑於輸入:

ruby test.rb --brands bName1,bName2,bNameN --large lSku1,lSku2,lSkuN --small wQueue1,wQueue2,wQueueN 

此代碼

#!/usr/bin/env ruby 

require 'ap' 
require 'optparse' 

options = {} 
OptionParser.new do |opts| 

    opts.on("-b", "--brands bName1,bName2,bNameN", Array, "Check specific brands by name") do |b| 
    options[:brands] = b 
    end 

    opts.on("-l", "--large lSku1,lSku2,lSkuN", Array, "Large SKUs - List CSVs") do |l| 
    options[:large_skus] = l 
    end 

    opts.on("-s", "--small wQueue1,wQueue2,wQueueN", Array, "Small SKUs - List CSVs") do |s| 
    options[:small_skus] = s 
    end 

end.parse!(ARGV) 

ap options 

產生這樣的輸出:

{ 
     :brands => [ 
     [0] "bName1", 
     [1] "bName2", 
     [2] "bNameN" 
    ], 
    :large_skus => [ 
     [0] "lSku1", 
     [1] "lSku2", 
     [2] "lSkuN" 
    ], 
    :small_skus => [ 
     [0] "wQueue1", 
     [1] "wQueue2", 
     [2] "wQueueN" 
    ] 
} 

注意,而不是使用每種類型的字符串選項,我使用Array。這讓OptionParser可以將元素解析爲一個數組。從這一點來看,你要怎麼處理數組元素。

+0

明白了,數組是一個很好的選擇。那散列分配呢?我更新了我原來的帖子,我注意到了一些錯別字(隊列與sku)。我的想法是,我不必通過索引號迭代小型或大型sku陣列來查找它們的匹配/關聯品牌。 – user453366 2010-10-03 22:59:48

+0

根據您的示例代碼,您嘗試執行的操作並不明顯。你的代碼有缺失的變量($ sku),你不能解釋你對large_skus和small_skus哈希的意圖。 – 2010-10-04 03:05:36

4

我認爲你正在接近這個錯誤的方式。你希望你的用戶必須跟蹤他們輸入的參數的順序,但你不想在代碼中自己做!

怎麼樣你不問任何人跟蹤什麼用什麼去,使其明確:

ruby test.rb --input bName1,lSku1,wQueue1 --input bName2,lSku2,wQueue2 --input bNameN,lSkuN,wQueueN 

代碼:

opts.on("--input <brand,Large_Skus,Small_Skus>", "input description", 
     "NOTE: Can be used more than once.") do |opt| 
    list = opt.split(',') 
    unless list.lenght == 3 
    raise "some error because you didn't place all arguments" 
    end 
    options[:input].push list 
end 

結果:

[ [ 'bName1', 'lSku1', 'wQueue1' ], 
    [ 'bName2', 'lSku2', 'wQueue2' ], 
    [ 'bNameN', 'lSkuN', 'wQueueN' ] ] 
相關問題