【发布时间】:2020-02-28 18:14:51
【问题描述】:
我正在使用 Perl 对 html sn-p 进行一些正则表达式替换操作。
这就是我匹配想要的部分的方式:(class="p_hw"><a href=")(http://[^<>"]*?xxxx\.com\/[^<>"]*[=/])([^<>"]*)(">(?:<b>)?)(.*?)(?=<)
我需要用entry:// 替换http:// 后跟http url 的某些参数值($3 就此而言)如果该值存在于哈希中(%hw_f),否则第一个单词来自$5 的(或短语)将在它存在于%hw_f 时使用。如果所有条件都不匹配,sn-p 将保持不变。
我尝试了以下方法:
s#(class="p_hw"><a href=")(http://[^<>"]*?xxxx\.com\/[^<>"]*[=/])([^<>"]*)(">(?:<b>)?)(.*?)(?=<)#
my @n = split(/\,|;/, $5);
my @m = map {s,^\s+|\s+$,,mgr} @n;
my $new = $3 =~ s/^\s+|\s+$//mgr;
my $new2 = $new =~ s/\+/ /mgr;
exists $hw_f{$new2} ? "$1entry://$new2$4$5" : (exists $hw_f{$m[0]} ? "$1entry://$m[0]$4$5" : "$1$2$3$4$5") #eg;
%hw_f是匹配所有条件的地方。
它给出了以下错误:
在连接 (.) 或字符串中使用未初始化的值 $1
我需要在替换中基于$3 获得一个新值,继续使用该新值。我怎么能这样做?
【问题讨论】:
-
每次调用正则表达式引擎都会破坏捕获变量的先前状态。您需要在拆分之前将 $3 复制到一个新变量中。
-
你的意思是 5 美元吗?我分了 5 美元。 @DavidO
-
我试过
dclone把$3放到一个数组里,也没用。 -
你没有说你想做什么。如果您尝试返回原始
$3,则需要对其进行备份,因为后者的匹配和替换会清除或替换其值。s#...# my $three = $3; ...; $three 3#eg。但这不可能是您想要做的,因为您从不使用@m或$new2。那你想做什么?也许你应该返回$new2而不是$3??? -
您的第一个替换
s#...##捕获到 3 美元。您的拆分再次调用了正则表达式引擎(这就是/.../的用途)。所以拆分 clobbers 3 美元。但即使它没有(它确实如此),你的下一行,map{s,...,,}确实会减少 3 美元。你不需要 dclone 它。您只需要在分割线之前使用赋值运算符 (=) 将 $3 复制到其他变量,然后稍后使用它而不是依赖 $3。