Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex \x不在替换内部工作_Regex_Perl_Unicode - Fatal编程技术网

Regex \x不在替换内部工作

Regex \x不在替换内部工作,regex,perl,unicode,Regex,Perl,Unicode,我正在尝试解码unicode字符。因此,我只是在正则表达式替换中尝试了十六进制转义序列\x{} use LWP::Simple; my $k = get("url"); my ($kv) =map{/js_call\(\\"(.+?)\\"\)/} $k; #now $kv data is https://someurl/call.pl?id=15967737\u0026locale=en-GB\u0026mkhun=ccce $kv=~s/\\u(.{4})/"\x{$1}"/eg;

我正在尝试解码unicode字符。因此,我只是在正则表达式替换中尝试了十六进制转义序列
\x{}

use LWP::Simple;
my $k = get("url");

my ($kv) =map{/js_call\(\\"(.+?)\\"\)/} $k;

#now $kv data is https://someurl/call.pl?id=15967737\u0026locale=en-GB\u0026mkhun=ccce

$kv=~s/\\u(.{4})/"\x{$1}"/eg;
我正在尝试替换全unicode字符

我的预期产出是:

https://someurl/call.pl?id=15967737&locale=en-GB&mkhun=ccce
下面提到的
print
语句给出了预期的输出。然而,正则表达式似乎不能正常工作

print "\x{0026}";

如果启用
use warnings
,您将看到
$1
在反向引用被插值之前被逐字计算

$kv =~ s/\\u(.{4})/ sprintf("\"\\x{%s}\"", $1) /eeg;

有点像作品,但它丑陋得可怕。我一直在尝试简化它,但我尝试过的各种想法总是让我回到“非法十六进制数字“$”被忽略”的警告。

可能这也是您可以尝试的:

$kv=~s/\\u([:xdigit:]{1,5})/chr(eval(“0x$1”)/egis


谢谢。

s/\\u(.{4})/“\x{$1}”/e
的问题是反斜杠转义
\x{$1}
是在编译时计算的,它给出一个空字节:

$ perl -E 'printf "%vX\n", "\x{$1}"'
0
如果我们对
x
s/\\u(.{4})/“\\x{$1}”/ge
)前面的反斜杠进行转义,我们将得到一个带有文字转义序列的字符串,但仍然不是所需的unicode字符:

use feature qw(say);
$kv = '\u0026';
$kv =~ s/\\u(.{4})/"\\x{$1}"/ge;
say $kv; 
现在输出为:

\x{0026}
只需稍加修改,就可以生成
“\x{0026}”
,这是可以编译和执行以生成所需值的Perl代码。为此,您需要参与
eval(EXPR)

这可以缩短为

$kv =~ s/\\u(.{4})/ qq{"\\x{$1}"} /gee;
然而,更好的解决方案是使用以下方法:

$kv =~ s/\\u(.{4})/chr hex $1/ge;
$kv =~ s/\\u(.{4})/chr hex $1/ge;