PerlとRubyがくしゅう帳

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_です。 最近は主にPerl関連の勉強会やコミュニティに参加しています。

perl入学式第7回に参加しました。

今回は、mapとgrep関数の操作、正規表現についての講義でした。
テキストはこちら。→perl入学式第7回テキスト

最終問題は宿題となったので、スクリプトを書いてみました。

スクリプトと同じディレクトリにある、price.txtの値段表を読み込み、金額を消費税を上乗せした金額に変更し、 price+.txtを作成しそこへ書き込むコードです。


use strict;
use warnings;
use utf8;

use open ":utf8";
binmode STDIN,":encoding(UTF-8)";
binmode STDOUT,":utf8";
binmode STDERR,":utf8";

my $fh;
open $fh,"<","price.txt";

my @line = <$fh>;
close $fh;

my %hash;
my $key;
my $val;
for my $item (@line){
    chomp(($key,$val) = split(":",$item));
    $val =~ s/円//;
    $hash{$key} = $val;
}
   
map{$_ = $_*1.05}values %hash;
open $fh,">","pricenew.txt";

while(my($key,$val) = each(%hash)){
    print $fh "${key}:${val}円\n";

}
close $fh;

ファイルの読み書きをすっかり忘れていたので、過去のテキストで再復習。
map,grep,正規表現があまり使えて無いコードだけど、これでいいのかな?


で、お約束のRubyでもコードを書いてみました。

array = Array.new
hash = Hash.new

File.open("price.txt","r:encoding(UTF-8)") do |io|
    while (string = io.gets) do
        array << string.chomp.sub(/円/,'').split(/:/)
    end
end

array.each do |key,val|
    hash[key] = val.to_i
end

File.open("price+.txt","w+:encoding(UTF-8)") do |io|
    hash.each do |key,val|
        io.puts "#{key}:#{val*1.05}円\n"
    end
end

Rubyでは、ハッシュオブジェクトのmap!メソッドでは、ハッシュの中身を置き換えた配列を返してしまう様で、map!は使いませんでした(笑) 

ファイルの読み書きと配列、ハッシュのeachメソッドの練習問題になってしまった... 

Perl入学式第三回補講に行ってきました。

perl入学式

今回は補講ということで、小ぢんまりとした少人数での勉強会。
ほぼマンツーマンで質問もしやすく、色々と勉強になりました。


資料を読みながら、前回の復習とサンプル例題のコーディング。
一番最初のサンプルコードをエディタで打ち込み、ターミナルで実行。=>エラー

あれ?何が間違ってるんだろう?

よく見てみると、

>ruby sample.pl

いつもの癖で、Perlのコードをrubyで実行してました。そりゃ動かんわな。

講義の内容はすごく分かりやすく、色々なアドバイスも勉強になりました。
家に帰ってから、Perlで書いた例題をRubyでコーディングしてみました。

数字を入力して、式と答えを出力するコード
array = Array.new
puts("数字を10個入力して下さい>>>")
10.times do
array.push($stdin.gets.chomp.to_i)
end

num = 0
array.each do |item|
num += item
end

array.collect! do |item|
item = item.to_s + "+"
end

print(array.to_s.chop,"=",num,"\n")

文字当てゲームのコード
array = Array.new
anser = "ruby"

print("文字を入力して下さい>>>")
str = $stdin.gets.chomp
while anser != str 
print("不正解です。もう一度文字を入力して下さい。>>>")
array.push("'"+str+"',")
str = $stdin.gets.chomp
end

print("正解です!正解するまでに",array.size,"回の入力を必要としました。\n")
print("正解までに入力した文字列は、#{array.each {|item| item }}".chop,"です!\n")

 

今回Rubyで気づいたことは、Rubyにはインクリメントが無いんですね。
色々調べてみると、Rubyは超オブジェクト指向の言語なんで、何かするにはメソッド、そしていわゆるインクリメントは変数に対しての加算であったり減算なので、変数はオブジェクトでは無いから変数に対するメソッドは無い、だからインクリメントやデクリメントが無いそうです。

なるほど、納得です。不便だけど。

次週もPerl入学式#4出席予定。両方の構文が頭の中で混乱!ぱっと見た感じ似たようなPerlとRuby、でも、それぞれの記法の差がそれぞれの文化というか、考え方の違いそのものの様に感じました。

う〜ん、面白い。

3月も今日で終わり。

Rubyの勉強、まだまだ頑張ります!

さて、今日のお題は入力した文字列を逆さまにするプログラム。

Reverse Sequence
 

コードの要素は、入力と出力、そして文字を逆さまに並べるルーチン。

配列を使って、そんなに悩まずに書けました。


araay = ARGV[0].split(/\s/)
array2 = Array.new
i = array.size - 1
while i<0 do
aaray2[array2.size] = array[i]
i -= 1
end
print(array2)

こんな感じかな。

このページのトップヘ