$search_32bit = '80 71 C3 (\S{8}) (77 55 66)';
$search_32bit =~ s/\s //g;
$replace_32bit = 'A0 B0 C0 \1\2';
$replace_32bit =~ s/\s //g;
$search_32bit = '60 71 C3 (\S{10}) (CC 55 66)';
$search_32bit =~ s/\s //g;
$replace_32bit = 'D0 E0 F0 \1\2';
$replace_32bit =~ s/\s //g;
@repls_32 = (
[ $search_32bit, $replace_32bit],
[ $search_32bit_2, $replace_32bit_2],
);
foreach my $r (@repls_32) {
$s_sign = eval "\$hex =~ s/$r->[0]/$r->[1]/i";
}
我的問題是,如何保存搜索部分($r->[0])和替換部分($r->[1])的匹配部分?
謝謝。
uj5u.com熱心網友回復:
哦,對不起,剛剛找到解決方案,我把這個簡單的問題復雜化了。
只需在替換前用$hex_tmp 保存$hex,當$s_sign = 1 時,則$hex_tmp 為搜索部分,替換后的$hex 為被替換部分。
$search_32bit = '80 71 C3 (\S{8}) (77 55 66)';
$search_32bit =~ s/\s //g;
$replace_32bit = 'A0 B0 C0 \1\2';
$replace_32bit =~ s/\s //g;
$search_32bit_2 = '60 71 C3 (\S{10}) (CC 55 66)';
$search_32bit_2 =~ s/\s //g;
$replace_32bit_2 = 'D0 E0 F0 \1\2';
$replace_32bit_2 =~ s/\s //g;
@repls_32 = (
[ $search_32bit, $replace_32bit],
[ $search_32bit_2, $replace_32bit_2],
);
$hex = "8071C312345678775566";
foreach my $r (@repls_32) {
$hex_tmp = $hex;
$s_sign = eval "\$hex =~ s/$r->[0]/$r->[1]/i";
if ($s_sign) {
print "search part: $hex_tmp\n";
print "replaced part: $hex\n";
exit();
}
}
下面是我想要的輸出。
搜索部分:8071C312345678775566 替換部分:A0B0C012345678775566
uj5u.com熱心網友回復:
參考https://www.perlmonks.org/?node_id=1006930,另一個用 /ee 替換 'eval' 的 sulution。
$search_32bit = '80 71 C3 (\S{8}) (77 55 66)';
$search_32bit =~ s/\s //g;
$replace_32bit = 'A0 B0 C0 .$1.$2';
$replace_32bit =~ s/\s //g;
$search_32bit_2 = '60 71 C3 (\S{10}) (CC 55 66)';
$search_32bit_2 =~ s/\s //g;
$replace_32bit_2 = 'D0 E0 F0 .$1.$2';
$replace_32bit_2 =~ s/\s //g;
@repls_32 = (
[ $search_32bit, $replace_32bit],
[ $search_32bit_2, $replace_32bit_2],
);
$hex = "8071C312345678775566";
foreach my $r (@repls_32) {
$hex_tmp = $hex;
$s_sign = $hex =~ s/$r->[0]/$r->[1]/iee;
if ($s_sign) {
print "search part: $hex_tmp\n";
print "replaced part: $hex\n";
exit();
}
}
下面得到相同的輸出。
搜索部分:8071C312345678775566 替換部分:A0B0C012345678775566
uj5u.com熱心網友回復:
如果需要捕獲整個字串的匹配搜索部分,可以參考下面的代碼。
$search_32bit = '(80 71 C3 (\S{8}) (77 55 66))';
$search_32bit =~ s/\s //g;
$replace_32bit = 'A0 B0 C0 \2\3';
$replace_32bit =~ s/\s //g;
$search_32bit_2 = '60 71 C3 (\S{10}) (CC 55 66)';
$search_32bit_2 =~ s/\s //g;
$replace_32bit_2 = 'D0 E0 F0 .$1.$2';
$replace_32bit_2 =~ s/\s //g;
@repls_32 = (
[ $search_32bit, $replace_32bit],
[ $search_32bit_2, $replace_32bit_2],
);
$hex = "9090908071C312345678775566";
foreach my $r (@repls_32) {
$hex_tmp = $hex;
$s_sign = eval "\$hex =~ s/$r->[0]/$r->[1]/i;return \$1";
if ($s_sign) {
print "search part: $s_sign\n";
print "original: $hex_tmp\n";
print "replaced part: $hex\n";
exit();
}
}
請在下面的正則運算式中使用“return $1”,不要使用 $&,因為后者是全域變數,會遇到一些復雜情況的問題。
$s_sign = eval "\$hex =~ s/$r->[0]/$r->[1]/i;return \$1";
因此,
$search_32bit = '80 71 C3 (\S{8}) (77 55 66)';
=>
$search_32bit = '(80 71 C3 (\S{8}) (77 55 66))';
請注意添加的最外面的括號。
希望這對尋求類似問題解決方案的人有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/316797.html
