in reply to Case-sensitive substitution with case-insensitive matches

Another solution, if all words can be put in a hash (escaping any special regex characters):
#!/usr/local/bin/perl -l -w use strict; my %repl_words = (sadboy=>'badboy', sadgirl=>'badgirl'); my $re = join('|', keys %repl_words); $re = qr/$re/i; my $str = "this SadBoy and SadGirl are..."; $str =~ s/($re)/fix_case($1, $repl_words{lc($1)})/eg; print $str; sub fix_case { my $match_word = shift; my $replace_word = shift; my $i = 0; for (split '', $match_word) { next if $_ eq lc; substr($replace_word, $i, 1) = uc substr($replace_word, $i, 1); } continue { $i++ } return $replace_word; }

Replies are listed 'Best First'.
Re: Re: Case-sensitive substitution with case-insensitive matches
by snax (Hermit) on Dec 02, 2000 at 20:56 UTC
    runrig, I feel like an idiot :)

    Below I offered what I thought was a different perspective on this problem, then I realized I had redone your solution. Ooops.

    I would, however, suggest that your solution could be improved by using split and join as follows:

    #!/usr/local/bin/perl -l -w use strict; my $str = "SAdBoy"; $str =~ s/($str)/fix_case($1, 'badgirl')/eig; print $str; sub fix_case { my ($match_word, $replace_word) = @_; my @rep = split //, $replace_word; my $i = 0; for (split '', $match_word) { $rep[$i] = $_ eq lc($_) ? lc($rep[$i++]) : uc($rep[$i++]); } return join '', @rep; }
    I also tossed in a lc() so that capitalization in the $replace_word doesn't "contaminate" the pattern in the $match_word.

    I offer this because I am of the impression that using substr that often is somewhat expensive.