Opdrachtregelopties parseren op de Ruby Way (OptionParser)

Ruby is uitgerust met een krachtig en flexibel hulpmiddel om opdrachtregelopties, OptionParser, te parseren. Als je eenmaal hebt geleerd hoe je dit kunt gebruiken, zul je nooit meer handmatig door ARGV gaan kijken. OptionParser heeft een aantal functies die het behoorlijk aantrekkelijk maken voor Ruby-programmeurs. Als je ooit opties handmatig hebt ontleed in Ruby of C, of ​​met de getoptlong C-functie, u zult zien hoe welkom sommige van deze wijzigingen zijn.

  • OptionParser is DROOG. U hoeft alleen de opdrachtregeloptie, de bijbehorende argumenten, de code die moet worden uitgevoerd wanneer deze wordt aangetroffen, en de opdrachtregeloptiebeschrijving eenmaal in uw script te schrijven. OptionParser genereert automatisch hulpschermen voor u uit deze beschrijving, en leidt alles over het argument af uit de beschrijving. Hij zal bijvoorbeeld de --bestand [BESTAND] optie is optioneel en neemt een enkel argument. Ook zal het dat weten --[-No] -verbose is echt twee opties en accepteert beide vormen.
  • OptionParser converteert opties automatisch naar een specifieke klasse. Als de optie een geheel getal gebruikt, kan elke tekenreeks die op de opdrachtregel wordt doorgegeven, een geheel getal omzetten. Dit vermindert een deel van de verveling die betrokken is bij het parseren van opdrachtregelopties.
  • Alles is erg ingesloten. Alle opties bevinden zich op dezelfde plaats en het effect van de optie bevindt zich direct naast de definitie voor de optie. Als er opties moeten worden toegevoegd, gewijzigd of iemand gewoon wil zien wat ze doen, is er maar één plek om te kijken. Nadat de opdrachtregel is geparseerd, bevat een enkele Hash of OpenStruct de resultaten.

Laat me al wat code zien

Dus hier is een eenvoudig voorbeeld van hoe te gebruiken OptionParser. Het maakt geen gebruik van de geavanceerde functies, alleen de basis. Er zijn drie opties, waarvan er één een parameter heeft. Alle opties zijn verplicht. Daar zijn de -v / - verbose en -q / - quick opties, evenals de -l / - logbestand BESTAND optie. Bovendien neemt het script een lijst met bestanden op, onafhankelijk van de opties.

 #! / usr / bin / env ruby

 # Een script dat het formaat van een aantal afbeeldingen zal wijzigen

 vereisen 'optparse'

 

 # Deze hash bevat alle opties

 # ontleed vanaf de opdrachtregel door

 # OptionParser.

 options = 

 

 optparse = OptionParser.new do | opts |

   # Stel een banner in, bovenaan weergegeven

   # van het helpscherm.

   opts.banner = "Gebruik: optparse1.rb [opties] file1 file2 ..."

 

   # Definieer de opties en wat ze doen

   options [: verbose] = false

   opts.on ('-v', '--verbose', 'Output more information') doen

     options [: verbose] = true

   einde

 

   options [: quick] = false

   opts.on ('-q', '--quick', 'De taak snel uitvoeren') doen

     options [: quick] = true

   einde

 

   options [: logfile] = nul

   opts.on ('-l', '--logfile FILE', 'Log naar FILE schrijven') do | file |

     options [: logfile] = bestand

   einde

 

   # Dit toont het helpscherm, alle programma's zijn

   # werd verondersteld deze optie te hebben.

   opts.on ('-h', '--help', 'Dit scherm weergeven') doen

     zet opts

     Uitgang

   einde

 einde

 

 # Parseer de opdrachtregel. Onthoud dat er twee vormen zijn

 # van de ontleedmethode. De methode 'ontleden' ontleedt eenvoudig

 # ARGV, terwijl de 'ontleden!' methode ontleedt ARGV en verwijdert

 # alle opties die daar zijn gevonden, evenals parameters voor

 # de opties. Wat overblijft is de lijst met bestanden waarvan het formaat moet worden gewijzigd.

 optparse.parse!

 

 zet "Wordt uitgebreid" als opties [: uitgebreid]

 zet "Snel zijn" als opties [: snel]

 zet "Loggen naar bestand # options [: logbestand]" als options [: logbestand]

 

 ARGV.each do | f |

   zet "Formaat wijzigen van afbeelding # f ..."

   slaap 0,5

 einde

Onderzoek van de code

Om te beginnen met de optparse bibliotheek is verplicht. Vergeet niet dat dit geen juweeltje is. Het wordt geleverd met Ruby, dus het is niet nodig om een ​​edelsteen te installeren of te vereisen rubygems voordat optparse.

Er zijn twee interessante objecten in dit script. De eerste is opties, verklaard in de topscope. Het is een eenvoudige lege hash. Wanneer opties zijn gedefinieerd, schrijven ze hun standaardwaarden naar deze hash. Het standaardgedrag is bijvoorbeeld voor dit script niet wees uitgebreid, dus opties [: verbose] is ingesteld op false. Wanneer opties worden aangetroffen op de opdrachtregel, wijzigen ze de waarden in opties om hun effect te weerspiegelen. Bijvoorbeeld wanneer -v / - verbose wordt aangetroffen, wordt er true toegewezen aan opties [: verbose].

Het tweede interessante object is optparse. Dit is de OptionParser object zelf. Wanneer u dit object construeert, geeft u het een blok door. Dit blok wordt tijdens de bouw uitgevoerd en zal een lijst met opties in interne datastructuren samenstellen en zich voorbereiden om alles te ontleden. In dit blok gebeurt alle magie. U definieert hier alle opties.

Opties definiëren

Elke optie volgt hetzelfde patroon. U schrijft eerst de standaardwaarde in de hash. Dit zal gebeuren zodra de OptionParser is gebouwd. Vervolgens noem je de Aan methode, die de optie zelf definieert. Er zijn verschillende vormen van deze methode, maar hier wordt er maar één gebruikt. Met de andere formulieren kunt u automatische typeconversies en waardenreeksen definiëren waartoe een optie beperkt is. De drie argumenten die hier worden gebruikt, zijn de korte vorm, de lange vorm en de beschrijving van de optie.

De Aan methode zal een aantal dingen afleiden uit de lange vorm. Een ding is wil is de aanwezigheid van parameters. Als de optie parameters bevat, worden deze als parameters aan het blok doorgegeven.

Als de optie wordt aangetroffen op de opdrachtregel, wordt het blok doorgegeven aan de Aan methode wordt uitgevoerd. Hier doen de blokken niet veel, ze stellen alleen waarden in de opties-hash in. Er kan meer worden gedaan, zoals controleren of een bestand waarnaar wordt verwezen, enz. Bestaan. Als er fouten zijn, kunnen uitzonderingen op deze blokken worden gemaakt.

Ten slotte wordt de opdrachtregel ontleed. Dit gebeurt door de parse! methode op een OptionParser voorwerp. Er zijn eigenlijk twee vormen van deze methode, parse en parse!. Zoals de versie met het uitroepteken al aangeeft, is deze destructief. Het parseert niet alleen de opdrachtregel, maar verwijdert ook alle gevonden opties ARGV. Dit is een belangrijk ding, het laat alleen de lijst met bestanden achter na de opties in ARGV.