読者です 読者をやめる 読者になる 読者になる

英単語の学習用スクリプトを作った

perl own-making

はじめに

最近は仕事、家事、プログラミング関連の読書、英単語、という四重奏で毎日が過ぎていきます。
なかでも仕事は心身ともにそれなりにハードで(当社比)、とくにメンタル的にきついのをプログラミングとか英語とかの全然関係ないことをすることでバランスとってる感じです。

そんな中、上記のように英単語を覚える、というのをダラダラやっていますが、ターミナル(というかiTerm2)に英単語が出てきて、それに回答を入れると正誤を判定してくれる、というスクリプトを、書こうと思えばif文とかで普通にできるんじゃないか、と思って英語の勉強よりそちらをやりたくなったので作ってみました。

久しぶりにGistに上げてみました。
英単語学習用のPerlスクリプト

すごいイナたい感じですが、一応用は足りてるのでまあヨシとしています。

使い方

任意のディレクトリで実行します。

$ perl english_words_lesson.pl

すごい長いファイル名ですが、手元ではewl.plとかにしています。

実行すると、こんなのが出てきます。
f:id:note103:20140527231940p:plain

Input a number or a word.

ということなので、番号を入れます。「55」とか。
f:id:note103:20140527232048p:plain
エンターを押すと単語が出てきます。これは単語リストのハッシュ「%english」の55行目ぐらいにあたります。(実際は多分56行目)
f:id:note103:20140527232630p:plain
「apologize」が出てきました。これって・・「謝罪」とかだっけ、と思って書き込みます。
f:id:note103:20140527232110p:plain
エンター!
f:id:note103:20140527232740p:plain
「NG!」だそうです。何だろ・・わからないな、ギブ!と思って今度は何も入力せずにエンター。
f:id:note103:20140527232749p:plain
「謝る、弁明する」か・・って合ってるじゃん!と思いますが、まあ一語一句合ってないと駄目、という仕様なので。

次、単語を入れてみます。「add」とか。
f:id:note103:20140527232803p:plain
エンター!
f:id:note103:20140527234548p:plain
「add」はここにあります(Here is 'add')、と出ます。つまり登録していない単語もあるので、そういう流れにしています(非登録の単語を入力するとその旨のエラーメッセージを出す)。

日本語で何? と出ているので(この英語も微妙ですが)「追加」と入れてみましょう。
f:id:note103:20140527232937p:plain
エンター!!
f:id:note103:20140527233111p:plain
またも「NG」です。いや、「追加」だと思うけど・・しょうがないのでギブします。
カラでエンター。
f:id:note103:20140527233002p:plain
「を加える」だそうでした。まあ、だから近い言葉とかは拾いません。

ということで、これを延々と繰り返します。
Gistには10語ぐらいしか載せていませんが、実際には現状1016語の英語&日本語の組み合わせを登録してあるので、けっこう楽しいです。

上では説明していませんが、数字(番号)の代わりに「s」を入力すると直近の単語がもう一度現れて復習できますし(sameのs)、「r」を押すとランダムな単語が出てきます。
「n」を押すと直近で出てきた次の番号のもの(next)が出てくるようにしていますが、基本的に番号順に出てきてほしいことが多いので答え合わせが終わった後にはわざわざ「n」を入力しなくてもエンターでどんどん次の登録単語が出てくるようにしています。(79行目あたり)

飽きた、疲れた、等でやめたいときには「q」か「d」を入力して、エンターします。(qは「quit」、dは押しやすいのと Ctrl+d のイメージで)
f:id:note103:20140527233126p:plain
Bye! と出ます。

展望

今後の目標というか楽しみとしては、今はひとつのPerlスクリプト(.pl)に単語のデータもコードも一緒くたにしてるので、これは分けた方がいいんじゃないか、とか。
あとは瑣末なことですが現状、日本語から英単語を逆引きできないとか(ハッシュのkeyからvalueを特定することはできるけどvalueからkeyを引っ張る方法がわからない)、あるいはさらに瑣末なことに、単語からそれに紐付いた番号を抽出できない(配列の添字から値を特定することはできるけど値から添字を抽出する方法がわからない)とかあるので、その辺も実装できると良さそうです。

ゆくゆくはデータベースを使ってWebアプリにするとか、あるいはiOSアプリにしてモバイル環境でも使えたりするとさらに楽しそうですが、ターミナルでサクサク動かせる楽しさを損なわずにそこまで出来たら大したものですね。できたら良いのですが。

そういえばその後、似たような方式で、日付を入れたらその曜日が出てくる、というスクリプトも作りました。
日付を入れて曜日を出すPerlスクリプト

これもまた単語同様、日付&曜日をハッシュのキー&バリューで設定していますが、このデータをどう扱えばカッコよくなるのか、というのが洗練のしどころの初めの一歩では、と考えています。