2010-10-02 5 views
4

Utilisation d'OptionParser pour l'entrée d'argument de chaîne et l'affectation de hachage. Quelle est la meilleure façon de lire plusieurs variables pour un même argument? Comment puis-je les affecter à un hachage à référencer? Voici ce que j'ai jusqu'à présent:Ruby: OptionParser: Chaîne Arg & Hash Assignment

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) 

Répondre

5

Étant donnée une entrée:

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

Ce code

#!/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 

produit cette sortie:

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

Notez qu'au lieu d'utiliser des types de chaîne pour chaque option, j'utilise Array. Cela permet à OptionParser de faire la lourde tâche d'analyser les éléments dans un tableau. À partir de là, c'est à vous de décider ce que vous faites avec les éléments du tableau.

+0

ENTENDU , les tableaux sont une bonne option. Qu'en est-il de l'assignation de hachage? J'ai mis à jour mon post original, j'ai remarqué quelques fautes de frappe (file d'attente contre sku). L'idée étant que je n'aurais pas à itérer les petits ou grands tableaux sku par numéro d'index pour trouver leur marque correspondante/associée. – user453366

+0

Ce n'est pas vraiment évident ce que vous essayez de faire en fonction de votre exemple de code. Votre code a des variables qui manquent ($ sku) et vous n'expliquez pas votre intention avec les hachages large_skus et small_skus. –

4

Je pense que vous vous approchez de la mauvaise façon. Vous voulez que vos utilisateurs gardent une trace de l'ordre des paramètres qu'ils saisissent mais vous ne voulez pas le faire vous-même dans le code!

Que diriez-vous que vous ne demandez pas que quiconque de garder une trace de ce qui se passe avec quoi et rendre explicite:

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

code:

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 

Résultat:

[ [ 'bName1', 'lSku1', 'wQueue1' ], 
    [ 'bName2', 'lSku2', 'wQueue2' ], 
    [ 'bNameN', 'lSkuN', 'wQueueN' ] ]