use strict; my $data_suffix = q[.dat]; my $data_dir_name = q[data/]; sub normalize ($) { my $s = shift; $s =~ s/\s+/ /g; $s =~ s/^ //; $s =~ s/ $//g; return $s; } # normalize sub create_pattern1 ($) { my $s = quotemeta shift; $s =~ s/\\\*/(.+)/g; return $s; } # create_pattern1 sub replace_pattern2 ($@) { my $s = shift; my @arg = @_; $s =~ s/\$(\d+)/$arg[$1 - 1]/g; return $s; } # replace_pattern2 sub load_data_file ($$$) { my ($data_file_name, $exact_data, $pattern_data) = @_; open my $data_file, '<:utf8', $data_file_name or die "$0: $data_file_name: $!"; local $/ = undef; my $data = <$data_file>; $data =~ s/\x0D?\x0A/\n/g; for (split /\n\n+(?=#)/, $data) { my ($en, $ja) = split /\n#ja\n/, $_; if ($en =~ s/^#en\n//) { $exact_data->{normalize ($en)} = $ja; } elsif ($en =~ s/^#pattern\n//) { $pattern_data->{create_pattern1 (normalize ($en))} = $ja; } } } # load_data_file sub for_each_data_file ($) { my ($code) = @_; opendir my $data_dir, $data_dir_name or die "$0: $data_dir_name: $!"; for (sort {$a cmp $b} readdir $data_dir) { next if /^\./; # hidden files next if /^_/; # editable but not-used files my $data_file_name = qq[$data_dir_name$_]; next unless $data_file_name =~ /\Q$data_suffix\E$/; $code->($data_file_name); } } # for_each_data_file 1;