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