在我的Perl程序中,我正在获取加密的电子邮件,对其进行解码并进一步处理。我遇到问题,因为数据包含:%localappdata%
我无法直接使用qw()函数,因为正在从邮箱中提取数据。有没有办法应用这个功能?
我如何使用它,以便特殊字符不被识别为特殊字符而是普通字符?或者有正则表达式吗?
更新:我正在做的处理是将数据转换为HTML并使用Curl将其发送到REST API。
更新2:以下是代码:https://gist.github.com/8cd801fedeb90a5ca7fc
$description
包含%localappdata%
答案 0 :(得分:2)
好的,谢谢你展示完整的代码。问题是您将$body
的内容作为URL参数传递,因此HTTP protocl需要转义各种字符才能正确传递它们。
您可以使用URI::Escape
模块实现此目标,您将不再需要在第125行和# clean the body
后面的行进行清理。
此程序使用包含您已识别的所有问题字符的字符串,并使用该模块进行翻译。如果您在uri_escape
的内容上使用$body
,然后将其附加到Curl的网址,那么一切都应该有用。
use strict;
use warnings;
use URI::Escape 'uri_escape';
my $body = '%localappdata% â & ';
print uri_escape $body;
<强>输出强>
%25localappdata%25%20%E2%20%26%20
<强>更新强>
对于一般操作URL,最好使用URI
module,它将在URL的路径和查询部分为您执行所有必要的转义。
下面的程序显示了如何使用此方法生成您需要传递给$curl->setopt
的网址
use strict;
use warnings;
use URI;
my $url = URI->new('https://this/is/the/url');
my $body = '%localappdata% â & ';
$url->query_form(body => $body);
print $url, "\n";
<强>输出强>
https://this/is/the/url?body=%25localappdata%25+%E2+%26+
(请注意,对于空格字符,此方法使用+
代替%20
。在网址的查询部分中都可以接受。)
可以通过编写
直接将此URL设置为Curl选项$curl->setopt(CURLOPT_URL, $url);
答案 1 :(得分:-1)
要逃避某些事情,请使用正则表达式来处理数据:
my $email = "To: foo@example.com\n\nHi Rad,\nI just opened %appdata% and...";
$email =~ s/ % /\\%/xg; # escapes all percent signs
这会将%appdata%
替换为\%appdata\%
。我不知道您的API如何喜欢其输入数据,请相应调整。
s/%/%%/g
做一个快乐的事情,然后开心:)