Я пишу крошечную программу, которая принимает пользовательский ввод с помощью Getops, и на его основе программа либо попытается сопоставить шаблон с каким-либо текстом, либо заменить текст на соответствующий.
У меня проблема в том, что я не могу заставить замещающую часть работать. Я смотрю на запись qr // на страницах man: http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators, но мне не повезло с этим. Я попытался смоделировать мой код точно так же, как документы в этом случае. Я компилирую шаблон соответствия и подставляю его в подстановку.
Может ли кто-нибудь указать, где я иду не так? (Не беспокойтесь о безопасности, это всего лишь небольшой скрипт для личного использования)
Вот что я смотрю:
if($options{r}){
my $pattern = $options{r};
print "\nEnter Replacement text: ";
my $rep_text = <STDIN>;
#variable grab, add flags to pattern if they exist.
$pattern .= 'g' if $options{g};
$pattern .= 'i' if $options{i};
$pattern .= 's' if $options{s};
#compile that stuff
my $compd_pattern = qr"$pattern" or die $@;
print $compd_pattern; #debugging
print "Please enter the text you wish to run the pattern on: ";
my $text = <STDIN>;
chomp $text;
#do work and display
if($text =~ s/$compd_pattern/$rep_text/){ #if the text matched or whatever
print $text;
}
else{
print "$compd_pattern on \n\t{$text} Failed. ";
}
} #end R FLAG
Когда я запускаю его с -r "/ matt /" -i и ввожу заменяющий текст 'matthew', в текст 'matt' произойдет сбой. Почему это?
РЕДАКТИРОВАТЬ:
Спасибо за ответы, ребята! Это было действительно очень полезно. Я объединил оба ваших предложения в рабочее решение проблемы. Я должен обрабатывать флаг / g немного по-другому. Вот рабочий образец:
if($options{r}){
my $pattern = $options{r};
print "\nEnter Replacement text: ";
my $rep_text = <STDIN>;
chomp $rep_text;
#variable grab, add flags to pattern if they exist.
my $pattern_flags .= 'i' if $options{i};
$pattern_flags .= 's' if $options{s};
print "Please enter the text you wish to run the pattern on: ";
my $text = <STDIN>;
chomp $text;
#do work and display
if($options{g}){
if($text =~ s/(?$pattern_flags:$pattern)/$rep_text/g){ #if the text matched or whatever (with the g flag)
print $text;
}
else{
print "$pattern on \n\t{$text} Failed. ";
}
}
else{
if($text =~ s/(?$pattern_flags:$pattern)/$rep_text/){ #if the text matched or whatever
print $text;
}
else{
print "$pattern on \n\t{$text} Failed. ";
}
}
} #end R FLAG