gpt4 book ai didi

regex - Perl QR//和替代

转载 作者:行者123 更新时间:2023-12-04 13:15:23 24 4
gpt4 key购买 nike

我正在编写一个小程序,该程序使用Getops来接受用户输入,并且基于该程序,该程序将尝试将模式与某些文本进行匹配,或者将文本替换为匹配的文本。

我遇到的问题是我无法让替换部分正常工作。我正在看手册页中的qr//条目: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运行它,并在文本'matt'上输入替换文本'matthew'时,它失败了。为什么是这样?

编辑:

谢谢你们的答案!那真的很有帮助。我将您的两个建议合并为一个可行的解决方案。我必须稍微不同地处理/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

最佳答案

困惑指出,使用qr//会遇到一些困难。您是否真的需要预编译模式?如果没有,那么这样的策略可能会起作用:

my $pattern      = 'matt';
my $text = 'Matt';
my $rep_text = 'Matthew';
my $pattern_opts = 'i';

print $text, "\n" if $text =~ s/(?$pattern_opts:$pattern)/$rep_text/;

更新以响应您的新代码:您可以考虑使用如下方法:
my ($orig, $patt, $rep, $flags) = qw(FooFooFoo foo bar ig);

my $make_replacement = $flags =~ s/g// ?
sub { $_[0] =~ s/(?$flags:$patt)/$rep/g } :
sub { $_[0] =~ s/(?$flags:$patt)/$rep/ }
;

if ( $make_replacement->($orig) ){
print $orig;
}
else {
print "Failed...";
}

关于regex - Perl QR//和替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com