ファイルへの書き込みの代わりにコマンドを起動して、そこに データを渡してみよう。
sushi.rbでは、請求金額を画面表示していた。これ を郵送(電子メイルだが)するようにしてみよう。これには、結果表示していた
print "おあいそでガス\n"
printf("全部で %d 円でガス。まいどっ\n", sum)
の部分の出力先を変えるだけでよい。
電子メイルを送るためには、Mail コマンドを利用する。
Mail コマンドは
% Mail -s "サブジェクト" 宛先アドレス
のように起動すると、指定した「サブジェクト」のメイルを 「宛先アドレス」宛に送ってくれる。ただし、電子メイルでは 漢字コードとしてJISコードを利用しなければならない。 101教室のRubyプログラム環境ではEUCコードを利用しているので、これを JISコードに変換してMailコマンドに渡す必要がある。
Rubyには漢字コードを変換してくれるモジュール(プログラムの部品)がつい ている。ある漢字(日本語)文字列の文字コードを変換するには Kconv モジュー ルを利用する。使い方は以下のとおり。
require 'kconv' # プログラムの先頭付近に置く : jis_string = Kconv::tojis(old_string) # JISに変換 euc_string = Kconv::toeuc(old_string) # EUCに変換 sjis_string = Kconv::tosjis(old_string) # SJISに変換
sushi.rbプログラムの修正出力をファイルではなくコマンドにしてみよう。元のプログラムで
print "おあいそでガス\n"
printf("全部で %d 円でガス。まいどっ\n", sum)
となっていた部分を、ファイルへの書き出しに変更する場合は
open("price.out", "w") do |pr|
pr.print "おあいそでガス\n"
pr.printf("全部で %d 円でガス。まいどっ\n", sum)
end
とすればよい。これをメイル送信コマンドに変更するには、開くファイル名
のところをコマンド名に変えてさらに "| " を前置すればよい。
たとえば以下のようになる。
require 'kconv'
print "どの宛先に送る(間違っちゃだめよ!)?: "
address = gets.chomp! # メイルアドレスを入力
command = "| Mail -s 'Price' " + address # Mail -s 'Price' 宛先アドレス
open(command, "w") do |mail|
mail.print Kconv::tojis("おあいそでガス\n")
message = sprintf("全部で %d 円でガス。まいどっ\n", sum)
mail.print Kconv::tojis(message)
end
sprintfメソッドは、printfで
出力される結果を「文字列」として返すだけで実際には出力しない。これを
message 変数に保存しておいて、それを次の行でJISコードに変換
し、さらにそれをMailコマンドに送出している。
完成したプログラムは次のようになる。
#!/usr/koeki/bin/ruby
require 'kconv'
sum = 0
menu = []
name = []
price = []
i = 0
open("price.txt", "r") do |neta| # price.txtを読み込みモードで開く
while line = neta.gets # ファイルから1行ずつ読む
if /(\w+)\s+(\d+)円/e =~ line # (数字)円 というパターンがあれば
menu[i] = $1 # $1 は商品名
price[i] = $2.to_i # $2 が「数字」に当てはまるので整数化
printf("%3d %s", i, line) # 商品番号と、読み込んだ行を画面表示
end
i += 1
end
end
while true
print "御注文は(番号で入れてね、q で終了)?: "
line=gets.chomp! # ユーザの入力を line に入れる
if line == "q" # q なら
break # 終了
end
number = line.to_i # 整数(メニュー番号)にする
if number < 0 || number >= i
puts "そんなメニューねぇでガス"
redo
end
printf("はぁ〜い、「%s」一丁\n", menu[number])
sum += price[number]
end
print "どの宛先に送る(間違っちゃだめよ!)?: "
address = gets.chomp! # メイルアドレスを入力
command = "| Mail -s 'Price' " + address # Mail -s 'Price' 宛先アドレス
open(command, "w") do |mail|
mail.print Kconv::tojis("おあいそでガス\n")
message = sprintf("全部で %d 円でガス。まいどっ\n", sum)
mail.print Kconv::tojis(message)
end
使用しているマシンから 電子メイルを送る設定がされている場合は 実際に送信実験してみよう。実行時には自分のメイルアドレスを入れる。
% ./sushi2.rb : : (注文を繰り返す) : : 御注文は(番号で入れてね、q で終了)?: q どの宛先に送る(間違っちゃだめよ!)?: 自分のメイルアドレス