プログラムの比較 その2


今回は、hoge.txtの内容を以下の条件で置換し、その結果をhogehoge.txtに書き出すプログラムをPerlRubyPythonで書いてみた。

  • 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()


RubyPythonの場合、文末の場合、"<br>\n"を付け加えるために以下の処理だけをすると、何故か、<br>の部分がダブることになる。

# * Ruby *

gsub(/$/,"<br>\n")
# * Python *

line = re.sub("$","<br>\n",line)


調べてみてわかったのだが、どうやら、RubyPythonで処理すると、各行毎にEOFを付けてくれるみたいだ。そのため、正規表現の「$」では、文末を処理するのだが、これは、「改行コード」、「EOF」を目印にして処理しているそうだ。


そのため、改行コードとEOFがある場合、<br>がダブることになる。


これでは、都合がわるいので、改行コードを一度、削除し、文末の処理を行った後で、改行コードを加えるようにした。


ちなみに、Perlでは、問題なく処理できた。