[Ruby & Python]コマンドライン引数を取得する

1 min読了の目安(約1200字TECH技術記事

今日、競技プログラミングの問題を初めて解きました。
ターミナルでプログラムを実行する際にコマンドライン引数の取得方法で出鼻を挫かれたのでここにまとめておきます。

コマンドライン引数とは

コマンドライン引数は、ターミナルでプログラムを実行する時に指定する引数のことです。
"言語名" "ファイル名"に続いて複数の引数をしてすることができます。

Pythonの場合

$ python noodle.py そば うどん

Rubyの場合

$ ruby noodle.rb そば うどん

この場合、"そば"が1つ目の引数、"うどん"が2つ目の引数となります。

コマンドライン引数の取得方法

ターミナルで引数を指定する記述は同じでしたが取得方法は言語で異なるようです。
ここではPythonとRubyを取り上げます。

Pythonの場合

Pythonでは標準ライブラリsysを使用します。

# noodle.py
import sys

file_name = sys.argv[0]
dish_1 = sys.argv[1]
dish_2 = sys.argv[2]

print(file_name)
print(dish_1)
print(dish_2)

argv(argument vector)はPythonスクリプトに渡されたコマンドライン引数のリストです。
注意すべき点はこのリストの一番初めの要素は実行されたファイル名が入ることです。

このファイルを実行すると以下の結果が得られます。

$ python noodle.py そば うどん
>> noodle.py
>> そば
>> うどん

Rubyの場合

Rubyでは、ARGVは組み込みライブラリのObjectクラスに属しています。
そのためライブラリを読み込むことなくコマンドライン引数を取得できます。

# noodle.py

dish_1 = ARGV[0]
dish_2 = ARGV[1]

p dish_1
p dish_2

p ARGV

実行結果

$ ruby noodle.rb そば うどん
>> そば
>> うどん
>> ["そば", "うどん"]

PythonのARGVと異なるのはファイル名を引数として含むか含まないかです。
Pythonのargv[0]にはファイル名が入りますが、Rubyは一つ目の引数が入ります。

SOTD

PythonとRubyどちらでもコードを書いて試してみると"ARGV"の中身が違うことに気づいて今回の記事を書きました。

ファイル名を含むのと含まないのではどちらがメジャーなのか?
他の言語のコマンドライン引数も気になるところです。