うん, なんかできたっぽい.
#!/usr/bin/perl
use strict;
use 5.016;
use feature 'say';
sub readConversion {
my ($fh) = @_;
my %conversion_pairs;
while (<$fh>) {
chomp;
my ($pattern, @replace) = split /,/;
$conversion_pairs{$pattern} = \@replace;
}
%conversion_pairs;
}
sub convert_ {
my ($pairs, $patterns, $conversions, $active_patterns, @sources) = @_;
my ($pattern_head, @pattern_rest) = @$patterns;
my %conversions = %$conversions;
my @active_patterns = @$active_patterns;
my @result;
if (defined $pattern_head) {
@result = convert_($pairs, \@pattern_rest, \%conversions, \@active_patterns, @sources);
push @active_patterns, $pattern_head;
for my $pattern (@{$pairs->{$pattern_head}}) {
$conversions{$pattern_head} = $pattern;
push @result, convert_($pairs, \@pattern_rest, \%conversions, \@active_patterns, @sources);
}
} else {
if (@active_patterns) {
my $pattern = join '|', map { quotemeta } @active_patterns;
@result = map { s/($pattern)/$conversions{$1}/gr; } @sources;
} else {
@result = @sources;
}
}
@result;
}
sub convert {
my ($pairs, @sources) = @_;
my @conversion_patterns = sort { length $b <=> length $a } keys %$pairs;
convert_($pairs, \@conversion_patterns, {}, [], @sources);
}
my %conversion_pairs = readConversion *DATA;
chomp (my $line = <>);
my @results = convert(\%conversion_pairs, $line);
for my $result (@results) {
say $result;
}
__DATA__
1,A,Z
2,B
3,C
123,Z
23,D
32,WXY,HIJ
お礼
出来ました!理想とするプログラムができあがって理解することも出来ました。 長々とお付き合いありがとうございました。 ケース2にしたかった理由は、変換される文字より変換後の文字の方が少なかったので、 テキストファイルが見やすくなると思ったのです。 ですが、作ってみると、ケース1の方が便利な理由が出来たので、このまま行きます。 本当にありがとうございました。 他の方も回答してくださっているようなので、そちらの方も勉強してみようと思います!