#高速化のために、まず釈文を行単位に読み込む時に、それを全て一つの文字列変数(例えば$string)に格納し、それから「my @character = split(//.$string)」で字単位に分解した上で、foreachループで既出文字の照合を一括して行うべし。さらに句読点削除には、スペースなども一括して「\s」で削除すべし #基礎設定 use strict; use warnings; use utf8; use Encode qw/encode decode/; #入力と出力ファイルを開く my $file1 = 'in.txt'; open my $fh1, '<', $file1 or die "Can't open $file1:$!"; my $file2 = 'Mojiichiran.txt'; open my $fh2, ">>", $file2 or die "Can't open $file2:$!"; #基礎変数を定義 my $line1 = ""; my $position =""; my $moji = ""; my $ichiran = ""; #入力ファイル(Liya-shakumon.txt)を行単位に読み込む while ($line1 = <$fh1>) { $line1 =decode('utf8', $line1); $line1 =~ s/\?//; $line1 =~ s/\r//; $line1 =~ s/\n//; #句読点を削除する while ($line1 =~ s/[()。,、:;-〼□?\d\+\-abc\(\)]//) { } #本文と既抽出文字との逐次照合 foreach $position (0..length($line1)) { $moji = substr($line1, $position, 1); unless ($ichiran =~ /$moji/){ $ichiran .= $moji."\n"; } } } print $fh2 encode('utf8', $ichiran); close $fh1; close $fh2;