הכותרת קצת מטעה, אבל כאשר כותבים תוכנות בעיקר בעולם היוניקס, נהוג לתת אפשרויות בשורת הפקודה לתכנה. הבעיה היא כיצד ניתן לנתח את מה שעובר, ולשם כך רובי מגיעה עם ספרייה פשוטה בשם optparse המגיעה כספרייה סטנדרטית ברובי.
העבודה בה מאד פשוטה ומחביאה הרבה מאוד כוח נסתר. תכנית מאוד פשוטה המשתמשת בה, תראה כזו:
#!/usr/bin/env ruby
require 'optparse'
VERSION = '99.1b'
# default values for options ...
options = { :path => '', :number => 0, :uri => nil}
parse = OptionParser.new do|opt|
opt.banner = 'Usage: my_app.rb [option] [option]'
opt.on('-v', '--version', 'Display the program version') do
puts "my_app.rb v#{VERSION}"
end
opt.on('-p PATH', '--path=PATH', 'What path to use ?') do |path|
option[:path] = path
end
opt.on('-n=NUM', '--number NUM', Fixnum, 'Use numbers only') do |num|
option[:number] = num
end
opt.on('--uri URI', 'Mandatory field') do |uri|
option[:uri] = uri
end
opt.on('-h', '--help', 'Display this screen') do
puts opt
exit
end
end
begin
parse.parse!
raise OptionParser::MissingArgument if options[:uri].nil? # mandatory fields
rescue => e
$stderr.puts "You did not supply proper values: #{e.message}"
end
ההדגמה מבצעת מספר דברים אשר מראים את הכוח העצום של הספרייה ואת רוב היכולות שלה. אני מציג כיצד ניתן לקבל פרמטר צורך בערך. אני מציג כיצד ניתן להגיד איך לפרש פרמטר מול ערך (כלומר המפריד הוא רווח, הסימן = וכו'), אני מראה כיצד מציגים עזרה על הפרמטרים השונים, אני מציג כיצד להכריח את המפרש לקבל מספר שלם, ואני אפילו מתעסק במצב בו יש פרמטר שהוא חובה, אבל לא קיבלנו אותו.
חסרה כאן מילת מפתח:
השם המקובל בעולם של יוניקס למה שעושה את זה הוא getopt ע"ש הפונקציה המקורית (חלק מ-POSIX). יש לה גרסאות מורחבות בשפות שונות (בפרט מוסכמות יותר נוחות שהגיעו במקור מגנו).
getopt הוא מימוש אחד בלבד לעשות את זה, ולדעתי לא פשוט או נוח. הכלי הזה שהצגתי כאן, מאוד קריא וקל להתאמה בכל שלב שצריך, ועושה עבורך הרבה מאוד פעולות שאחרת היית צריך לממש בעצמך.
getopt הוא גם שם, לא רק מימוש. getopt המקורי מאוד מוגבל ולא נוח. getopt_long של גנו כבר פחות מוגבל אבל עוד פחות נוח לשימוש. בפרל יש getopt בסיסי וכמה גרסאות נוחות יותר במודולים שלמרבה הפלא מופצים כחלק מההפצה הראשית. בפייתון יש מודול בשם getopt.
למען האמת לפייתון יש בספריה הסטנדרטית שלושה מודלים שמטפלים בנושא:
getopt
http://docs.python.org/library/getopt.html
optparse
http://docs.python.org/library/optparse.html
והדור הבא, argparse שזמין החל מ-2.7 ו-3.x
http://docs.python.org/library/argparse.html