プログラムの比較 その2
今回は、hoge.txtの内容を以下の条件で置換し、その結果をhogehoge.txtに書き出すプログラムをPerl、Ruby、Pythonで書いてみた。
- 1行目の文頭には、<sub>、文末には、</sub>を入力する。
- すべての行の文末には、<br>を入力する。
- 3行目になったら、カウンターを1に戻し、処理を繰り返す。
#! /usr/local/bin/perl #******************************************************** # 置換プログラム (Perl版) #******************************************************** open (IN,"hoge.txt") || die "ファイルが見つかりませんでした。"; open (OUT,">hogehoge.txt"); $i = 1; while(<IN>){ if ( $i == 1 ) { s/^/<sub>/; s/$/<\/sub>/; } elsif ( $i == 3 ) { $i = 0; } s/$/<br>/; print OUT; $i = $i + 1; } close IN; close OUT;
#!/usr/bin/ruby #******************************************************** # 置換プログラム (Ruby版) #******************************************************** infile = open("hoge.txt") outfile = open("hogehoge1.txt","w") i = 1 while infile.gets if i == 1 then gsub(/^/,"<sub>") gsub(/\n/,"</sub>") elsif i == 3 i = 0 end gsub(/\n/,"") gsub(/$/,"<br>\n") outfile.print i = i + 1 end infile.close outfile.close
#! /usr/bin/env python # -*- coding: Shift_JIS -*- #******************************************************** # 置換プログラム (Python版) #******************************************************** import re infile=open(r"c:\usr\local\hoge.txt") outfile=open(r"c:\usr\local\hogehoge2.txt", "w") i = 1 for line in infile.readlines(): if i == 1: line = re.sub("^","<sub>",line) line = re.sub("\n","</sub>\n",line) elif i == 3: i = 0 line = re.sub("\n","",line) line = re.sub("$","<br>\n",line) outfile.write(line) i = i + 1 infile.close() outfile.close()
RubyとPythonの場合、文末の場合、"<br>\n"を付け加えるために以下の処理だけをすると、何故か、<br>の部分がダブることになる。
# * Ruby * gsub(/$/,"<br>\n")
# * Python * line = re.sub("$","<br>\n",line)
調べてみてわかったのだが、どうやら、RubyとPythonで処理すると、各行毎にEOFを付けてくれるみたいだ。そのため、正規表現の「$」では、文末を処理するのだが、これは、「改行コード」、「EOF」を目印にして処理しているそうだ。
そのため、改行コードとEOFがある場合、<br>がダブることになる。
これでは、都合がわるいので、改行コードを一度、削除し、文末の処理を行った後で、改行コードを加えるようにした。
ちなみに、Perlでは、問題なく処理できた。