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メソッドの練習問題になってしまった...