Я хочу заменить одну строку другим в Perl; оба имеют ту же длину. Я хочу заменить все случаи (нечувствительной к регистру) строки, но я хочу это, случай буквы будет сохранен. Таким образом, если первая буква была верхним регистром, первая буква после того, как замена будет верхним регистром также.
Например, если я хочу заменить "нечто" "панелью", таким образом, я хочу это
foo ==> bar
Foo ==> Bar
FOO ==> BAR
Существует ли простой способ сделать это в Perl?
Это может быть то, что вам нужно:
Как мне заменить регистр без учета регистра в LHS, сохранив регистр в RHS?
Это практически скопировано из приведенной выше ссылки:
sub preserve_case($$) {
my ($old, $new) = @_;
my $mask = uc $old ^ $old;
uc $new | $mask .
substr($mask, -1) x (length($new) - length($old))
}
my $string;
$string = "this is a Foo case";
$string =~ s/(Foo)/preserve_case($1, "bar")/egi;
print "$string\n";
# this is a Bar case
$string = "this is a foo case";
$string =~ s/(Foo)/preserve_case($1, "bar")/egi;
print "$string\n";
# this is a bar case
$string = "this is a FOO case";
$string =~ s/(Foo)/preserve_case($1, "bar")/egi;
print "$string\n";
# this is a BAR case
Вы знаете, что каждая строка имеет одинаковую длину, поэтому, в принципе, вы можете:
index = Pos(string, oldString)
for i = index to index + strlen(oldString)
if (oldString[i] >= 'a') && (oldString[i] <= 'z'')
string[i] = ToLower(newString[i])
else
string[i] = ToUpper(newString[i])0x20
Посимвольная проверка. Если значение ASCII символа попадает в значения ASCII верхнего регистра, замените его на верхний регистр, иначе на нижний регистр.