Piszę malutki program, który pobiera dane użytkownika za pomocą Getops, i na jego podstawie program spróbuje dopasować wzór do jakiegoś tekstu lub zastąpić tekst tym, co pasuje.Perl qr // i podstawienie
Problem polega na tym, że nie mogę uruchomić części zastępczej. Patrzę na wpis qr // na stronach man: http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators, ale nie mam z tym szczęścia. Próbowałem modelować mój kod dokładnie tak, jak dokumenty w tym przypadku. Kompiluję wzór dopasowania i zastępuję go zamiennikiem.
Czy ktoś może wskazać, gdzie się źle wybieram? (Nie martw się o bezpieczeństwo zbyt dużo, to tylko mały skrypt do użytku osobistego)
Oto czego szukam w:
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 [email protected];
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
Kiedy uruchamiam go z -r „/ mat/"-i, i wprowadź tekst zastępczy" matthew ", na tekście" matowy ", to się nie powiedzie. Dlaczego to?
EDYTOWANIE:
Dzięki za odpowiedzi chłopaki! To było naprawdę bardzo pomocne. Połączyłem obie twoje sugestie w działające rozwiązanie tego problemu. Muszę obsługiwać flagę/g trochę inaczej. Oto próbka robocza:
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
Ahh, bardzo dobre z '(? opts: pat) '. Zawsze zapominam, że możesz to zrobić. – chaos